Skip to content

Commit d8093f4

Browse files
committed
Improve clarity around versions and instances
1 parent da4d193 commit d8093f4

File tree

8 files changed

+48
-35
lines changed

8 files changed

+48
-35
lines changed

datadog-dashboard.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -620,8 +620,8 @@
620620
"default": "*"
621621
},
622622
{
623-
"name": "deployment_id",
624-
"prefix": "deployment_id",
623+
"name": "instance_id",
624+
"prefix": "instance_id",
625625
"available_values": [],
626626
"default": "*"
627627
},

readme.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,12 @@ Use `instances.total.max - instances.total.healthy` to calculate available capac
9090
| `bandwidth.rx` | count | bytes | Bytes received |
9191
| `bandwidth.tx` | count | bytes | Bytes transmitted |
9292

93-
**Tags:** `account_id`, `application_id`, `application_name`, `deployment_id`, `placement_id`, `stat`
93+
**Tags:** `account_id`, `application_id`, `application_name`, `version`, `instance_id`, `placement_id`, `stat`
9494

95-
The `stat` tag indicates the aggregation: `p50`, `p90`, `p99`, `max` (bandwidth metrics don't have a stat tag).
95+
- `version` - The container application version number
96+
- `instance_id` - The instance identifier (maps to Cloudflare's deploymentId)
97+
- `placement_id` - The placement identifier (specific realization of an instance, useful for tracking restarts/churn)
98+
- `stat` - The aggregation type: `p50`, `p90`, `p99`, `max` (bandwidth metrics don't have a stat tag)
9699

97100
## Datadog Dashboard
98101

src/api/cloudflare.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@ export interface GraphQLResponse<T> {
2323
}
2424

2525
const CONTAINERS_METRICS_QUERY = `
26-
query GetCloudchamberMetrics($accountTag: string!, $datetimeStart: Time, $datetimeEnd: Time, $applicationIds: [string!]) {
26+
query GetCloudchamberMetrics($accountTag: string!, $datetimeStart: Time, $datetimeEnd: Time, $applicationId: string!) {
2727
viewer {
2828
accounts(filter: {accountTag: $accountTag}) {
29-
cloudchamberMetricsAdaptiveGroups(limit: 10000, filter: {applicationId_in: $applicationIds, datetimeMinute_geq: $datetimeStart, datetimeMinute_leq: $datetimeEnd}) {
29+
cloudchamberMetricsAdaptiveGroups(limit: 10000, filter: {applicationId: $applicationId, datetimeMinute_geq: $datetimeStart, datetimeMinute_leq: $datetimeEnd}) {
3030
max {
3131
memory
3232
cpuLoad
@@ -50,8 +50,8 @@ query GetCloudchamberMetrics($accountTag: string!, $datetimeStart: Time, $dateti
5050
dimensions {
5151
datetimeMinute
5252
applicationId
53-
placementId
5453
deploymentId
54+
placementId
5555
}
5656
}
5757
}
@@ -98,13 +98,13 @@ export class CloudflareApi {
9898
}
9999

100100
/**
101-
* Get metrics for multiple container applications
102-
* @param applicationIds - Array of container application IDs
101+
* Get metrics for a container application
102+
* @param applicationId - Container application ID
103103
* @param startTime - Start of the time range (defaults to 5 minutes ago)
104104
* @param endTime - End of the time range (defaults to now)
105105
*/
106106
async getContainerMetrics(
107-
applicationIds: string[],
107+
applicationId: string,
108108
startTime?: Date,
109109
endTime?: Date,
110110
): Promise<MetricsGroup[]> {
@@ -115,7 +115,7 @@ export class CloudflareApi {
115115
accountTag: this.config.accountId,
116116
datetimeStart: start.toISOString(),
117117
datetimeEnd: now.toISOString(),
118-
applicationIds,
118+
applicationId,
119119
};
120120

121121
const response = await fetch(this.graphqlUrl, {
@@ -143,7 +143,7 @@ export class CloudflareApi {
143143
data.data?.viewer?.accounts?.[0]?.cloudchamberMetricsAdaptiveGroups ?? [];
144144

145145
console.log("Fetched container metrics", {
146-
applicationCount: applicationIds.length,
146+
applicationId,
147147
groupCount: groups.length,
148148
});
149149

src/metrics.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export interface ContainerWithMetrics {
99
export interface ContainerInfo {
1010
id: string;
1111
name: string;
12+
version: number;
1213
}
1314

1415
/**
@@ -28,7 +29,8 @@ export function formatMetricsForContainer(
2829
`account_id:${accountId}`,
2930
`application_id:${group.dimensions.applicationId}`,
3031
`application_name:${container.name}`,
31-
`deployment_id:${group.dimensions.deploymentId}`,
32+
`version:${container.version}`,
33+
`instance_id:${group.dimensions.deploymentId}`,
3234
`placement_id:${group.dimensions.placementId}`,
3335
];
3436

src/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export type Container = z.infer<typeof Container>;
2121
export const Container = z.looseObject({
2222
id: z.string(),
2323
name: z.string(),
24+
version: z.number(),
2425
instances: z.number().optional(),
2526
max_instances: z.number().optional(),
2627
health: HealthSchema.optional(),

src/workflow.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,19 +66,23 @@ export class MetricsExporterWorkflow extends WorkflowEntrypoint<Env> {
6666
);
6767
await datadog.sendMetrics(healthMetrics);
6868

69-
return result.map((c) => ({ id: c.id, name: c.name }));
69+
return result.map((c) => ({
70+
id: c.id,
71+
name: c.name,
72+
version: c.version,
73+
}));
7074
},
7175
);
7276

7377
let totalMetrics = 0;
7478

7579
for (const container of containers) {
7680
const count = await step.do(
77-
`export metrics: ${container.name}`,
81+
`Download Metrics: ${container.name}`,
7882
STEP_CONFIG,
7983
async () => {
8084
const metricsGroups = await cloudflare.getContainerMetrics(
81-
[container.id],
85+
container.id,
8286
start,
8387
end,
8488
);
@@ -95,7 +99,7 @@ export class MetricsExporterWorkflow extends WorkflowEntrypoint<Env> {
9599
batches.map(
96100
(batch, i) => () =>
97101
step.do(
98-
`send batch ${i + 1}/${batches.length} (${batch.length} metrics)`,
102+
`Export Metrics: ${container.name} batch ${i + 1}/${batches.length}`,
99103
STEP_CONFIG,
100104
async () => {
101105
await datadog.sendMetrics(batch);

test/metricsformatting.test.ts

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ const TEST_TIMESTAMP = 1733414400; // 2024-12-05T16:00:00Z
1616

1717
describe("formatMetricsForContainer", () => {
1818
it("formats metrics for a single container", () => {
19-
const container = { id: "app-123", name: "my-app" };
19+
const container = { id: "app-123", name: "my-app", version: 1 };
2020
const metrics = formatMetricsForContainer(
2121
TEST_ACCOUNT_ID,
2222
container,
@@ -29,7 +29,7 @@ describe("formatMetricsForContainer", () => {
2929
});
3030

3131
it("formats multiple metrics groups", () => {
32-
const container = { id: "app-123", name: "my-app" };
32+
const container = { id: "app-123", name: "my-app", version: 1 };
3333
const metrics = formatMetricsForContainer(
3434
TEST_ACCOUNT_ID,
3535
container,
@@ -42,13 +42,13 @@ describe("formatMetricsForContainer", () => {
4242
});
4343

4444
it("includes correct tags", () => {
45-
const container = { id: "app-123", name: "my-app" };
45+
const container = { id: "app-123", name: "my-app", version: 1 };
4646
const group = createMockMetricsGroup({
4747
dimensions: {
4848
applicationId: "app-test",
4949
datetimeMinute: "2025-12-05T16:00:00Z",
50-
deploymentId: "deploy-test",
51-
placementId: "place-test",
50+
deploymentId: "instance-test",
51+
placementId: "placement-test",
5252
},
5353
});
5454

@@ -68,12 +68,13 @@ describe("formatMetricsForContainer", () => {
6868
expect(cpuMetric?.tags).toContain(`account_id:${TEST_ACCOUNT_ID}`);
6969
expect(cpuMetric?.tags).toContain("application_id:app-test");
7070
expect(cpuMetric?.tags).toContain("application_name:my-app");
71-
expect(cpuMetric?.tags).toContain("deployment_id:deploy-test");
72-
expect(cpuMetric?.tags).toContain("placement_id:place-test");
71+
expect(cpuMetric?.tags).toContain("version:1");
72+
expect(cpuMetric?.tags).toContain("instance_id:instance-test");
73+
expect(cpuMetric?.tags).toContain("placement_id:placement-test");
7374
});
7475

7576
it("returns empty array for no metrics groups", () => {
76-
const container = { id: "app-123", name: "my-app" };
77+
const container = { id: "app-123", name: "my-app", version: 1 };
7778
const metrics = formatMetricsForContainer(
7879
TEST_ACCOUNT_ID,
7980
container,
@@ -130,8 +131,8 @@ describe("formatContainerMetrics", () => {
130131
dimensions: {
131132
applicationId: "app-test",
132133
datetimeMinute: "2025-12-05T16:00:00Z",
133-
deploymentId: "deploy-test",
134-
placementId: "place-test",
134+
deploymentId: "instance-test",
135+
placementId: "placement-test",
135136
},
136137
});
137138

@@ -159,8 +160,8 @@ describe("formatContainerMetrics", () => {
159160
expect(cpuMetric?.tags).toContain(
160161
`application_name:${mockContainers[0].name}`,
161162
);
162-
expect(cpuMetric?.tags).toContain("deployment_id:deploy-test");
163-
expect(cpuMetric?.tags).toContain("placement_id:place-test");
163+
expect(cpuMetric?.tags).toContain("instance_id:instance-test");
164+
expect(cpuMetric?.tags).toContain("placement_id:placement-test");
164165
expect(cpuMetric?.tags).toContain("stat:p50");
165166
});
166167

test/mocks/data.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export const mockContainers: Container[] = [
1111
{
1212
id: "app-123-abc",
1313
name: "my-web-app",
14+
version: 3,
1415
instances: 5,
1516
max_instances: 10,
1617
health: {
@@ -29,6 +30,7 @@ export const mockContainers: Container[] = [
2930
{
3031
id: "app-456-def",
3132
name: "api-service",
33+
version: 1,
3234
instances: 3,
3335
max_instances: 5,
3436
health: {
@@ -74,8 +76,8 @@ export const mockMetricsGroups: MetricsGroup[] = [
7476
dimensions: {
7577
applicationId: "app-123-abc",
7678
datetimeMinute: "2025-12-05T16:00:00Z",
77-
deploymentId: "deploy-001",
78-
placementId: "place-us-east-1",
79+
deploymentId: "instance-001",
80+
placementId: "placement-us-east-1",
7981
},
8082
},
8183
{
@@ -102,8 +104,8 @@ export const mockMetricsGroups: MetricsGroup[] = [
102104
dimensions: {
103105
applicationId: "app-123-abc",
104106
datetimeMinute: "2025-12-05T16:00:00Z",
105-
deploymentId: "deploy-002",
106-
placementId: "place-us-east-2",
107+
deploymentId: "instance-002",
108+
placementId: "placement-us-east-2",
107109
},
108110
},
109111
];
@@ -167,8 +169,8 @@ export function createMockMetricsGroup(
167169
dimensions: {
168170
applicationId: "app-123-abc",
169171
datetimeMinute: new Date().toISOString(),
170-
deploymentId: "deploy-001",
171-
placementId: "place-us-east-1",
172+
deploymentId: "instance-001",
173+
placementId: "placement-us-east-1",
172174
...overrides.dimensions,
173175
},
174176
};

0 commit comments

Comments
 (0)