Técnicas para monitorar tarefas cron?

22

Existem boas técnicas para monitorar tarefas cron em um cluster?

Estamos começando a usar o cron para iniciar tarefas em intervalos diários. Algumas idéias para verificar as informações:

  1. Adicione manipulação de aplicativo especial que registra informações em algum local "com reconhecimento de rede", como um banco de dados
  2. Construa um sistema de arquivo de log que transfira o cron cron periodicamente para um ponto central para processamento / consulta (junto com outros possíveis arquivos de log)

Gostaria de saber se as pessoas tiveram sucesso em fazer as coisas separadamente para o cron em relação a outras, ou se as tarefas foram integradas completamente a uma abordagem diferente. Estou inclinado para a segunda posição, mas gostaria de saber o que pessoas mais experientes podem experimentar.

Tristan Juricek
fonte
é sua preocupação que cronjobs não estejam em execução? ou você está pedindo para monitorar o 'status' da execução do trabalho?
31510 ericslaw
1
Principalmente, que eles não falharam. Mas alguns trabalhos demoram muito tempo, e podemos querer pegar informações como "opa, isso está demorando muito".
Tristan Juricek

Respostas:

16

Além das outras respostas:

  • deixe o trabalho gravar um registro de data e hora em um arquivo quando terminar, juntamente com o valor de retorno do trabalho real
  • propagar o valor de retorno de volta ao chamador original

Usamos o primeiro para facilitar a verificação do Nagios ( Icinga ), por exemplo, se o último carimbo de data / hora escrito for mais antigo que n horas (mais qualquer lógica que você precisar) - sabemos que algo deu errado.

Server Horror
fonte
Embora eu goste das respostas de todos - aprendi muito - esqueci completamente o monitoramento do Nagios. Isso é ótimo para as tarefas de longa duração, com o que realmente me preocupa. Obrigado.
Tristan Juricek
16

Minha abordagem comum é assim:

  • Não produza nenhum stdout quando o aplicativo agendado for concluído com êxito.
  • Não canalize nenhuma saída para / dev / null.
  • Produza uma saída stderr significativa quando algo der errado.
  • Defina um endereço $ MAILTO no crontab para enviar essa saída de erro para a equipe necessária.
Dan Carley
fonte
E se alguém realmente tem a tubulação de saída para /dev/null, pelo menos add || echo "service $service is FUBAR"à linha de comando ...
Hubert Kario
4

Além do acima:

  • Chame "logger" junto com a gravação para stderr quando algo der errado. Configure o syslog para encaminhar adicionalmente para um host central, também conhecido como "loghost". (O criador de logs usará o recurso "user.notice" por padrão, mas você poderá alterá-lo.)
kubanczyk
fonte
1
Eu gosto dessa idéia .... embora o crond já faça logon no syslog (talvez via config param), portanto o uso do logger não é estritamente necessário para essa abordagem.
ericslaw
4

Existem algumas técnicas que você pode usar para monitorar cronjobs.

Para receber alertas de falhas no cronjob:

  • Use a função MAILTO = cron padrão. Se um cronjob produzir saída em STDERR, ele será enviado para o endereço que você escolher.
  • Para rastrear e lidar com os cron mails, você pode direcioná-los para um sistema de ticket.

O sistema que você propõe registrar informações em um local "com reconhecimento de rede" soa como syslog . O syslog fornece um método simples para criar logs, normalmente gerencia arquivos como / var / log / messages. Você pode fazer personalizações básicas, como escolher quais arquivos recebem as mensagens de log.

O syslog pode ser iniciado no modo de reconhecimento de rede. Por exemplo, você pode configurá-lo para que um escravo possa registrar em um mestre:

[root@slave ~]#  echo "hello world from slave" | logger -p local1.info

[root@master ~]# tail /var/log/myapp
Jun 29 13:07:01 192.168.1.2 logger: hello world from slave

Para uma distribuição baseada no Red Hat, um exemplo de configuração é o seguinte:

[root@slave ~]# cat /etc/syslog.conf | grep local1
local1.*                                                @192.168.1.3

[root@master ~]# cat /etc/sysconfig/syslog | grep SYSLOGD_OPTIONS
SYSLOGD_OPTIONS="-m 0 -r"

[root@master ~]# cat /etc/syslog.conf | grep local
local1.* /var/log/myapp

(A primeira linha de configuração redireciona os avisos do log local1. * Para @ 192.168.1.3 ("master"). O segundo sinalizador -r da segunda linha SYSLOGD_OPIONS ativa o suporte à rede. Por fim, a terceira linha de configuração direciona as mensagens local1. * Recebidas no "master" em um arquivo).

A abordagem syslog é melhor apenas para registrar erros / informações. Os arquivos de log têm menos visibilidade do que os emails, portanto você provavelmente não verá os logs, a menos que algo dê errado.

Se você optar por seguir a rota de estilo syslog, considere também syslog-ng: http://freshmeat.net/projects/syslog-ng/ .

Obviamente, você pode obter o melhor das duas técnicas usando as duas. Por exemplo, syslog'ing tanto falhas quanto sucessos, e apenas enviando por falhas.

Tommeh
fonte
Obrigado pela resposta -> Eu sou um programador, o que me torna um novato em sysadmin. Eu nem sabia dos recursos de rede do syslog.
Tristan Juricek
3

Publiquei uma resposta semelhante a uma pergunta no StackOverflow ( /programming/21025495/system-for-monitoring-cron-jobs-and-automated-tasks )

O Cronitor ( https://cronitor.io ) foi uma ferramenta que eu construí exatamente para esse fim. Basicamente, tudo se resume a ser um farol de rastreamento que usa solicitações http como pings.

No entanto, uma das necessidades mencionadas pelo OP em seu comentário precisa ser informada quando um trabalho começa a demorar muito para ser executado.

Eu tinha essa mesma necessidade e descobri que ferramentas semelhantes não suportavam facilmente esse tipo de monitoramento. O Cronitor resolve isso, permitindo que você ative opcionalmente um evento inicial e um final para manter o controle da duração.

O rastreamento de duração era essencial para mim porque eu tinha um cronograma agendado a cada hora, mas com o tempo começou a demorar mais de uma hora para ser executado. Espero que você ache útil!

August Flanagan
fonte
2

Ele ainda está em desenvolvimento bastante pesado no momento em que escrevi isso, mas eu encorajo a dar uma olhada em https://github.com/jamesrwhite/minicron . Foi desenvolvido para resolver os problemas que você descreve. Com uma pequena modificação no comando que você executa, ele pode gravar o status de saída e saída dos trabalhos e envia esses dados de volta para um servidor central em tempo real e pode enviar alertas por email, SMS e PagerDuty quando um trabalho falha (status de saída> 0) ou não executa quando deveria.

Disclaimer: Eu sou o desenvolvedor trabalhando nisso.

James White
fonte
0

Parece um caso de uso clássico para AlertGrid .

Não requer instalação, tudo o que você precisa fazer para obter benefícios desta ferramenta é:

  1. envie Signal para AlertGrid sempre que seu trabalho cron terminar seu trabalho (isso pode ser feito por uma API extremamente simples, o sinal é apenas uma solicitação HTTP). Você também pode enviar alguns parâmetros como execution_time!
  2. configure regras de notificação como a seguir:

se my_job não responder em X minutos (horas no seu caso) -> envie SMS para o administrador

ou

if Execution_time> 60 segundos -> enviar email para as pessoas interessadas

Na verdade isso é tudo. Você pode gerenciar regras de notificação usando um bom editor visual. Você não precisa modificar o código fonte ou alguns arquivos de configuração, se algo mudar. É uma solução centralizada, para que você possa se beneficiar do gerenciamento de regras em um único local.

Espero que isso ajude alguém. Existe uma conta gratuita fornecida para que você possa testar e usar o AlertGrid se estiver interessado. Eu sou um dos membros da equipe AlertGrid - fique à vontade para perguntar se você tem alguma dúvida.

dzida
fonte
0

eu uso http://cronrat.com basta anexar && curl "... seu cronrat url" aos seus trabalhos cron. A melhor característica que eu gosto é que você não precisa configurar nada depois de criar a conta inicial. Cada alerta está em funcionamento no minuto em que você o usa. portanto, posso usar qualquer ferramenta automatizada para iniciar meus trabalhos que ainda não existem, ao contrário de alguns serviços em que preciso configurar o trabalho primeiro.

Andrew Yasinsky
fonte
Fiquei impressionado ao ler sobre o cronrat - simples e gratuito. Buuuuut Não consigo descobrir como me inscrever. Este serviço está morto?
rinogo 23/08
0

Eu criei o Power Cron depois dessas necessidades precisas. Eu precisava de uma visão centralizada sobre meus trabalhos cron e uma noção de dependência entre os trabalhos de diferentes membros do cluster.

Eu também precisava de mais informações do que as que encontrei nos logs e adicionei perfil de trabalho.

Filho da noite
fonte
0

Criamos o PushMon, http://www.pushmon.com , para isso. Digamos que seu trabalho diário seja executado às 3 da manhã e normalmente termine às 4 da manhã. Você pode configurar uma programação PushMon de "até 04:00 todos os dias". Ou uma programação um pouco mais avançada, como "às 04:00 todos os dias em 1 hora". Tudo o que você precisa fazer é "executar ping" na URL do PushMon toda vez que seu trabalho for executado, e ele alertará sobre a falta de pings. Se você tiver certeza de que ocorreu um erro, como quando você pega uma exceção que não pode tratar, pode usar o recurso de alerta sob demanda.

Bienvenido David
fonte
0

Healthchecks ( https://github.com/healthchecks/healthchecks/ ) é um serviço e painel criado exatamente para monitorar tarefas cron. Ele está sendo usado na produção, é mantido e aceita contribuições de código.

Funciona da mesma forma que o Cronitor, o Snitch do Dead Man e os amigos: você configura seu trabalho cron para fazer uma solicitação HTTP / HTTPS para um URL exclusivo e especial antes de terminar. Os Healthchecks recebem e registram esses pings. Ele verifica constantemente se os pings chegam nos intervalos esperados. Quando detecta um problema, envia uma notificação. Os métodos de notificação suportados são email, webhooks, Slack, Telegram, Discord, SMS, Pushover, Pusbullet, PagerDuty, PagerTree, HipChat, VictorOps, OpsGenie.

Você pode configurar tudo isso e hospedar-se, mas, como em qualquer serviço da web, é necessário algum esforço para configurar o nome de domínio, o certificado, configurar o proxy reverso HTTP, configurar backups de bancos de dados etc. Uma maneira razoavelmente fácil de obter Em execução é usar esta versão adaptada do Heroku: https://github.com/iphoting/healthchecks . Conheço pessoas que executam esse projeto e o usam para monitorar centenas de serviços.

Isenção de responsabilidade: sou o autor e também executo o Healthchecks como um serviço hospedado em https://healthchecks.io

Pēteris Caune
fonte