From ef257c2db11dde8aad9277ca9fe08379353bf361 Mon Sep 17 00:00:00 2001 From: Jackson Weber Date: Fri, 19 Sep 2025 22:50:21 -0700 Subject: [PATCH 1/4] Update to use otlp-proto exporter. --- package-lock.json | 2 +- package.json | 2 +- src/agent/aksLoader.ts | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 695c48ef..c8fd4ab4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,7 @@ "@opentelemetry/api-logs": "^0.204.0", "@opentelemetry/core": "^2.1.0", "@opentelemetry/exporter-logs-otlp-http": "^0.204.0", - "@opentelemetry/exporter-metrics-otlp-http": "^0.204.0", + "@opentelemetry/exporter-metrics-otlp-proto": "^0.204.0", "@opentelemetry/exporter-trace-otlp-http": "^0.204.0", "@opentelemetry/otlp-exporter-base": "^0.204.0", "@opentelemetry/resources": "^2.1.0", diff --git a/package.json b/package.json index fc0cff6d..e103470c 100644 --- a/package.json +++ b/package.json @@ -75,8 +75,8 @@ "@opentelemetry/api-logs": "^0.204.0", "@opentelemetry/core": "^2.1.0", "@opentelemetry/exporter-logs-otlp-http": "^0.204.0", - "@opentelemetry/exporter-metrics-otlp-http": "^0.204.0", "@opentelemetry/exporter-trace-otlp-http": "^0.204.0", + "@opentelemetry/exporter-metrics-otlp-proto": "^0.204.0", "@opentelemetry/otlp-exporter-base": "^0.204.0", "@opentelemetry/resources": "^2.1.0", "@opentelemetry/sdk-logs": "^0.204.0", diff --git a/src/agent/aksLoader.ts b/src/agent/aksLoader.ts index 23d90fdb..dec7d168 100644 --- a/src/agent/aksLoader.ts +++ b/src/agent/aksLoader.ts @@ -8,7 +8,7 @@ import { FileWriter } from "./diagnostics/writers/fileWriter"; import { StatusLogger } from "./diagnostics/statusLogger"; import { AgentLoader } from "./agentLoader"; import { InstrumentationOptions } from '../types'; -import { OTLPMetricExporter } from "@opentelemetry/exporter-metrics-otlp-http"; +import { OTLPMetricExporter as OTLPProtoMetricExporter } from '@opentelemetry/exporter-metrics-otlp-proto'; import { MetricReader, PeriodicExportingMetricReader } from "@opentelemetry/sdk-metrics"; import { OTLP_METRIC_EXPORTER_EXPORT_INTERVAL } from './types'; @@ -62,7 +62,7 @@ export class AKSLoader extends AgentLoader { (process.env.OTEL_EXPORTER_OTLP_ENDPOINT || process.env.OTEL_EXPORTER_OTLP_METRICS_ENDPOINT) ) { try { - const otlpExporter = new OTLPMetricExporter(); + const otlpExporter = new OTLPProtoMetricExporter(); const otlpMetricReader = new PeriodicExportingMetricReader({ exporter: otlpExporter, From d4505b280cca52f1da2f5f1a6b4a6c8dadde6bfb Mon Sep 17 00:00:00 2001 From: Jackson Weber Date: Fri, 19 Sep 2025 22:54:27 -0700 Subject: [PATCH 2/4] Add test --- test/unitTests/agent/aksLoader.tests.ts | 29 +++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/test/unitTests/agent/aksLoader.tests.ts b/test/unitTests/agent/aksLoader.tests.ts index 37091fc4..cc77b282 100644 --- a/test/unitTests/agent/aksLoader.tests.ts +++ b/test/unitTests/agent/aksLoader.tests.ts @@ -183,4 +183,33 @@ describe("agent/AKSLoader", () => { ); assert.equal(azureMonitorExporters.length, 1, "Should have exactly one Azure Monitor metric exporter"); }); + + it("constructor creates OTLP protobuf exporter when OTEL_EXPORTER_OTLP_METRICS_PROTOCOL is set to http/protobuf", () => { + const env = { + ["APPLICATIONINSIGHTS_CONNECTION_STRING"]: "InstrumentationKey=1aa11111-bbbb-1ccc-8ddd-eeeeffff3333", + ["OTEL_METRICS_EXPORTER"]: "otlp", + ["OTEL_EXPORTER_OTLP_ENDPOINT"]: "http://localhost:4317", + ["OTEL_EXPORTER_OTLP_METRICS_PROTOCOL"]: "http/protobuf" + }; + process.env = env; + + const agent = new AKSLoader(); + + // Verify that metricReaders were added to the options + const options = (agent as any)._options; + assert.ok(options.metricReaders, "metricReaders should be present in options"); + assert.equal(options.metricReaders.length, 1, "Should have exactly one metric reader"); + + // Verify the metric reader is a PeriodicExportingMetricReader + const metricReader = options.metricReaders[0]; + assert.equal(metricReader.constructor.name, "PeriodicExportingMetricReader", "Should be a PeriodicExportingMetricReader"); + + // Verify the exporter is an OTLP protobuf exporter + const exporter = (metricReader as any)._exporter; + assert.equal(exporter.constructor.name, "OTLPMetricExporter", "Should be an OTLPMetricExporter"); + + // Verify that it's the protobuf version by checking if it was imported from the proto package + // The protobuf exporter should have different internal structure than the HTTP exporter + assert.ok(exporter, "Protobuf exporter should exist"); + }); }); From cfd4ede22224fadb628a2b39d85ddcbb6b0d2d7b Mon Sep 17 00:00:00 2001 From: Jackson Weber Date: Fri, 19 Sep 2025 22:56:58 -0700 Subject: [PATCH 3/4] Update aksLoader.ts --- src/agent/aksLoader.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/agent/aksLoader.ts b/src/agent/aksLoader.ts index dec7d168..7edb63a4 100644 --- a/src/agent/aksLoader.ts +++ b/src/agent/aksLoader.ts @@ -8,7 +8,7 @@ import { FileWriter } from "./diagnostics/writers/fileWriter"; import { StatusLogger } from "./diagnostics/statusLogger"; import { AgentLoader } from "./agentLoader"; import { InstrumentationOptions } from '../types'; -import { OTLPMetricExporter as OTLPProtoMetricExporter } from '@opentelemetry/exporter-metrics-otlp-proto'; +import { OTLPMetricExporter as OTLPProtoMetricExporter } from "@opentelemetry/exporter-metrics-otlp-proto"; import { MetricReader, PeriodicExportingMetricReader } from "@opentelemetry/sdk-metrics"; import { OTLP_METRIC_EXPORTER_EXPORT_INTERVAL } from './types'; From 7fec48f85f58b800944c5ac3e0e22825dc1d3b71 Mon Sep 17 00:00:00 2001 From: Jackson Weber Date: Mon, 22 Sep 2025 14:10:08 -0700 Subject: [PATCH 4/4] Add support for otlp/http. --- package-lock.json | 1 + package.json | 1 + src/agent/aksLoader.ts | 13 ++++++++++++- 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index c8fd4ab4..977eb8f0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,7 @@ "@opentelemetry/api-logs": "^0.204.0", "@opentelemetry/core": "^2.1.0", "@opentelemetry/exporter-logs-otlp-http": "^0.204.0", + "@opentelemetry/exporter-metrics-otlp-http": "^0.204.0", "@opentelemetry/exporter-metrics-otlp-proto": "^0.204.0", "@opentelemetry/exporter-trace-otlp-http": "^0.204.0", "@opentelemetry/otlp-exporter-base": "^0.204.0", diff --git a/package.json b/package.json index e103470c..ed329126 100644 --- a/package.json +++ b/package.json @@ -77,6 +77,7 @@ "@opentelemetry/exporter-logs-otlp-http": "^0.204.0", "@opentelemetry/exporter-trace-otlp-http": "^0.204.0", "@opentelemetry/exporter-metrics-otlp-proto": "^0.204.0", + "@opentelemetry/exporter-metrics-otlp-http": "^0.204.0", "@opentelemetry/otlp-exporter-base": "^0.204.0", "@opentelemetry/resources": "^2.1.0", "@opentelemetry/sdk-logs": "^0.204.0", diff --git a/src/agent/aksLoader.ts b/src/agent/aksLoader.ts index 7edb63a4..9c118b82 100644 --- a/src/agent/aksLoader.ts +++ b/src/agent/aksLoader.ts @@ -9,6 +9,7 @@ import { StatusLogger } from "./diagnostics/statusLogger"; import { AgentLoader } from "./agentLoader"; import { InstrumentationOptions } from '../types'; import { OTLPMetricExporter as OTLPProtoMetricExporter } from "@opentelemetry/exporter-metrics-otlp-proto"; +import { OTLPMetricExporter as OTLPHttpMetricExporter } from "@opentelemetry/exporter-metrics-otlp-http"; import { MetricReader, PeriodicExportingMetricReader } from "@opentelemetry/sdk-metrics"; import { OTLP_METRIC_EXPORTER_EXPORT_INTERVAL } from './types'; @@ -62,7 +63,17 @@ export class AKSLoader extends AgentLoader { (process.env.OTEL_EXPORTER_OTLP_ENDPOINT || process.env.OTEL_EXPORTER_OTLP_METRICS_ENDPOINT) ) { try { - const otlpExporter = new OTLPProtoMetricExporter(); + // Determine which exporter to use based on protocol setting + const protocol = process.env.OTEL_EXPORTER_OTLP_METRICS_PROTOCOL || + process.env.OTEL_EXPORTER_OTLP_PROTOCOL; + + let otlpExporter; + if (protocol === 'http/json') { + otlpExporter = new OTLPHttpMetricExporter(); + } else { + // Use protobuf for 'http/protobuf', 'grpc', or any other value + otlpExporter = new OTLPProtoMetricExporter(); + } const otlpMetricReader = new PeriodicExportingMetricReader({ exporter: otlpExporter,