From 00c65eba31ec734f7bbd93f291463aae04d3443a Mon Sep 17 00:00:00 2001 From: Jackson Weber Date: Thu, 27 Feb 2025 12:10:03 -0800 Subject: [PATCH 1/3] Don't apply cloud tags to statsbeat. --- .../monitor-opentelemetry-exporter/src/utils/metricUtils.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sdk/monitor/monitor-opentelemetry-exporter/src/utils/metricUtils.ts b/sdk/monitor/monitor-opentelemetry-exporter/src/utils/metricUtils.ts index 12b3ffaf65bf..408d4c0472a8 100644 --- a/sdk/monitor/monitor-opentelemetry-exporter/src/utils/metricUtils.ts +++ b/sdk/monitor/monitor-opentelemetry-exporter/src/utils/metricUtils.ts @@ -15,7 +15,7 @@ import type { MetricDataPoint, } from "../generated/index.js"; import { createTagsFromResource } from "./common.js"; -import { BreezePerformanceCounterNames, OTelPerformanceCounterNames } from "../types.js"; +import { BreezePerformanceCounterNames, OTelPerformanceCounterNames, Tags } from "../types.js"; import { ENV_OTEL_METRICS_EXPORTER, ENV_OTLP_METRICS_ENDPOINT, @@ -56,13 +56,14 @@ export function resourceMetricsToEnvelope( const envelopes: Envelope[] = []; const time = new Date(); const instrumentationKey = ikey; - const tags = createTagsFromResource(metrics.resource); + let tags: Tags; let envelopeName: string; if (isStatsbeat) { envelopeName = "Microsoft.ApplicationInsights.Statsbeat"; } else { envelopeName = "Microsoft.ApplicationInsights.Metric"; + tags = createTagsFromResource(metrics.resource); } metrics.scopeMetrics.forEach((scopeMetric) => { From 66e08faa75c214fabc1cd9f699382cb94a466c6a Mon Sep 17 00:00:00 2001 From: Jackson Weber Date: Thu, 27 Feb 2025 12:10:58 -0800 Subject: [PATCH 2/3] Update CHANGELOG.md --- sdk/monitor/monitor-opentelemetry-exporter/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/sdk/monitor/monitor-opentelemetry-exporter/CHANGELOG.md b/sdk/monitor/monitor-opentelemetry-exporter/CHANGELOG.md index a84df17e8a16..cf1e6f5d989b 100644 --- a/sdk/monitor/monitor-opentelemetry-exporter/CHANGELOG.md +++ b/sdk/monitor/monitor-opentelemetry-exporter/CHANGELOG.md @@ -10,6 +10,7 @@ ### Other Changes - Removed faulty span exception exporting logic. +- Remove applying cloud.* tags to statsbeat telemetry. ## 1.0.0-beta.28 (2025-01-28) From 14e49ec96100c56e880d4cfe938e95fd3f3eb7b2 Mon Sep 17 00:00:00 2001 From: Jackson Weber Date: Thu, 27 Feb 2025 12:34:29 -0800 Subject: [PATCH 3/3] Add test to ensure that tags are not populated on statsbeat. --- .../test/internal/metricUtil.spec.ts | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/sdk/monitor/monitor-opentelemetry-exporter/test/internal/metricUtil.spec.ts b/sdk/monitor/monitor-opentelemetry-exporter/test/internal/metricUtil.spec.ts index a17e06f7039a..b950ffbe0a3e 100644 --- a/sdk/monitor/monitor-opentelemetry-exporter/test/internal/metricUtil.spec.ts +++ b/sdk/monitor/monitor-opentelemetry-exporter/test/internal/metricUtil.spec.ts @@ -28,6 +28,7 @@ import { BreezePerformanceCounterNames, OTelPerformanceCounterNames } from "../. import { Context, getInstance } from "../../src/platform/index.js"; import { describe, it, assert } from "vitest"; import { ENV_APPLICATIONINSIGHTS_METRICS_TO_LOGANALYTICS_ENABLED } from "../../src/Declarations/Constants.js"; +import { StatsbeatCounter } from "../../src/export/statsbeat/types.js"; const context = getInstance(); const packageJsonPath = path.resolve(__dirname, "../../", "./package.json"); @@ -88,6 +89,22 @@ function assertEnvelope( } } +function assertStatsbeatEnvelope( + envelope: Envelope, + name: string, + sampleRate: number, + baseType: string, +): void { + assert.ok(envelope); + assert.strictEqual(envelope.name, name); + assert.strictEqual(envelope.sampleRate, sampleRate); + assert.deepStrictEqual(envelope.data?.baseType, baseType); + + assert.strictEqual(envelope.instrumentationKey, "ikey"); + + assert.deepStrictEqual(envelope.tags, undefined); +} + describe("metricUtil.ts", () => { it("should not send custom metrics to Breeze if env var is set to disable", async () => { const originalEnv = process.env; @@ -533,5 +550,33 @@ describe("metricUtil.ts", () => { ); process.env = originalEnv; }); + it("should add not attach tags to statsbeat telemetry", async () => { + const provider = new MeterProvider({ + resource: new Resource({ + [SemanticResourceAttributes.SERVICE_NAME]: "basic-service", + }), + }); + const exporter = new TestExporter({ + connectionString: "InstrumentationKey=00000000-0000-0000-0000-000000000000", + }); + const metricReaderOptions: PeriodicExportingMetricReaderOptions = { + exporter: exporter, + }; + const metricReader = new PeriodicExportingMetricReader(metricReaderOptions); + provider.addMetricReader(metricReader); + const meter = provider.getMeter("example-meter-node"); + // Create Counter instrument with the meter + const counter = meter.createCounter(StatsbeatCounter.SUCCESS_COUNT); + counter.add(1); + provider.forceFlush(); + await new Promise((resolve) => setTimeout(resolve, 800)); + const envelope = resourceMetricsToEnvelope(testMetrics, "ikey", true); + assertStatsbeatEnvelope( + envelope[0], + "Microsoft.ApplicationInsights.Statsbeat", + 100, + "MetricData", + ); + }); }); });