|
@@ -2,25 +2,61 @@ from carrot.connection import DjangoAMQPConnection
|
|
from celery.messaging import StatsPublisher, StatsConsumer
|
|
from celery.messaging import StatsPublisher, StatsConsumer
|
|
from django.conf import settings
|
|
from django.conf import settings
|
|
|
|
|
|
-def send_statistics(stat_name, **data):
|
|
|
|
- send_stats = getattr(settings, "CELERY_STATISTICS", False)
|
|
|
|
- if send_stats:
|
|
|
|
|
|
+
|
|
|
|
+class Statistics(object):
|
|
|
|
+ type = None
|
|
|
|
+
|
|
|
|
+ def __init__(self, **kwargs):
|
|
|
|
+ self.enabled = getattr(settings, "CELERY_STATISTICS", False))
|
|
|
|
+ if not self.type:
|
|
|
|
+ raise NotImplementedError(
|
|
|
|
+ "Statistic classes must define their type.")
|
|
|
|
+
|
|
|
|
+ def publish(self, **data):
|
|
|
|
+ if not self.enabled:
|
|
|
|
+ return
|
|
connection = DjangoAMQPConnection()
|
|
connection = DjangoAMQPConnection()
|
|
publisher = StatsPublisher(connection=connection)
|
|
publisher = StatsPublisher(connection=connection)
|
|
- publisher.send({"stat_name": stat_name, "data": data})
|
|
|
|
|
|
+ publisher.send({"type": self.type, "data": data})
|
|
publisher.close()
|
|
publisher.close()
|
|
connection.close()
|
|
connection.close()
|
|
|
|
|
|
|
|
+ @classmethod
|
|
|
|
+ def start(cls, *args, **kwargs):
|
|
|
|
+ stat = cls()
|
|
|
|
+ stat.run()
|
|
|
|
+ return stat
|
|
|
|
|
|
-class Statistics(object):
|
|
|
|
|
|
+ def run(self, *args, **kwargs):
|
|
|
|
+ if stat.enabled:
|
|
|
|
+ stat.on_start(*args, **kwargs)
|
|
|
|
|
|
- def task_time_running(self, task_id, task_name, args, kwargs, nsecs):
|
|
|
|
- send_statistics("task_time_running",
|
|
|
|
- task_id=task_id,
|
|
|
|
- task_name=task_name,
|
|
|
|
- args=args,
|
|
|
|
- kwargs=kwargs,
|
|
|
|
- nsecs=nsecs)
|
|
|
|
|
|
+ def stop(self, *args, **kwargs):
|
|
|
|
+ if self.enabled:
|
|
|
|
+ self.on_finish(*args, **kwargs)
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+class TimerStats(Statistics):
|
|
|
|
+ time_start = None
|
|
|
|
+
|
|
|
|
+ def on_start(self, task_id, task_name, args, kwargs):
|
|
|
|
+ self.task_id = task_id
|
|
|
|
+ self.task_name = task_name
|
|
|
|
+ self.args = self.args
|
|
|
|
+ self.kwargs = self.kwargs
|
|
|
|
+ self.time_start = time.time()
|
|
|
|
+
|
|
|
|
+ def on_finish(self):
|
|
|
|
+ nsecs = time.time() - self.time_start
|
|
|
|
+ self.publish(task_id=task_id,
|
|
|
|
+ task_name=task_name,
|
|
|
|
+ args=args,
|
|
|
|
+ kwargs=kwargs,
|
|
|
|
+ nsecs=nsecs)
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+class TaskTimerStats(TimerStats):
|
|
|
|
+ type = "task_time_running"
|
|
|
|
|
|
|
|
|
|
class StatsCollector(object):
|
|
class StatsCollector(object):
|
|
@@ -33,7 +69,7 @@ class StatsCollector(object):
|
|
total = 0
|
|
total = 0
|
|
for message in it:
|
|
for message in it:
|
|
data = message.decode()
|
|
data = message.decode()
|
|
- stat_name = data.get("stat_name")
|
|
|
|
|
|
+ stat_name = data.get("type")
|
|
if stat_name in self.allowed_stats:
|
|
if stat_name in self.allowed_stats:
|
|
handler = getattr(self, stat_name)
|
|
handler = getattr(self, stat_name)
|
|
handler(**data["data"])
|
|
handler(**data["data"])
|