From 5513a8d77fcedcb81ed61f77b0041e74c4e91f0f Mon Sep 17 00:00:00 2001 From: "sentry-junior[bot]" <264270552+sentry-junior[bot]@users.noreply.github.com> Date: Fri, 23 Oct 2026 14:19:12 +0000 Subject: [PATCH] fix(fetcher): Handle missing unit in Datadog query responses Datadog's v1 query API now omits series[].unit for metrics without unit metadata, which made warn_multiple_units raise KeyError and fail every run. Refs PRODENG-2990 Co-Authored-By: Bojan Oro --- py/tests/test_fetcher.py | 19 +++++++++++++++++++ py/usageaccountant/datadog_fetcher.py | 5 +++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/py/tests/test_fetcher.py b/py/tests/test_fetcher.py index 73564c3..6d949ed 100644 --- a/py/tests/test_fetcher.py +++ b/py/tests/test_fetcher.py @@ -131,6 +131,25 @@ def test_warn_multiple_units(self) -> None: ) assert len(cm.output) == 1 + def test_warn_multiple_units_no_unit(self) -> None: + """ + Datadog omits `unit` for metrics without unit metadata. + """ + series_list = self.good_response["series"] + series_list[0].pop("unit") # type: ignore + with self.assertNoLogs("fetcher"): + ddf.warn_multiple_units( + cast(Sequence[ddf.DatadogResponseSeries], series_list) + ) + + def test_warn_multiple_units_single_unit(self) -> None: + series_list = self.good_response["series"] + series_list[0]["unit"] = [{"plural": "bytes"}] # type: ignore + with self.assertNoLogs("fetcher"): + ddf.warn_multiple_units( + cast(Sequence[ddf.DatadogResponseSeries], series_list) + ) + def test_warn_multiple_units_empty_series(self) -> None: """ Test that warn_multiple_units handles empty series list gracefully. diff --git a/py/usageaccountant/datadog_fetcher.py b/py/usageaccountant/datadog_fetcher.py index 6400f64..4d2a932 100644 --- a/py/usageaccountant/datadog_fetcher.py +++ b/py/usageaccountant/datadog_fetcher.py @@ -174,8 +174,9 @@ def warn_multiple_units(series_list: Sequence[DatadogResponseSeries]) -> None: if not series_list: return - unit_list = series_list[0]["unit"] - if unit_list and unit_list[1] is not None: + # Datadog omits `unit` entirely for metrics without unit metadata. + unit_list = series_list[0].get("unit") + if unit_list and len(unit_list) > 1 and unit_list[1] is not None: logger.warning(f"Received multiple units from Datadog: {unit_list}.")