From 1ab8275996a344551736ac63a0e3d2679e13182a Mon Sep 17 00:00:00 2001 From: Mateusz Kwasniewski Date: Wed, 16 Jul 2025 14:45:44 +0200 Subject: [PATCH] feat: default origin for impact metrics (#10362) --- .../metrics/impact/impact-metrics.e2e.test.ts | 4 +-- .../metrics/impact/metrics-translator.test.ts | 12 +++---- .../metrics/impact/metrics-translator.ts | 34 ++++++++++--------- 3 files changed, 26 insertions(+), 24 deletions(-) diff --git a/src/lib/features/metrics/impact/impact-metrics.e2e.test.ts b/src/lib/features/metrics/impact/impact-metrics.e2e.test.ts index 18e3a57187..7b5a92a5ee 100644 --- a/src/lib/features/metrics/impact/impact-metrics.e2e.test.ts +++ b/src/lib/features/metrics/impact/impact-metrics.e2e.test.ts @@ -118,7 +118,7 @@ test('should store impact metrics in memory and be able to retrieve them', async '# TYPE unleash_counter_labeled_counter counter', ); expect(metricsText).toMatch( - /unleash_counter_labeled_counter{unleash_foo="bar"} 15/, + /unleash_counter_labeled_counter{unleash_foo="bar",unleash_origin="sdk"} 15/, ); }); @@ -167,6 +167,6 @@ test('should store impact metrics sent via bulk metrics endpoint', async () => { '# TYPE unleash_counter_bulk_counter counter', ); expect(metricsText).toMatch( - /unleash_counter_bulk_counter{unleash_source="bulk"} 15/, + /unleash_counter_bulk_counter{unleash_source="bulk",unleash_origin="sdk"} 15/, ); }); diff --git a/src/lib/features/metrics/impact/metrics-translator.test.ts b/src/lib/features/metrics/impact/metrics-translator.test.ts index 84e7b5ab2d..302da2dbaf 100644 --- a/src/lib/features/metrics/impact/metrics-translator.test.ts +++ b/src/lib/features/metrics/impact/metrics-translator.test.ts @@ -39,10 +39,10 @@ describe('MetricsTranslator', () => { '# TYPE unleash_counter_labeled_counter counter', ); expect(result).toContain( - 'unleash_counter_labeled_counter{unleash_foo="bar"} 5', + 'unleash_counter_labeled_counter{unleash_foo="bar",unleash_origin="sdk"} 5', ); expect(result).toContain( - 'unleash_gauge_test_gauge{unleash_env="prod"} 10', + 'unleash_gauge_test_gauge{unleash_env="prod",unleash_origin="sdk"} 10', ); }); @@ -112,10 +112,10 @@ describe('MetricsTranslator', () => { const result1 = await translator.translateAndSerializeMetrics(metrics1); expect(result1).toContain( - 'unleash_counter_counter_with_labels{unleash_foo="bar"} 5', + 'unleash_counter_counter_with_labels{unleash_foo="bar",unleash_origin="sdk"} 5', ); expect(result1).toContain( - 'unleash_gauge_gauge_with_labels{unleash_env="prod"} 10', + 'unleash_gauge_gauge_with_labels{unleash_env="prod",unleash_origin="sdk"} 10', ); const metrics2 = [ @@ -146,10 +146,10 @@ describe('MetricsTranslator', () => { const result2 = await translator.translateAndSerializeMetrics(metrics2); expect(result2).toContain( - 'unleash_counter_counter_with_labels{unleash_foo="bar",unleash_baz="qux"} 15', + 'unleash_counter_counter_with_labels{unleash_foo="bar",unleash_baz="qux",unleash_origin="sdk"} 15', ); expect(result2).toContain( - 'unleash_gauge_gauge_with_labels{unleash_env="prod",unleash_region="us-east"} 20', + 'unleash_gauge_gauge_with_labels{unleash_env="prod",unleash_region="us-east",unleash_origin="sdk"} 20', ); }); }); diff --git a/src/lib/features/metrics/impact/metrics-translator.ts b/src/lib/features/metrics/impact/metrics-translator.ts index 455d8ab6cc..8f93cadf21 100644 --- a/src/lib/features/metrics/impact/metrics-translator.ts +++ b/src/lib/features/metrics/impact/metrics-translator.ts @@ -41,11 +41,21 @@ export class MetricsTranslator { ); } + private addOriginLabel( + sample: MetricSample, + ): Record { + return { + ...(sample.labels || {}), + origin: (sample.labels && sample.labels.origin) || 'sdk', + }; + } + translateMetric(metric: Metric): Counter | Gauge | null { const prefixedName = `unleash_${metric.type}_${metric.name}`; const existingMetric = this.registry.getSingleMetric(prefixedName); const allLabelNames = new Set(); + allLabelNames.add('unleash_origin'); for (const sample of metric.samples) { if (sample.labels) { Object.keys(sample.labels).forEach((label) => @@ -81,14 +91,10 @@ export class MetricsTranslator { } for (const sample of metric.samples) { - if (sample.labels) { - counter.inc( - this.transformLabels(sample.labels), - sample.value, - ); - } else { - counter.inc(sample.value); - } + counter.inc( + this.transformLabels(this.addOriginLabel(sample)), + sample.value, + ); } return counter; @@ -118,14 +124,10 @@ export class MetricsTranslator { } for (const sample of metric.samples) { - if (sample.labels) { - gauge.set( - this.transformLabels(sample.labels), - sample.value, - ); - } else { - gauge.set(sample.value); - } + gauge.set( + this.transformLabels(this.addOriginLabel(sample)), + sample.value, + ); } return gauge;