From 479c47959cb55c957e822031404497a2972f7104 Mon Sep 17 00:00:00 2001 From: Charlie Zhang Date: Mon, 15 Jun 2026 14:21:34 -0400 Subject: [PATCH 1/3] Add AdditionalProperties access example for GetUsageSummary Demonstrates how to call the v2 GetUsageSummaryAvailableFields endpoint to obtain the canonical field lists, then walk all three response levels of the v1 GetUsageSummary response (UsageSummaryResponse, UsageSummaryDate, UsageSummaryDateOrg) reading every non-None value via .get(). Co-Authored-By: Claude Sonnet 4.6 --- .../GetUsageSummary_additional_properties.py | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 examples/v1/usage-metering/GetUsageSummary_additional_properties.py diff --git a/examples/v1/usage-metering/GetUsageSummary_additional_properties.py b/examples/v1/usage-metering/GetUsageSummary_additional_properties.py new file mode 100644 index 0000000000..5676a9f218 --- /dev/null +++ b/examples/v1/usage-metering/GetUsageSummary_additional_properties.py @@ -0,0 +1,51 @@ +""" +Get usage across your account and read all fields from additionalProperties returns "OK" response +""" + +from datadog_api_client import ApiClient, Configuration +from datadog_api_client.v1.api.usage_metering_api import UsageMeteringApi +from datadog_api_client.v2.api.usage_metering_api import UsageMeteringApi as UsageMeteringApiV2 +from datetime import datetime +from dateutil.tz import tzutc + +configuration = Configuration() +with ApiClient(configuration) as api_client: + # Step 1: fetch the canonical field lists from the v2 discovery endpoint. + v2_instance = UsageMeteringApiV2(api_client) + fields_response = v2_instance.get_usage_summary_available_fields() + attrs = fields_response.data.attributes + response_fields = attrs.response_fields # Layer 1 keys + date_fields = attrs.date_fields # Layer 2 keys + date_org_fields = attrs.date_org_fields # Layer 3 keys + + # Step 2: call the v1 summary endpoint with org details included. + v1_instance = UsageMeteringApi(api_client) + resp = v1_instance.get_usage_summary( + start_month=datetime(2021, 11, 11, 11, 11, 11, 111000, tzinfo=tzutc()), + include_org_details=True, + ) + + # Layer 1 – top-level UsageSummaryResponse additionalProperties + print("=== Layer 1: UsageSummaryResponse ===") + for field in response_fields: + value = resp.get(field) + if value is not None: + print(f" {field}: {value}") + + # Layer 2 – per-date UsageSummaryDate additionalProperties + print("=== Layer 2: UsageSummaryDate (usage[]) ===") + for date_entry in resp.get("usage") or []: + date_label = date_entry.get("date", "unknown") + for field in date_fields: + value = date_entry.get(field) + if value is not None: + print(f" [{date_label}] {field}: {value}") + + # Layer 3 – per-org UsageSummaryDateOrg additionalProperties + print(f" === Layer 3: UsageSummaryDateOrg (usage[].orgs[]) for {date_label} ===") + for org in date_entry.get("orgs") or []: + org_label = org.get("name", org.get("public_id", "unknown")) + for field in date_org_fields: + value = org.get(field) + if value is not None: + print(f" [{org_label}] {field}: {value}") From e34e86e36466f02ce21964b1990e2c052dcacf13 Mon Sep 17 00:00:00 2001 From: Charlie Zhang Date: Mon, 15 Jun 2026 14:26:35 -0400 Subject: [PATCH 2/3] Update GetUsageSummary example to show AdditionalProperties access at all layers Co-Authored-By: Claude Sonnet 4.6 --- examples/v1/usage-metering/GetUsageSummary.py | 40 +++++++++++++-- .../GetUsageSummary_additional_properties.py | 51 ------------------- 2 files changed, 37 insertions(+), 54 deletions(-) delete mode 100644 examples/v1/usage-metering/GetUsageSummary_additional_properties.py diff --git a/examples/v1/usage-metering/GetUsageSummary.py b/examples/v1/usage-metering/GetUsageSummary.py index 475495eb48..63a880b2c8 100644 --- a/examples/v1/usage-metering/GetUsageSummary.py +++ b/examples/v1/usage-metering/GetUsageSummary.py @@ -4,14 +4,48 @@ from datadog_api_client import ApiClient, Configuration from datadog_api_client.v1.api.usage_metering_api import UsageMeteringApi +from datadog_api_client.v2.api.usage_metering_api import UsageMeteringApi as UsageMeteringApiV2 from datetime import datetime from dateutil.tz import tzutc configuration = Configuration() with ApiClient(configuration) as api_client: - api_instance = UsageMeteringApi(api_client) - response = api_instance.get_usage_summary( + # Step 1: fetch the canonical field lists from the v2 discovery endpoint. + v2_instance = UsageMeteringApiV2(api_client) + fields_response = v2_instance.get_usage_summary_available_fields() + attrs = fields_response.data.attributes + response_fields = attrs.response_fields # Layer 1 keys + date_fields = attrs.date_fields # Layer 2 keys + date_org_fields = attrs.date_org_fields # Layer 3 keys + + # Step 2: call the v1 summary endpoint with org details included. + v1_instance = UsageMeteringApi(api_client) + resp = v1_instance.get_usage_summary( start_month=datetime(2021, 11, 11, 11, 11, 11, 111000, tzinfo=tzutc()), + include_org_details=True, ) - print(response) + # Layer 1 – top-level UsageSummaryResponse additionalProperties + print("=== Layer 1: UsageSummaryResponse ===") + for field in response_fields: + value = resp.get(field) + if value is not None: + print(f" {field}: {value}") + + # Layer 2 – per-date UsageSummaryDate additionalProperties + print("=== Layer 2: UsageSummaryDate (usage[]) ===") + for date_entry in resp.get("usage") or []: + date_label = date_entry.get("date", "unknown") + for field in date_fields: + value = date_entry.get(field) + if value is not None: + print(f" [{date_label}] {field}: {value}") + + # Layer 3 – per-org UsageSummaryDateOrg additionalProperties + print(f" === Layer 3: UsageSummaryDateOrg (usage[].orgs[]) for {date_label} ===") + for org in date_entry.get("orgs") or []: + org_label = org.get("name", org.get("id", "unknown")) + for field in date_org_fields: + value = org.get(field) + if value is not None: + print(f" [{org_label}] {field}: {value}") diff --git a/examples/v1/usage-metering/GetUsageSummary_additional_properties.py b/examples/v1/usage-metering/GetUsageSummary_additional_properties.py deleted file mode 100644 index 5676a9f218..0000000000 --- a/examples/v1/usage-metering/GetUsageSummary_additional_properties.py +++ /dev/null @@ -1,51 +0,0 @@ -""" -Get usage across your account and read all fields from additionalProperties returns "OK" response -""" - -from datadog_api_client import ApiClient, Configuration -from datadog_api_client.v1.api.usage_metering_api import UsageMeteringApi -from datadog_api_client.v2.api.usage_metering_api import UsageMeteringApi as UsageMeteringApiV2 -from datetime import datetime -from dateutil.tz import tzutc - -configuration = Configuration() -with ApiClient(configuration) as api_client: - # Step 1: fetch the canonical field lists from the v2 discovery endpoint. - v2_instance = UsageMeteringApiV2(api_client) - fields_response = v2_instance.get_usage_summary_available_fields() - attrs = fields_response.data.attributes - response_fields = attrs.response_fields # Layer 1 keys - date_fields = attrs.date_fields # Layer 2 keys - date_org_fields = attrs.date_org_fields # Layer 3 keys - - # Step 2: call the v1 summary endpoint with org details included. - v1_instance = UsageMeteringApi(api_client) - resp = v1_instance.get_usage_summary( - start_month=datetime(2021, 11, 11, 11, 11, 11, 111000, tzinfo=tzutc()), - include_org_details=True, - ) - - # Layer 1 – top-level UsageSummaryResponse additionalProperties - print("=== Layer 1: UsageSummaryResponse ===") - for field in response_fields: - value = resp.get(field) - if value is not None: - print(f" {field}: {value}") - - # Layer 2 – per-date UsageSummaryDate additionalProperties - print("=== Layer 2: UsageSummaryDate (usage[]) ===") - for date_entry in resp.get("usage") or []: - date_label = date_entry.get("date", "unknown") - for field in date_fields: - value = date_entry.get(field) - if value is not None: - print(f" [{date_label}] {field}: {value}") - - # Layer 3 – per-org UsageSummaryDateOrg additionalProperties - print(f" === Layer 3: UsageSummaryDateOrg (usage[].orgs[]) for {date_label} ===") - for org in date_entry.get("orgs") or []: - org_label = org.get("name", org.get("public_id", "unknown")) - for field in date_org_fields: - value = org.get(field) - if value is not None: - print(f" [{org_label}] {field}: {value}") From 8f7049d89b11d9df4890b5ee50a8522fdbd95184 Mon Sep 17 00:00:00 2001 From: Charlie Zhang Date: Mon, 15 Jun 2026 14:50:38 -0400 Subject: [PATCH 3/3] Update GetUsageSummaryAvailableFields example to print field lists by category --- .../GetUsageSummaryAvailableFields.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/examples/v2/usage-metering/GetUsageSummaryAvailableFields.py b/examples/v2/usage-metering/GetUsageSummaryAvailableFields.py index 2676227316..38ed5ca596 100644 --- a/examples/v2/usage-metering/GetUsageSummaryAvailableFields.py +++ b/examples/v2/usage-metering/GetUsageSummaryAvailableFields.py @@ -1,5 +1,5 @@ """ -Get available fields for usage summary returns "OK." response +Get available fields for usage summary returns "OK" response """ from datadog_api_client import ApiClient, Configuration @@ -10,4 +10,15 @@ api_instance = UsageMeteringApi(api_client) response = api_instance.get_usage_summary_available_fields() - print(response) + attrs = response.data.attributes + print(f"response_fields ({len(attrs.response_fields)}):") + for f in attrs.response_fields: + print(f" {f}") + + print(f"date_fields ({len(attrs.date_fields)}):") + for f in attrs.date_fields: + print(f" {f}") + + print(f"date_org_fields ({len(attrs.date_org_fields)}):") + for f in attrs.date_org_fields: + print(f" {f}")