1
私はuse signalsにタスク実行時間を記録することができますが、キューにも時間を記録したいと思います。これは信号で可能ですか?私はどの信号を使うべきですか?セロリタスクのキューにログを記録する
私はuse signalsにタスク実行時間を記録することができますが、キューにも時間を記録したいと思います。これは信号で可能ですか?私はどの信号を使うべきですか?セロリタスクのキューにログを記録する
タスクイベントを使用して、タスクのイベントに基づいてアクションを監視し、トリガすることができます。タスクの送信、タスクの受信、タスクの開始、タスクの成功、タスクの失敗、タスクの拒否、タスクの取り消し、タスクの再試行は、セールスでサポートされるタスクイベント です。詳細はlinkを参照してください。タスクがキュー内で待機している時間を記録するには、それぞれのタスク・イベント・ハンドラーを使用して、作成された(またはジョブ・キューに追加された)時間とタスクの開始時間を取得します。それらの違いは、キュー内のジョブの待機時間を示します。以下は、Pythonコードの実装方法のサンプルです。
from celery import Celery
redis = Redis(host='workerdb', port=6379, db=0)
taskId_startTime = {}
taskId_createTime = {}
def my_monitor():
app = Celery('vwadaptor', broker='redis://workerdb:6379/0',backend='redis://workerdb:6379/0')
state = app.events.State()
def announce_task_received(event):
state.event(event)
task = state.tasks.get(event['uuid'])
taskId_createTime[task.uuid] = task.timestamp
def announce_task_started(event):
state.event(event)
task = state.tasks.get(event['uuid'])
taskId_startTime[task.uuid] = task.timestamp
def announce_task_succeeded(event):
state.event(event)
task = state.tasks.get(event['uuid'])
print "wait time in queue", taskId_startTime[task.uuid] - taskId_createTime[task.uuid]
with app.connection() as connection:
recv = app.events.Receiver(connection, handlers={
'task-received': announce_task_received,
'task-started': announce_task_started,
'task-succeeded': announce_task_succeeded,
})
recv.capture(limit=None, timeout=None, wakeup=True)
my_monitor()