74 votes

Comment surveiller delayed_job avec monit

Y a-t-il des exemples sur le web sur la façon de surveiller delayed_job avec Monit?

Tout ce que je trouve utilise God, mais je refuse d'utiliser God car les processus de longue durée en Ruby sont généralement médiocres. (Le post le plus récent dans la liste de diffusion de God? God Memory Usage Grows Steadily.)

Mise à jour: delayed_job est maintenant livré avec une configuration monit d'exemple basée sur cette question.

97voto

Luke Francl Points 11707

Voici comment j'ai réussi à faire fonctionner cela.

  1. Utilisez le collectiveidea fork de delayed_job en plus d'être activement maintenu, cette version a un beau démon script/delayed_job que vous pouvez utiliser avec monit. Railscasts a un bon épisode à propos de cette version de delayed_job (version ASCIICasts). Ce script a également quelques autres fonctionnalités intéressantes, comme la possibilité de faire fonctionner plusieurs travailleurs. Je ne couvre pas cela ici.

  2. Installez monit. J'ai installé à partir de la source car la version d'Ubuntu est tellement obsolète. J'ai suivi ces instructions pour obtenir les scripts init.d standard fournis avec les paquets Ubuntu. J'ai également dû configurer avec ./configure --sysconfdir=/etc/monit pour que le répertoire standard de configuration d'Ubuntu soit pris en compte.

  3. Écrivez un script monit. Voici ce que j'ai imaginé :

    check process delayed_job with pidfile /var/www/app/shared/pids/delayed_job.pid
    start program = "/var/www/app/current/script/delayed_job -e production start"
    stop program = "/var/www/app/current/script/delayed_job -e production stop"

    Je stocke ceci dans mon système de contrôle de source et j'indique à monit de regarder avec include /var/www/app/current/config/monit dans le fichier /etc/monit/monitrc.

  4. Configurez monit. Ces instructions sont pleines de publicités mais sinon OK.

  5. Écrivez une tâche pour capistrano pour arrêter et démarrer. monit start delayed_job et monit stop delayed_job sont ce que vous devez exécuter. Je recharge également monit lors du déploiement pour prendre en compte tout changement de fichier de configuration.

Problèmes auxquels j'ai été confrontés :

  1. La gem daemons doit être installée pour que script/delayed_job fonctionne.
  2. Vous devez passer l'environnement Rails à script/delayed_job avec -e production (par exemple). Cela est documenté dans le fichier README mais pas dans la sortie d'aide du script.
  3. J'utilise la Ruby Enterprise Edition, donc j'ai dû faire en sorte que monit démarre avec cette copie de Ruby. En raison de la façon dont sudo gère le PATH dans Ubuntu, j'ai fini par créer des liens symboliques vers /usr/bin/ruby et /usr/bin/gem pour les versions REE.

Lors du débogage de monit, j'ai constaté qu'il est utile d'arrêter la version init.d et de l'exécuter à partir de la ligne de commande, pour pouvoir voir les messages d'erreur. Sinon, il est très difficile de comprendre pourquoi les choses ne fonctionnent pas correctement.

sudo /etc/init.d/monit stop
sudo monit start delayed_job

J'espère que cela aidera la prochaine personne qui souhaite surveiller delayed_job avec monit.

8voto

mrchucho Points 106

Pour ce que ça vaut, vous pouvez toujours utiliser /usr/bin/env avec monit pour configurer l'environnement. C'est particulièrement important dans la version actuelle de delayed_job, 1.8.4, où l'option d'environnement (-e) est obsolète.

check process delayed_job with pidfile /var/app/shared/pids/delayed_job.pid
start program = "/usr/bin/env RAILS_ENV=production /var/app/current/script/delayed_job start"
stop  program = "/usr/bin/env RAILS_ENV=production /var/app/current/script/delayed_job stop"

Dans certains cas, vous devrez peut-être également définir le PATH avec env.

5voto

Jason Green Points 41

J'ai trouvé qu'il était plus facile de créer un script init pour delayed job. Il est disponible ici: http://gist.github.com/408929 ou ci-dessous:

#! /bin/sh
set\_path="cd /home/rails/evatool\_staging/current"

case "$1" in
  start)
        echo -n "Démarrage de delayed\_job: "
                su - rails -c "$set\_path; RAILS\_ENV=staging script/delayed\_job start" >> /var/log/delayed\_job.log 2>&1
        echo "fait."
        ;;
  stop)
        echo -n "Arrêt de sphinx: "
                su - rails -c "$set\_path; RAILS\_ENV=staging script/delayed\_job stop" >> /var/log/delayed\_job.log 2>&1
        echo "fait."
        ;;
      \*)
            N=/etc/init.d/delayed\_job\_staging
            echo "Utilisation: $N {start|stop}" >&2
            exit 1
            ;;
    esac

    exit 0

Ensuite, assurez-vous que monit est configuré pour démarrer / redémarrer l'application dans votre fichier monitrc:

check process delayed\_job with pidfile "/path\_to\_my\_rails\_app/shared/pids/delayed\_job.pid"
start program = "/etc/init.d/delayed\_job start"
stop program = "/etc/init.d/delayed\_job stop"

et ça fonctionne très bien!

5voto

Laurynas Points 1292

J'ai trouvé une bonne façon de démarrer delayed_job avec cron au démarrage. J'utilise whenever pour contrôler cron.

Mon schedule.rb :

\# type de travail personnalisé pour contrôler delayed\_job
job\_type :delayed\_job, 'cd :path;RAILS\_ENV=:environment script/delayed\_job ":task"'

# démarrage de delayed job au démarrage
every :reboot do
  delayed\_job "start"

Remarque : J'ai mis à niveau la version de la gemme whenever à 0.5.0 pour pouvoir utiliser job_type

2voto

obvio171 Points 2162

Je ne sais pas avec Monit, mais j'ai écrit quelques plugins Munin pour surveiller la taille de la file d'attente et le temps moyen d'exécution des tâches. Les modifications que j'ai apportées à delayed_job dans ce correctif pourraient également vous faciliter l'écriture de plugins Monit si vous décidez de continuer avec cela.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X