Monit: use o conteúdo MATCH em “verificar arquivo…” se corresponder a “xxx”

Monit: use o conteúdo MATCH em “verificar arquivo…” se corresponder a “xxx”

Eu fiz essa pergunta há cerca de uma semana no StackOverflow, mas ainda não há resposta, provavelmente não é possível, mas não sei onde procurar essa resposta, espero que alguém possa ajudar aqui.

Estou usando o monit para verificar se há erros nos logs e, em seguida, enviar esses alertas para um sistema de monitoramento chamado DataDog...

Tudo parece funcionar conforme o esperado, mas agora preciso entender o que está causando o alarme.

Usando uma regra muito simples consigo capturar a linha no log que provoca esse erro e executar o script específico para alertar; até aqui tudo bem:

montirc file:

check file testmonit with path /var/log/testmonit.log
      if MATCH "(ERROR.*)" then
         exec "/usr/bin/python /opt/scripts/bin/dd_notify.py test-error"

Essa configuração faz o que eu quero, na verdade dá o alarme que eu queria

Mas agora preciso saber “O que causou este alarme”; então, por exemplo, se esta linha aparecer no log:

ERROR failure to complete process due lock file....

Nos logs do monit, posso ver:

[UTC Mar  6 11:59:08] error    : 'testmonit' content match [ERROR failure to complete process due lock file....]
[UTC Mar  6 11:59:08] info     : 'testmonit' exec: /usr/bin/python

O que é perfeito... o que eu quero é capturar isto:

[ERROR failure to complete process due lock file....]

Para enviar esta string para o meu sistema de monitoramento (DataDog) não consigo encontrar nenhuma documentação que realmente me permita usar oCORRESPONDER contentou grupos (que posso ver que são suportados pela regex MATCH)

Resumindo:

Existe alguma variável monit (como $DESCRIPTION para mail) que se refere à MATCHlinha que aciona a regra?

(Eu tentei $DESCRIPTION, $HOST...etc, mas parece funcionar apenas para email)

Procurei várias vezes no Google (e também aqui), mas não consigo encontrar a resposta...

Por favor, se você acha que isso foi abordado antes, sinta-se à vontade para me indicar a direção certa.

Uma atualização:

Desculpe, esqueci de dizer que estou executando isso:

 Ubuntu 16.04 LTS and 
 Ubuntu 12

A versão Monit é:

Este é o Monit versão 5.25.1 Construído com SSL, com IPv6, com compressão, com pam e com arquivos grandes Copyright (C) 2001-2017 Tildeslash Ltd. Todos os direitos reservados.

Seguindo a recomendação do DevOps, atualizei a versão do monit.

E tentei usarMONIT_DESCRIPTIONou$MONIT_DESCRIPTIONsem arquivo de regra de sucesso é assim:

check file pd-error with path /var/log/testmonit.log if CONTENT = "ERROR" then exec "/usr/bin/python /opt/scripts/bin/dd_notify.py pd_error " $MONIT_DESCRIPTION

O que eu quero é passar o conteúdo que foi correspondido como um argumento adicional para o programa dd_notify.py;

mas o que recebo é (que é o resultado da execução dd_notify.py):

{ "ALARM": { "pd_error": 67 }, "MESSAGES": { "pd_error": "$MONIT_DESCRIPTION" } }

o que eu quero é$MONIT_DESCRIPTIONconteúdo que é na verdade:

[UTC Apr 3 21:53:22] debug : 'pd-error' Pattern 'ERROR' match on content line [Apr 3 21:52:30 ams01 MainProcess[1376]: cel ery.worker.job ERROR Task tasks.telemetry.gather_and_send_telemetry_info[f090d579-9ec2-40e5-9fb2-91436eb4fc8a] fail]

Mas não estou tendo sorte no momento... o que estou perdendo aqui?

Obrigado.

Responder1

Apenas tentei com Monit 5.23.0 e há uma variável de ambiente para isso.

MONIT_DESCRIPTION=content match:
[ERROR failure to complete process due lock file....]
[ERROR failure to complete process due lock file....]

Monit produzirá todas as ocorrências do conteúdo correspondente

Além disso, a sintaxe foi alterada no Monit 5.16.0, mas a antiga ainda está funcional. O changelog está disponível aqui:https://mmonit.com/monit/changes/

Esteja ciente também de que você pode alterar os vários limites do Monithttps://mmonit.com/monit/documentation/monit.html#LIMITS

Se você deseja atualizar, o Monit fornece binários genéricos pré-compilados que estou usando para ter versões mais recentes que as dos repositórios do Ubuntu.

Responder2

Obrigado ao DevOps por me colocar no caminho certo para resolver esse problema. Finalmente consegui o que queria fazer e também posso explicar (pelo meu entendimento) por que não estava funcionando para mim antes

O problema é que, como diz o DevOps, há uma variável MONIT_DESCRIPTION que na verdade possui a string de erro, mas essa variável só é "acessível" no ambiente bash.

Como eu estava fazendo:

check file pd-error with path /var/log/testmonit.log
if CONTENT = "ERROR" then exec "/usr/bin/python /opt/scripts/bin/dd_notify.py pd_error "

e de dd_notify.py eu estava tentando fazer:

erro = os.environ['MONIT_DESCRIPTION']

mas sempre recebi 'key_error' porque 'MONIT_DESCRIPTION' não era acessível pelo python

então tentei chamar meu programa usando um wrapper bash como:

check file pd-error with path /var/log/testmonit.log
  if CONTENT = "ERROR" then exec "/bin/bash /opt/scripts/bin/wrapper.sh"

e no código 'wrapper.sh' eu tenho:

/usr/bin/python /opt/scripts/bin/dd_notify.py pd_error

e então consegui o que procurava:

{
  "ALARM": {
    "pd_error": 294
  }, 
  "MESSAGES": {
    "pd_error": "content match:\nMay 16 18:07:08 ams01 MainProcess[1358]: celery.worker.job ERROR Task fds.realtime.tasks.telemetry.gather_and_send_telemetry_info[abe35540-55ef-40db-984a-
12287f5648ab] raised unexpected: ConnectionError()#012Traceback (most recent call last):#012  File \"/usr/lib/python2.7/dist-packages/celery/app/trace.py\", line 240, in trace_task#012   
 R = retval = fun(*args, **kwargs)#012  File \"/usr/lib/python2.7/dist-packages/celery/app/trace.py\", line 438, in __protected_call__#012    return self.run(*args, **kwargs)\n...\n"
  }
}

O que é ótimo!

Então, basicamente, não consegui acessar a variável de ambiente monit do Python... então coloquei um script bash e consegui...!

Obrigado!

informação relacionada