9
9
import celery .events
10
10
11
11
from .metrics import TASKS , TASKS_RUNTIME , LATENCY , WORKERS
12
+ from .state import CeleryState
12
13
13
14
class TaskThread (threading .Thread ):
14
15
"""
@@ -20,7 +21,7 @@ def __init__(self, app, namespace, max_tasks_in_memory, *args, **kwargs):
20
21
self ._app = app
21
22
self ._namespace = namespace
22
23
self .log = logging .getLogger ('task-thread' )
23
- self ._state = self . _app . events . State (max_tasks_in_memory = max_tasks_in_memory )
24
+ self ._state = CeleryState (max_tasks_in_memory = max_tasks_in_memory )
24
25
self ._known_states = set ()
25
26
self ._known_states_names = set ()
26
27
self ._tasks_started = dict ()
@@ -32,13 +33,12 @@ def run(self): # pragma: no cover
32
33
def _process_event (self , evt ):
33
34
# Events might come in in parallel. Celery already has a lock
34
35
# that deals with this exact situation so we'll use that for now.
35
- with self ._state ._mutex :
36
- if celery .events .group_from (evt ['type' ]) == 'task' :
37
- evt_state = evt ['type' ][5 :]
38
- state = celery .events .state .TASK_EVENT_TO_STATE [evt_state ]
39
- if state == celery .states .STARTED :
40
- self ._observe_latency (evt )
41
- self ._collect_tasks (evt , state )
36
+ if celery .events .group_from (evt ['type' ]) == 'task' :
37
+ evt_state = evt ['type' ][5 :]
38
+ state = celery .events .state .TASK_EVENT_TO_STATE [evt_state ]
39
+ if state == celery .states .STARTED :
40
+ self ._observe_latency (evt )
41
+ self ._collect_tasks (evt , state )
42
42
43
43
def _observe_latency (self , evt ):
44
44
try :
@@ -54,31 +54,12 @@ def _observe_latency(self, evt):
54
54
evt ['local_received' ] - prev_evt .local_received )
55
55
56
56
def _collect_tasks (self , evt , state ):
57
- if state in celery .states .READY_STATES :
58
- self ._incr_ready_task (evt , state )
59
- else :
60
- self ._incr_unready_task (evt , state )
57
+ (name , state , runtime ) = self ._state .collect (evt , state )
58
+ if runtime is not None :
59
+ TASKS_RUNTIME .labels (namespace = self ._namespace , name = name ).observe (runtime )
60
+
61
+ TASKS .labels (namespace = self ._namespace , name = name , state = state ).inc ()
61
62
62
- def _incr_ready_task (self , evt , state ):
63
- try :
64
- # remove event from list of in-progress tasks
65
- name = self ._state .tasks .pop (evt ['uuid' ]).name or ''
66
- except (KeyError , AttributeError ): # pragma: no cover
67
- name = ''
68
- finally :
69
- TASKS .labels (namespace = self ._namespace , name = name , state = state ).inc ()
70
- if 'runtime' in evt :
71
- TASKS_RUNTIME .labels (namespace = self ._namespace , name = name ) \
72
- .observe (evt ['runtime' ])
73
-
74
- def _incr_unready_task (self , evt , state ):
75
- self ._state ._event (evt )
76
- try :
77
- name = self ._state .tasks [evt ['uuid' ]].name or ''
78
- except (KeyError , AttributeError ): # pragma: no cover
79
- name = ''
80
- finally :
81
- TASKS .labels (namespace = self ._namespace , name = name , state = state ).inc ()
82
63
83
64
def _monitor (self ): # pragma: no cover
84
65
while True :
0 commit comments