mirror of
https://github.com/GSA/notifications-api.git
synced 2025-12-22 08:21:13 -05:00
make a decorator that pings cronitor before and after each task run. Designed for use with nightly tasks, so we have visibility if they fail. We have a bunch of cronitor monitors set up - 5 character keys that go into a URL that we then make a GET to with a self-explanatory url path (run/fail/complete). the cronitor URLs are defined in the credentials repo as a dictionary of celery task names to URL slugs. If the name passed in to the decorator isn't in that dict, it won't run. to use it, all you need to do is call `@cronitor(my_task_name)` instead of `@notify_celery.task`, and make sure that the task name and the matching slug are included in the credentials repo (or locally, json dumped and stored in the CRONITOR_KEYS environment variable)
61 lines
2.2 KiB
Python
61 lines
2.2 KiB
Python
from datetime import datetime, timedelta
|
|
|
|
from flask import current_app
|
|
from notifications_utils.statsd_decorators import statsd
|
|
|
|
from app import notify_celery
|
|
from app.cronitor import cronitor
|
|
from app.dao.fact_billing_dao import (
|
|
fetch_billing_data_for_day,
|
|
update_fact_billing
|
|
)
|
|
from app.dao.fact_notification_status_dao import fetch_notification_status_for_day, update_fact_notification_status
|
|
|
|
|
|
@notify_celery.task(name="create-nightly-billing")
|
|
@cronitor("create-nightly-billing")
|
|
@statsd(namespace="tasks")
|
|
def create_nightly_billing(day_start=None):
|
|
# day_start is a datetime.date() object. e.g.
|
|
# up to 10 days of data counting back from day_start is consolidated
|
|
if day_start is None:
|
|
day_start = datetime.today() - timedelta(days=1)
|
|
else:
|
|
# When calling the task its a string in the format of "YYYY-MM-DD"
|
|
day_start = datetime.strptime(day_start, "%Y-%m-%d")
|
|
for i in range(0, 10):
|
|
process_day = day_start - timedelta(days=i)
|
|
|
|
transit_data = fetch_billing_data_for_day(process_day=process_day)
|
|
|
|
for data in transit_data:
|
|
update_fact_billing(data, process_day)
|
|
|
|
current_app.logger.info(
|
|
"create-nightly-billing task complete. {} rows updated for day: {}".format(len(transit_data), process_day))
|
|
|
|
|
|
@notify_celery.task(name="create-nightly-notification-status")
|
|
@cronitor("create-nightly-notification-status")
|
|
@statsd(namespace="tasks")
|
|
def create_nightly_notification_status(day_start=None):
|
|
# day_start is a datetime.date() object. e.g.
|
|
# 4 days of data counting back from day_start is consolidated
|
|
if day_start is None:
|
|
day_start = datetime.today() - timedelta(days=1)
|
|
else:
|
|
# When calling the task its a string in the format of "YYYY-MM-DD"
|
|
day_start = datetime.strptime(day_start, "%Y-%m-%d")
|
|
for i in range(0, 4):
|
|
process_day = day_start - timedelta(days=i)
|
|
|
|
transit_data = fetch_notification_status_for_day(process_day=process_day)
|
|
|
|
update_fact_notification_status(transit_data, process_day)
|
|
|
|
current_app.logger.info(
|
|
"create-nightly-notification-status task: {} rows updated for day: {}".format(
|
|
len(transit_data), process_day
|
|
)
|
|
)
|