私のDjangoプロジェクトでは、CeleryとRabbitmqを使用してバックグラウンドでタスクを実行しています。セロリビートスケジューラを使用して定期的なタスクを実行しています。プログラムでセロリビートが稼働しているかどうかを確認するにはどうすればよいですか?
定期的にPingURLへのHTTPリクエストに対するタスクを作成します。 URLが時間どおりにpingされない場合、URLモニターはアラートを送信します。
import requests
from yourapp.celery_config import app
@app.task
def ping():
print '[healthcheck] pinging alive status...'
# healthchecks.io works for me:
requests.post("https://hchk.io/6466681c-7708-4423-adf0-XXXXXXXXX")
この セロリ定期タスク は毎分実行されるようにスケジュールされています。pingにヒットしない場合、ビートサービスはダウンしています*。モニターはメール(またはWebhook)を起動します zapier it モバイルプッシュ通知も取得します)。
celery -A yourapp.celery_config beat -S djcelery.schedulers.DatabaseScheduler
*または圧倒される場合は、タスクの飽和状態を追跡する必要があります。これはCeleryの悪夢であり、適切に検出して対処する必要があります。最適化が必要なタスクのブロックで作業者が忙しいときに頻繁に発生します。
私は最近、同じ問題に対して、@ panchicoreが提案したものと同様のソリューションを使用しました。
私の職場での問題は、セロリビートを処理する重要なシステムでしたが、RabbitMQの停止、またはサーバーとRabbitMQサーバー間の接続の問題が原因で、再起動しない限り、セロリビートがcronのトリガーを停止しました。
便利なツールがなかったため、HTTP経由で送信されたkeep alive
呼び出しを監視するために、同じ目的でstatsdを使用しました。 statsdサーバーには毎分インクリメントされるカウンターがあり(セロリタスクによって実行されます)、次に、グラファナメトリックに電子メールとスラックチャネルアラートを設定します。 (no updates for 10 minutes == outage)
これは純粋にプログラム的なアプローチではないことは理解していますが、本番レベルの監視/アラートは、個別の監視エンティティなしでは完了しません。
プログラミングの部分は可能な限り単純です。毎分実行される小さなセロリタスク。
@periodic_task(run_every=timedelta(minutes=1))
def update_keep_alive(self):
logger.info("running keep alive task")
statsd.incr(statsd_tags.CELERY_BEAT_ALIVE)
このアプローチで私が直面した問題は、UDPを介したSTATSDパケット損失が原因です。したがって、可能であれば、この目的のためにSTATSDへのTCP接続を使用してください。
celery doc のチュートリアルに従ってセロリをデーモン化した場合は、実行されているかどうかを確認することができます。
Sudo /etc/init.d/celeryd status
Sudo /etc/init.d/celerybeat status
このようなコマンドの戻り値は、pythonモジュールで使用できます。
あなたはおそらく調べることができます スーパーバイザー 。 celerybeat conf を提供し、ビートに関連するすべてを/var/log/celery/beat.log
に記録します。
これを行う別の方法は、 Flower を使用することです。サーバー用に設定できます(パスワードが保護されていることを確認してください)。GUIでキューに入れられているタスクとキューに入れられている時刻を確認しやすくなり、ビートが正常に実行されているかどうかを確認できます。
バックグラウンドタスクとしてセロリワーカー+セロリビートを実行するために、upstartやsupervisonなどを使用していますか?本番環境では、そのうちの1つを使用して、セロリワーカーとセロリビートをバックグラウンドで実行する必要があります。
セロリのビートをチェックする最も簡単な方法は実行中です:ps aux | grep -i '[c]elerybeat'
。 pid
のテキスト文字列を取得すると、実行されます。また、このコマンドの出力をよりきれいにすることができます:ps aux | grep -i '[c]elerybeat' | awk '{print $2}'
。番号を取得した場合(機能している)、何も取得しなかった場合は機能していません。
また、セロリ労働者のステータスを確認することもできます:celery -A projectname status
。
高度なセロリ監視に興味がある場合は、公式ドキュメントを読むことができます 監視 ガイド。
次のコマンドでスケジューラが実行されているかどうかを確認できます
python manage.py celery worker --beat