Skip to content

Commit

Permalink
Add configuration for thresholds and runtime
Browse files Browse the repository at this point in the history
Add PR changes
  • Loading branch information
susilnem committed Jul 4, 2024
1 parent 4bb5049 commit f93510a
Show file tree
Hide file tree
Showing 26 changed files with 133 additions and 80 deletions.
6 changes: 5 additions & 1 deletion api/management/commands/cron_job_monitor.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from django.conf import settings
from django.core.management.base import BaseCommand

from main.sentry import SentryMonitor
from main.sentry import SentryMonitor, SentryMonitorConfig
from main.settings import SENTRY_DSN

logger = logging.getLogger(__name__)
Expand Down Expand Up @@ -48,6 +48,10 @@ def handle(self, *args, **options):
"type": "crontab",
"value": str(schedule),
},
"tz": settings.TIME_ZONE,
"checkin_margin": SentryMonitorConfig.get_checkin_margin(cronjob),
"failure_issue_threshold": SentryMonitorConfig.get_failure_issue_threshold(cronjob),
"recovery_threshold": SentryMonitorConfig.get_recovery_threshold(cronjob),
},
"environment": settings.GO_ENVIRONMENT,
"status": "ok",
Expand Down
2 changes: 1 addition & 1 deletion api/management/commands/index_and_notify.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,6 @@
}


@monitor(monitor_slug=SentryMonitor.INDEX_AND_NOTIFY)
class Command(BaseCommand):
help = "Index and send notifications about new/changed records"

Expand Down Expand Up @@ -920,6 +919,7 @@ def check_ingest_issues(self, having_ingest_issue):
+ ", notification sent to IM team"
)

@monitor(monitor_slug=SentryMonitor.INDEX_AND_NOTIFY)
def handle(self, *args, **options):
if self.is_digest_mode():
time_diff = self.diff_1_week() # in digest mode (once a week, for new_entities only) we use a bigger interval
Expand Down
2 changes: 1 addition & 1 deletion api/management/commands/ingest_appeals.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@
GEC_CODES = GECCode.objects.select_related("country").all()


@monitor(monitor_slug=SentryMonitor.INGEST_APPEALS)
class Command(BaseCommand):
help = "Add new entries from Access database file"

Expand Down Expand Up @@ -292,6 +291,7 @@ def parse_appeal_record(self, r, **options):

return fields

@monitor(monitor_slug=SentryMonitor.INGEST_APPEALS)
def handle(self, *args, **options):
logger.info("Starting appeals ingest")
start_appeals_count = Appeal.objects.all().count()
Expand Down
2 changes: 1 addition & 1 deletion api/management/commands/ingest_disaster_law.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@
from main.sentry import SentryMonitor


@monitor(monitor_slug=SentryMonitor.INGEST_DISASTER_LAW)
class Command(BaseCommand):
help = "Add ICRC data"

@monitor(monitor_slug=SentryMonitor.INGEST_DISASTER_LAW)
def handle(self, *args, **kwargs):
logger.info("Starting Disaster Law data")
home_url = "https://disasterlaw.ifrc.org/"
Expand Down
2 changes: 1 addition & 1 deletion api/management/commands/ingest_icrc.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@
from main.sentry import SentryMonitor


@monitor(monitor_slug=SentryMonitor.INGEST_ICRC)
class Command(BaseCommand):
help = "Add ICRC data"

@monitor(monitor_slug=SentryMonitor.INGEST_ICRC)
def handle(self, *args, **kwargs):
logger.info("Strating ICRC data ingest")
HEADERS = {
Expand Down
2 changes: 1 addition & 1 deletion api/management/commands/ingest_ns_capacity.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@
from main.sentry import SentryMonitor


@monitor(monitor_slug=SentryMonitor.INGEST_NS_CAPACITY)
class Command(BaseCommand):
help = "Add ns contact details"

@monitor(monitor_slug=SentryMonitor.INGEST_NS_CAPACITY)
def handle(self, *args, **kwargs):
logger.info("Starting NS Contacts")

Expand Down
4 changes: 3 additions & 1 deletion api/management/commands/ingest_ns_contact.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import xmltodict
from django.conf import settings
from django.core.management.base import BaseCommand
from django.db import transaction
from requests.auth import HTTPBasicAuth
from sentry_sdk.crons import monitor

Expand All @@ -13,10 +14,11 @@
from main.sentry import SentryMonitor


@monitor(monitor_slug=SentryMonitor.INGEST_NS_CONTACT)
class Command(BaseCommand):
help = "Add ns contact details"

@monitor(monitor_slug=SentryMonitor.INGEST_NS_CONTACT)
@transaction.atomic
def handle(self, *args, **kwargs):
logger.info("Starting NS Contacts")
url = "https://go-api.ifrc.org/"
Expand Down
12 changes: 8 additions & 4 deletions api/management/commands/ingest_ns_directory.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import xmltodict
from django.conf import settings
from django.core.management.base import BaseCommand
from django.db import transaction
from requests.auth import HTTPBasicAuth
from sentry_sdk.crons import monitor

Expand All @@ -10,10 +11,11 @@
from main.sentry import SentryMonitor


@monitor(monitor_slug=SentryMonitor.INGEST_NS_DIRECTORY)
class Command(BaseCommand):
help = "Add ns contact details"

@monitor(monitor_slug=SentryMonitor.INGEST_NS_DIRECTORY)
@transaction.atomic
def handle(self, *args, **kwargs):
def postprocessor(path, key, value):
if key == "@i:nil":
Expand Down Expand Up @@ -41,6 +43,7 @@ def postprocessor(path, key, value):
raise Exception("Error querying NationalSocietiesContacts")

added = 0
created_country_directory_ids = []
dict_data = xmltodict.parse(response.content, postprocessor=postprocessor)
for data in dict_data["ArrayOfNationalSocietiesContacts"]["NationalSocietiesContacts"]:
country_name = data["CON_country"] if isinstance(data["CON_country"], str) else None
Expand All @@ -62,14 +65,15 @@ def postprocessor(path, key, value):
"position": data["CON_title"],
"country": country,
}
existing_qs = CountryDirectory.objects.filter(
country_directory, _ = CountryDirectory.objects.get_or_create(
country=country,
first_name__iexact=data["first_name"],
last_name__iexact=data["last_name"],
position__iexact=data["position"],
)
if not existing_qs.exists():
CountryDirectory.objects.create(**data)
created_country_directory_ids.append(country_directory.pk)
# NOTE: Deleting the country directory which are not available in the source
CountryDirectory.objects.exclude(id__in=created_country_directory_ids).delete()
text_to_log = "%s Ns Directory added" % added
logger.info(text_to_log)
body = {"name": "ingest_ns_directory", "message": text_to_log, "num_result": added, "status": CronJobStatus.SUCCESSFUL}
Expand Down
18 changes: 8 additions & 10 deletions api/management/commands/ingest_ns_document.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,19 @@
import requests
from django.conf import settings
from django.core.management.base import BaseCommand
from django.db import transaction
from sentry_sdk.crons import monitor

from api.logger import logger
from api.models import Country, CountryKeyDocument, CronJob, CronJobStatus
from main.sentry import SentryMonitor


@monitor(monitor_slug=SentryMonitor.INGEST_NS_DOCUMENT)
class Command(BaseCommand):
help = "Add ns documents"

@monitor(monitor_slug=SentryMonitor.INGEST_NS_DOCUMENT)
@transaction.atomic
def handle(self, *args, **kwargs):
logger.info("Starting NS Key Documents")

Expand Down Expand Up @@ -98,12 +100,13 @@ def fetch_all_country_documents(self, api_key, country_table):

def save_documents_to_database(self, result):
added = 0
created_country_key_document_ids = []
for document in result:
country = Country.objects.filter(fdrs=document["country_code"]).first()
if country is None:
continue

country_key_document, created = CountryKeyDocument.objects.get_or_create(
country_key_document, _ = CountryKeyDocument.objects.get_or_create(
country=country,
url=document["url"],
defaults={
Expand All @@ -115,15 +118,10 @@ def save_documents_to_database(self, result):
"year_text": document["year_text"],
},
)
if not created:
country_key_document.name = document["name"]
country_key_document.thumbnail = document["thumbnail"]
country_key_document.document_type = document["document_type"]
country_key_document.year = document["year"]
country_key_document.end_year = document["end_year"]
country_key_document.year_text = document["year_text"]
country_key_document.save(update_fields=["name", "thumbnail", "document_type", "year", "end_year", "year_text"])
created_country_key_document_ids.append(country_key_document.pk)
added += 1
# NOTE: Deleting the CountryKeyDocument that are not in the source
CountryKeyDocument.objects.exclude(id__in=created_country_key_document_ids).delete()
return added

def sync_cron_success(self, text_to_log, added):
Expand Down
16 changes: 8 additions & 8 deletions api/management/commands/ingest_ns_initiatives.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,19 @@
import requests
from django.conf import settings
from django.core.management.base import BaseCommand
from django.db import transaction
from sentry_sdk.crons import monitor

from api.logger import logger
from api.models import Country, CronJob, CronJobStatus, NSDInitiatives
from main.sentry import SentryMonitor


@monitor(monitor_slug=SentryMonitor.INGEST_NS_INITIATIVES)
class Command(BaseCommand):
help = "Add ns initiatives"

@monitor(monitor_slug=SentryMonitor.INGEST_NS_INITIATIVES)
@transaction.atomic
def handle(self, *args, **kwargs):
logger.info("Starting NS Inititatives")
api_key = settings.NS_INITIATIVES_API_KEY
Expand Down Expand Up @@ -43,11 +45,12 @@ def handle(self, *args, **kwargs):
],
)
funding_data = funding_data.replace({np.nan: None})
created_ns_initiatives_pk = []
for data in funding_data.values.tolist():
# TODO: Filter not by society name
country = Country.objects.filter(society_name__iexact=data[0]).first()
if country:
nsd_initiatives, created = NSDInitiatives.objects.get_or_create(
nsd_initiatives, _ = NSDInitiatives.objects.get_or_create(
country=country,
year=data[1],
fund_type=data[2],
Expand All @@ -58,13 +61,10 @@ def handle(self, *args, **kwargs):
"funding_period": data[6],
},
)
if not created:
nsd_initiatives.title = data[3]
nsd_initiatives.allocation = data[5]
nsd_initiatives.funding_period = data[6]
nsd_initiatives.categories = data[4]
nsd_initiatives.save(update_fields=["title", "allocation", "funding_period", "categories"])
created_ns_initiatives_pk.append(nsd_initiatives.pk)
added += 1
# NOTE: Delete the NSDInitiatives that are not in the source
NSDInitiatives.objects.exclude(id__in=created_ns_initiatives_pk).delete()

text_to_log = "%s Ns initiatives added" % added
logger.info(text_to_log)
Expand Down
2 changes: 1 addition & 1 deletion api/management/commands/revoke_staff_status.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
# from registrations.views import is_valid_domain


@monitor(monitor_slug=SentryMonitor.REVOKE_STAFF_STATUS)
class Command(BaseCommand):
help = 'Update staff status in auth_user table according to "Read only" group'

Expand Down Expand Up @@ -53,6 +52,7 @@ def get_ifrc_domain_users(self):
#
# return editors

@monitor(monitor_slug=SentryMonitor.REVOKE_STAFF_STATUS)
def handle(self, *args, **options):
logger.info("Moving Read only users out of staff status...")

Expand Down
2 changes: 1 addition & 1 deletion api/management/commands/sync_appealdocs.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
FEDNET_SOURCE = "https://go-api.ifrc.org/Api/FedNetAppeals?Hidden=false&BaseAppealnumber="


@monitor(monitor_slug=SentryMonitor.SYNC_APPEALDOCS)
class Command(BaseCommand):
help = "Ingest existing appeal documents"

Expand All @@ -37,6 +36,7 @@ def parse_date(self, date_string):
timeformat = "%Y-%m-%dT%H:%M:%S"
return datetime.strptime(date_string[:18], timeformat).replace(tzinfo=timezone.utc)

@monitor(monitor_slug=SentryMonitor.SYNC_APPEALDOCS)
def handle(self, *args, **options):
logger.info("Starting appeal document ingest")

Expand Down
2 changes: 1 addition & 1 deletion api/management/commands/sync_molnix.py
Original file line number Diff line number Diff line change
Expand Up @@ -519,10 +519,10 @@ def sync_open_positions(molnix_positions, molnix_api, countries):
return messages, warnings, successful_creates


@monitor(monitor_slug=SentryMonitor.SYNC_MOLNIX)
class Command(BaseCommand):
help = "Sync data from Molnix API to GO db"

@monitor(monitor_slug=SentryMonitor.SYNC_MOLNIX)
@transaction.atomic
def handle(self, *args, **options):
logger.info("Starting Sync Molnix job")
Expand Down
2 changes: 1 addition & 1 deletion api/management/commands/user_registration_reminder.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,13 @@
from registrations.models import Pending


@monitor(monitor_slug=SentryMonitor.USER_REGISTRATION_REMINDER)
class Command(BaseCommand):
help = "Send reminder about the pending registrations"

def diff_3_day(self):
return datetime.utcnow().replace(tzinfo=timezone.utc) - timedelta(days=3)

@monitor(monitor_slug=SentryMonitor.USER_REGISTRATION_REMINDER)
def handle(self, *args, **options):
region_ids = Region.objects.all().values_list("id", flat=True)
time_diff_3_day = self.diff_3_day()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,6 @@ def _get_filename_from_headers(resp):
return resp.headers.get("Content-Type"), _get_filename_from_headers(resp)


@monitor(monitor_slug=SentryMonitor.INGEST_COUNTRY_PLAN_FILE)
class Command(BaseCommand):
@staticmethod
def load_file_to_country_plan(country_plan: CountryPlan, url: str, filename: str, field_name: str):
Expand Down Expand Up @@ -121,6 +120,7 @@ def load(self, url: str, file_field: str, field_inserted_date_field: str):
except Exception:
logger.error("Could not update countries plan", exc_info=True)

@monitor(monitor_slug=SentryMonitor.INGEST_COUNTRY_PLAN_FILE)
def handle(self, **_):
# Public
self.stdout.write("Fetching data for country plans:: PUBLIC")
Expand Down
16 changes: 12 additions & 4 deletions databank/management/commands/FDRS_INCOME.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@

import requests
from django.conf import settings
from django.core.management import call_command
from django.core.management.base import BaseCommand
from django.db import transaction
from sentry_sdk.crons import monitor

from databank.models import CountryOverview, FDRSIncome, FDRSIndicator
Expand All @@ -11,11 +13,15 @@
logger = logging.getLogger(__name__)


@monitor(monitor_slug=SentryMonitor.FDRS_INCOME)
class Command(BaseCommand):
help = "Import FDRS income data"

@monitor(monitor_slug=SentryMonitor.FDRS_INCOME)
@transaction.atomic
def handle(self, *args, **kwargs):
# NOTE: Loading FDRS indicators
call_command("loaddata", "fdrs_indicator.json", verbosity=2)

fdrs_indicator_enum_data = {
"h_gov_CHF": "Home Government",
"f_gov_CHF": "Foreign Government",
Expand Down Expand Up @@ -45,6 +51,7 @@ def handle(self, *args, **kwargs):
return
fdrs_entities.raise_for_status()
fdrs_entities = fdrs_entities.json()
created_fdrs_income_ids = []
for d in fdrs_entities["data"]:
indicator = next(iter(d.values()))
fdrs_indicator = map_indicators[fdrs_indicator_enum_data[indicator]]
Expand All @@ -56,7 +63,8 @@ def handle(self, *args, **kwargs):
overview=overview,
indicator=fdrs_indicator,
date=str(income["year"]) + "-01-01",
defaults={"value": income_value},
)
fdrs_income.value = income_value
# TODO: Use bulk
fdrs_income.save(update_fields=("value",))
created_fdrs_income_ids.append(fdrs_income.pk)
# NOTE: Delete the FDRSIncome that are not in the source
FDRSIncome.objects.filter(overview=overview).exclude(id__in=created_fdrs_income_ids).delete()
Loading

0 comments on commit f93510a

Please sign in to comment.