From f056722d296e5319ce7f2f48b4e926f84d5d8568 Mon Sep 17 00:00:00 2001 From: Charlie Zhang Date: Mon, 15 Jun 2026 14:22:07 -0400 Subject: [PATCH 1/3] Add example: GetUsageSummary with additionalProperties iteration Co-Authored-By: Claude Sonnet 4.6 --- .../GetUsageSummary_additional_properties.ts | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 examples/v1/usage-metering/GetUsageSummary_additional_properties.ts diff --git a/examples/v1/usage-metering/GetUsageSummary_additional_properties.ts b/examples/v1/usage-metering/GetUsageSummary_additional_properties.ts new file mode 100644 index 000000000000..47ec6989c89d --- /dev/null +++ b/examples/v1/usage-metering/GetUsageSummary_additional_properties.ts @@ -0,0 +1,80 @@ +/** + * Get usage across your account and read all fields from additionalProperties returns "OK" response + */ + +import { client, v1, v2 } from "@datadog/datadog-api-client"; + +const configuration = client.createConfiguration(); + +// Step 1: call v2 getUsageSummaryAvailableFields to enumerate all field names +const v2ApiInstance = new v2.UsageMeteringApi(configuration); + +v2ApiInstance + .getUsageSummaryAvailableFields() + .then((fieldsData: v2.UsageSummaryAvailableFieldsResponse) => { + const attrs = fieldsData.data?.attributes; + const responseFields: string[] = attrs?.responseFields ?? []; + const dateFields: string[] = attrs?.dateFields ?? []; + const dateOrgFields: string[] = attrs?.dateOrgFields ?? []; + + console.log(`responseFields count: ${responseFields.length}`); + console.log(`dateFields count: ${dateFields.length}`); + console.log(`dateOrgFields count: ${dateOrgFields.length}`); + + // Step 2: call v1 getUsageSummary for approximately the last month + const v1ApiInstance = new v1.UsageMeteringApi(configuration); + + const params: v1.UsageMeteringApiGetUsageSummaryRequest = { + startMonth: new Date(2026, 4, 1, 0, 0, 0, 0), // May 2026 + endMonth: new Date(2026, 4, 1, 0, 0, 0, 0), // May 2026 + includeOrgDetails: true, + }; + + v1ApiInstance + .getUsageSummary(params) + .then((data: v1.UsageSummaryResponse) => { + // --- top-level response additionalProperties --- + console.log("\n=== Top-level response additionalProperties ==="); + const topProps = data.additionalProperties ?? {}; + for (const field of responseFields) { + const value = topProps[field]; + if (value !== undefined && value !== null) { + console.log(` ${field}: ${value}`); + } + } + + // --- per-date entries --- + const usageDates = data.usage ?? []; + for (const dateEntry of usageDates) { + const dateLabel = dateEntry.date?.toISOString() ?? "(unknown date)"; + console.log(`\n=== Date entry: ${dateLabel} ===`); + + const dateProps = dateEntry.additionalProperties ?? {}; + for (const field of dateFields) { + const value = dateProps[field]; + if (value !== undefined && value !== null) { + console.log(` ${field}: ${value}`); + } + } + + // --- per-date per-org entries --- + const orgs = dateEntry.orgs ?? []; + for (const orgEntry of orgs) { + const orgName = + (orgEntry as any).name ?? (orgEntry as any).publicId ?? "(org)"; + console.log(`\n === Org: ${orgName} ===`); + + const orgProps = + (orgEntry as v1.UsageSummaryDateOrg).additionalProperties ?? {}; + for (const field of dateOrgFields) { + const value = orgProps[field]; + if (value !== undefined && value !== null) { + console.log(` ${field}: ${value}`); + } + } + } + } + }) + .catch((error: any) => console.error(error)); + }) + .catch((error: any) => console.error(error)); From 65012eafa36c8ddd5980d63b94f9cc80323c62c3 Mon Sep 17 00:00:00 2001 From: Charlie Zhang Date: Mon, 15 Jun 2026 14:27:02 -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.ts | 82 ++++++++++++++++--- .../GetUsageSummary_additional_properties.ts | 80 ------------------ 2 files changed, 69 insertions(+), 93 deletions(-) delete mode 100644 examples/v1/usage-metering/GetUsageSummary_additional_properties.ts diff --git a/examples/v1/usage-metering/GetUsageSummary.ts b/examples/v1/usage-metering/GetUsageSummary.ts index fc60692a1fb9..3250fea22aa1 100644 --- a/examples/v1/usage-metering/GetUsageSummary.ts +++ b/examples/v1/usage-metering/GetUsageSummary.ts @@ -2,20 +2,76 @@ * Get usage across your account returns "OK" response */ -import { client, v1 } from "@datadog/datadog-api-client"; +import { client, v1, v2 } from "@datadog/datadog-api-client"; const configuration = client.createConfiguration(); -const apiInstance = new v1.UsageMeteringApi(configuration); - -const params: v1.UsageMeteringApiGetUsageSummaryRequest = { - startMonth: new Date(2021, 11, 11, 11, 11, 11, 111000), -}; - -apiInstance - .getUsageSummary(params) - .then((data: v1.UsageSummaryResponse) => { - console.log( - "API called successfully. Returned data: " + JSON.stringify(data) - ); + +// Step 1: call v2 getUsageSummaryAvailableFields to enumerate all field names +const v2ApiInstance = new v2.UsageMeteringApi(configuration); + +v2ApiInstance + .getUsageSummaryAvailableFields() + .then((fieldsData: v2.UsageSummaryAvailableFieldsResponse) => { + const attrs = fieldsData.data?.attributes; + const responseFields: string[] = attrs?.responseFields ?? []; + const dateFields: string[] = attrs?.dateFields ?? []; + const dateOrgFields: string[] = attrs?.dateOrgFields ?? []; + + console.log(`responseFields count: ${responseFields.length}`); + console.log(`dateFields count: ${dateFields.length}`); + console.log(`dateOrgFields count: ${dateOrgFields.length}`); + + // Step 2: call v1 getUsageSummary for approximately the last month + const v1ApiInstance = new v1.UsageMeteringApi(configuration); + + const params: v1.UsageMeteringApiGetUsageSummaryRequest = { + startMonth: new Date(2021, 11, 11, 11, 11, 11, 111000), + includeOrgDetails: true, + }; + + v1ApiInstance + .getUsageSummary(params) + .then((data: v1.UsageSummaryResponse) => { + // --- Layer 1: top-level response additionalProperties --- + console.log("\n=== Top-level response additionalProperties ==="); + const topProps = data.additionalProperties ?? {}; + for (const field of responseFields) { + const value = topProps[field]; + if (value !== undefined && value !== null) { + console.log(` ${field}: ${value}`); + } + } + + // --- Layer 2: per-date entries --- + const usageDates = data.usage ?? []; + for (const dateEntry of usageDates) { + const dateLabel = dateEntry.date?.toISOString() ?? "(unknown date)"; + console.log(`\n=== Date entry: ${dateLabel} ===`); + + const dateProps = dateEntry.additionalProperties ?? {}; + for (const field of dateFields) { + const value = dateProps[field]; + if (value !== undefined && value !== null) { + console.log(` ${field}: ${value}`); + } + } + + // --- Layer 3: per-date per-org entries --- + const orgs = dateEntry.orgs ?? []; + for (const orgEntry of orgs) { + const orgName = orgEntry.name ?? orgEntry.publicId ?? "(org)"; + console.log(`\n === Org: ${orgName} ===`); + + const orgProps = orgEntry.additionalProperties ?? {}; + for (const field of dateOrgFields) { + const value = orgProps[field]; + if (value !== undefined && value !== null) { + console.log(` ${field}: ${value}`); + } + } + } + } + }) + .catch((error: any) => console.error(error)); }) .catch((error: any) => console.error(error)); diff --git a/examples/v1/usage-metering/GetUsageSummary_additional_properties.ts b/examples/v1/usage-metering/GetUsageSummary_additional_properties.ts deleted file mode 100644 index 47ec6989c89d..000000000000 --- a/examples/v1/usage-metering/GetUsageSummary_additional_properties.ts +++ /dev/null @@ -1,80 +0,0 @@ -/** - * Get usage across your account and read all fields from additionalProperties returns "OK" response - */ - -import { client, v1, v2 } from "@datadog/datadog-api-client"; - -const configuration = client.createConfiguration(); - -// Step 1: call v2 getUsageSummaryAvailableFields to enumerate all field names -const v2ApiInstance = new v2.UsageMeteringApi(configuration); - -v2ApiInstance - .getUsageSummaryAvailableFields() - .then((fieldsData: v2.UsageSummaryAvailableFieldsResponse) => { - const attrs = fieldsData.data?.attributes; - const responseFields: string[] = attrs?.responseFields ?? []; - const dateFields: string[] = attrs?.dateFields ?? []; - const dateOrgFields: string[] = attrs?.dateOrgFields ?? []; - - console.log(`responseFields count: ${responseFields.length}`); - console.log(`dateFields count: ${dateFields.length}`); - console.log(`dateOrgFields count: ${dateOrgFields.length}`); - - // Step 2: call v1 getUsageSummary for approximately the last month - const v1ApiInstance = new v1.UsageMeteringApi(configuration); - - const params: v1.UsageMeteringApiGetUsageSummaryRequest = { - startMonth: new Date(2026, 4, 1, 0, 0, 0, 0), // May 2026 - endMonth: new Date(2026, 4, 1, 0, 0, 0, 0), // May 2026 - includeOrgDetails: true, - }; - - v1ApiInstance - .getUsageSummary(params) - .then((data: v1.UsageSummaryResponse) => { - // --- top-level response additionalProperties --- - console.log("\n=== Top-level response additionalProperties ==="); - const topProps = data.additionalProperties ?? {}; - for (const field of responseFields) { - const value = topProps[field]; - if (value !== undefined && value !== null) { - console.log(` ${field}: ${value}`); - } - } - - // --- per-date entries --- - const usageDates = data.usage ?? []; - for (const dateEntry of usageDates) { - const dateLabel = dateEntry.date?.toISOString() ?? "(unknown date)"; - console.log(`\n=== Date entry: ${dateLabel} ===`); - - const dateProps = dateEntry.additionalProperties ?? {}; - for (const field of dateFields) { - const value = dateProps[field]; - if (value !== undefined && value !== null) { - console.log(` ${field}: ${value}`); - } - } - - // --- per-date per-org entries --- - const orgs = dateEntry.orgs ?? []; - for (const orgEntry of orgs) { - const orgName = - (orgEntry as any).name ?? (orgEntry as any).publicId ?? "(org)"; - console.log(`\n === Org: ${orgName} ===`); - - const orgProps = - (orgEntry as v1.UsageSummaryDateOrg).additionalProperties ?? {}; - for (const field of dateOrgFields) { - const value = orgProps[field]; - if (value !== undefined && value !== null) { - console.log(` ${field}: ${value}`); - } - } - } - } - }) - .catch((error: any) => console.error(error)); - }) - .catch((error: any) => console.error(error)); From 1851d7ee744af63d6d9d029a81ef9c720b94447a Mon Sep 17 00:00:00 2001 From: Charlie Zhang Date: Mon, 15 Jun 2026 14:50:48 -0400 Subject: [PATCH 3/3] Update GetUsageSummaryAvailableFields example to print field lists by category --- .../GetUsageSummaryAvailableFields.ts | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/examples/v2/usage-metering/GetUsageSummaryAvailableFields.ts b/examples/v2/usage-metering/GetUsageSummaryAvailableFields.ts index 5bf4e62a527a..5cb78831f39e 100644 --- a/examples/v2/usage-metering/GetUsageSummaryAvailableFields.ts +++ b/examples/v2/usage-metering/GetUsageSummaryAvailableFields.ts @@ -1,5 +1,5 @@ /** - * Get available fields for usage summary returns "OK." response + * Get available fields for usage summary returns "OK" response */ import { client, v2 } from "@datadog/datadog-api-client"; @@ -10,8 +10,19 @@ const apiInstance = new v2.UsageMeteringApi(configuration); apiInstance .getUsageSummaryAvailableFields() .then((data: v2.UsageSummaryAvailableFieldsResponse) => { - console.log( - "API called successfully. Returned data: " + JSON.stringify(data) - ); + const attrs = data.data?.attributes; + if (!attrs) return; + + const responseFields = attrs.responseFields ?? []; + console.log(`response_fields (${responseFields.length}):`); + for (const f of responseFields) console.log(` ${f}`); + + const dateFields = attrs.dateFields ?? []; + console.log(`date_fields (${dateFields.length}):`); + for (const f of dateFields) console.log(` ${f}`); + + const dateOrgFields = attrs.dateOrgFields ?? []; + console.log(`date_org_fields (${dateOrgFields.length}):`); + for (const f of dateOrgFields) console.log(` ${f}`); }) .catch((error: any) => console.error(error));