Monitor your celery application from within AWS CloudWatch!
The following events are tallied per task:
- CeleryEventSent
- CeleryEventStarted
- CeleryEventSucceeded
- CeleryEventFailed
You can then see how many tasks/day, tasks/week etc are being completed.
Also, we record the total waiting/running per task:
- CeleryNumWaiting
- CeleryNumRunning
Also, statistics on task duration are sent in the metrics:
- CeleryWaitingTime
- CeleryProcessingTime
These metrics are sent with all supported stats (No. Events, Sum, Max, Min), allowing you to gain insight into your task processing and match requests and capacity.
Set up an IAM Role for your instance.
It must include a policy to perform 'PutMetricData', eg:
{ "Version": "2000-01-01", "Statement": [ { "Effect": "Allow", "Action": [ "cloudwatch:PutMetricData" ], "Resource": [ "*" ] } ] }(Note: Alternatively, you can set up a
Userwith the same policy and provide access details that way)Install via
python-pip(and upgrade pip & boto)sudo apt-get install -y python3-pip python3 -m pip install --user -U pip mkdir -p /opt/ccwatch virtualenv --python python3 /opt/ccwatch/env /opt/ccwatch/env/bin/pip install celery-cloudwatch sudo chown -R nobody:nogroup /opt/ccwatch
Create your own
boto.cfgat/etc/boto.cfg-[Credentials] # if not using an IAM Role - provide aws key/secret aws_access_key_id = xxx aws_secret_access_key = yyy [Boto] cloudwatch_region_name = my-region cloudwatch_region_endpoint = monitoring.my-region.amazonaws.comCreate your own config file in
/etc/ccwatch.yamlccwatch: broker: null camera: celery_cloudwatch.CloudWatchCamera verbose: no camera: frequency: 60.0 verbose: no cloudwatch-camera: dryrun: no namespace: celery tasks: - myapp.mytasks.taskname - myapp.mytasks.anothertask - myapp.mytasks.thirdtask - name: myapp.secondarytasks dimensions: task: myapp.secondarytasks customDim: value - name: myapp.tertiarytasks dimensions: task: myapp.tertiarytasks customDim: valueAnd
/etc/ccwatch.logging.conf[loggers] keys=root,ccwatch [handlers] keys=consoleHandler [formatters] keys=simpleFormatter [logger_root] level=WARN handlers=consoleHandler [logger_ccwatch] level=DEBUG handlers=consoleHandler qualname=ccwatch propagate=0 [handler_consoleHandler] class=StreamHandler level=DEBUG formatter=simpleFormatter args=(sys.stdout,) [formatter_simpleFormatter] format=%(asctime)s - %(name)s - %(levelname)s - %(message)s datefmt=Install systemd configuration
Create a file
/etc/systemd/system/ccwatch.service-[Unit] Description="Celery CloudWatch" [Service] Restart=always RestartSec=15 User=nobody Group=nobody Environment=AWS_DEFAULT_REGION=my-region ExecStart=/opt/ccwatch/env/bin/ccwatch [Install] WantedBy=multi-user.targetthen-
systemctl daemon-reload systemctl enable ccwatch.service systemctl start ccwatch.serviceStart Celery your celery workers with the
-E(orCELERY_SEND_EVENTS=1andCELERY_TRACK_STARTED=1) options, and, start celery clients withCELERY_SEND_TASK_SENT_EVENT=1All done! head over to your CloudWatch monitoring page to see the results!