from datetime import datetime, timedelta from typing import Any, Iterable from urllib.parse import urlencode from src import config __all__ = ["get_traces_url", "get_logs_url"] def _get_dates( start: datetime | None = None, end: datetime | None = None, delta: timedelta = timedelta(days=14) ) -> tuple[int, int]: if end is None: end = datetime.now() if start is None: start = end - delta if end <= start: raise ValueError("End date must be greater than start date") return int(start.timestamp() * 1000), int(end.timestamp() * 1000) def get_traces_url( query: str, start: datetime | None = None, end: datetime | None = None, extra: dict[str, Any] | None = None, cols: Iterable[str] = ("service", "resource_name", "@duration", "@feed_id") ) -> str: start, end = _get_dates(start, end) if extra is None: extra = {} encoded = urlencode( dict( { "query": query, "start": start, "end": end, "paused": "false", "sort": "time", "view": "query", "cols": ",".join(cols) }, **extra, ) ) return f"{config.DATADOG_TRACES_URL}?{encoded}" def get_logs_url( query: str, start: datetime | None = None, end: datetime | None = None, extra: dict[str, Any] | None = None, cols: Iterable[str] = ("service",) ) -> str: start, end = _get_dates(start, end, delta=timedelta(days=15)) if extra is None: extra = {} encoded = urlencode( dict( { "query": query, "from_ts": start, "to_ts": end, "live": "true", "agg_m": "count", "agg_m_source": "base", "agg_t": "count", "refresh_mode": "sliding", "storage": "hot", "stream_sort": "desc", "viz": "stream", "fromUser": "true", "messageDisplay": "inline", "cols": ",".join(cols) }, **extra, ) ) return f"{config.DATADOG_LOGS_URL}?{encoded}"