"""Datadog Connector.""" import time from contextlib import contextmanager from datadog import api, initialize from grass import config @contextmanager def datadog_connection(api_key=None, app_key=None): """Context manager for datadog connection objects. Yields: datadog.api: connection to datadog api """ if not api_key: api_key = config.DD_API_KEY if not app_key: app_key = config.DD_APP_KEY initialize(api_key=api_key, app_key=app_key) yield api def key(metric_key: str): """Create a namespaced key. Args: metric_key (str): the metric key. Returns: str: the key. """ return f'ows.grass.{metric_key}' def send_timer(metric, delta_ms, logger=None): """Send a timer (latency value in ms) to Datadog.""" if not config.SEND_METRICS_TO_DD_ENABLED: return assert metric.startswith('ows.grass.') now = int(time.time()) with datadog_connection() as datadog: try: datadog.Metric.send( metric=metric, points=[(now, delta_ms)], type='gauge', tags=[ f'environment:{config.environment}', f'service_name:{config.SERVICE_NAME}', 'unit:ms', ], ) except Exception as e: if logger: logger.error(f'Datadog metric send failure. {e}') def publish_metric(metric: str, count: int = 1, logger=None): """Publish a metric to DataDog.""" if not config.SEND_METRICS_TO_DD_ENABLED: return assert metric.startswith('ows.grass.') now = int(time.time()) with datadog_connection() as datadog: try: datadog.Metric.send( metric=metric, points=[(now, count)], type='count', tags=[ f'environment:{config.environment}', f'service_name:{config.SERVICE_NAME}', ], ) except Exception as e: if logger: logger.warning(f'Datadog metric send failure. {e}')