Skip to content

Commit b4393ab

Browse files
authored
Use OTLP/Protobuf Exporter for AMW Endpoint (#1470)
* Update to use otlp-proto exporter. * Add test * Update aksLoader.ts * Add support for otlp/http.
1 parent 873e232 commit b4393ab

File tree

4 files changed

+45
-3
lines changed

4 files changed

+45
-3
lines changed

package-lock.json

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,9 @@
7575
"@opentelemetry/api-logs": "^0.204.0",
7676
"@opentelemetry/core": "^2.1.0",
7777
"@opentelemetry/exporter-logs-otlp-http": "^0.204.0",
78-
"@opentelemetry/exporter-metrics-otlp-http": "^0.204.0",
7978
"@opentelemetry/exporter-trace-otlp-http": "^0.204.0",
79+
"@opentelemetry/exporter-metrics-otlp-proto": "^0.204.0",
80+
"@opentelemetry/exporter-metrics-otlp-http": "^0.204.0",
8081
"@opentelemetry/otlp-exporter-base": "^0.204.0",
8182
"@opentelemetry/resources": "^2.1.0",
8283
"@opentelemetry/sdk-logs": "^0.204.0",

src/agent/aksLoader.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ import { FileWriter } from "./diagnostics/writers/fileWriter";
88
import { StatusLogger } from "./diagnostics/statusLogger";
99
import { AgentLoader } from "./agentLoader";
1010
import { InstrumentationOptions } from '../types';
11-
import { OTLPMetricExporter } from "@opentelemetry/exporter-metrics-otlp-http";
11+
import { OTLPMetricExporter as OTLPProtoMetricExporter } from "@opentelemetry/exporter-metrics-otlp-proto";
12+
import { OTLPMetricExporter as OTLPHttpMetricExporter } from "@opentelemetry/exporter-metrics-otlp-http";
1213
import { MetricReader, PeriodicExportingMetricReader } from "@opentelemetry/sdk-metrics";
1314
import { OTLP_METRIC_EXPORTER_EXPORT_INTERVAL } from './types';
1415

@@ -62,7 +63,17 @@ export class AKSLoader extends AgentLoader {
6263
(process.env.OTEL_EXPORTER_OTLP_ENDPOINT || process.env.OTEL_EXPORTER_OTLP_METRICS_ENDPOINT)
6364
) {
6465
try {
65-
const otlpExporter = new OTLPMetricExporter();
66+
// Determine which exporter to use based on protocol setting
67+
const protocol = process.env.OTEL_EXPORTER_OTLP_METRICS_PROTOCOL ||
68+
process.env.OTEL_EXPORTER_OTLP_PROTOCOL;
69+
70+
let otlpExporter;
71+
if (protocol === 'http/json') {
72+
otlpExporter = new OTLPHttpMetricExporter();
73+
} else {
74+
// Use protobuf for 'http/protobuf', 'grpc', or any other value
75+
otlpExporter = new OTLPProtoMetricExporter();
76+
}
6677

6778
const otlpMetricReader = new PeriodicExportingMetricReader({
6879
exporter: otlpExporter,

test/unitTests/agent/aksLoader.tests.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,4 +183,33 @@ describe("agent/AKSLoader", () => {
183183
);
184184
assert.equal(azureMonitorExporters.length, 1, "Should have exactly one Azure Monitor metric exporter");
185185
});
186+
187+
it("constructor creates OTLP protobuf exporter when OTEL_EXPORTER_OTLP_METRICS_PROTOCOL is set to http/protobuf", () => {
188+
const env = {
189+
["APPLICATIONINSIGHTS_CONNECTION_STRING"]: "InstrumentationKey=1aa11111-bbbb-1ccc-8ddd-eeeeffff3333",
190+
["OTEL_METRICS_EXPORTER"]: "otlp",
191+
["OTEL_EXPORTER_OTLP_ENDPOINT"]: "http://localhost:4317",
192+
["OTEL_EXPORTER_OTLP_METRICS_PROTOCOL"]: "http/protobuf"
193+
};
194+
process.env = env;
195+
196+
const agent = new AKSLoader();
197+
198+
// Verify that metricReaders were added to the options
199+
const options = (agent as any)._options;
200+
assert.ok(options.metricReaders, "metricReaders should be present in options");
201+
assert.equal(options.metricReaders.length, 1, "Should have exactly one metric reader");
202+
203+
// Verify the metric reader is a PeriodicExportingMetricReader
204+
const metricReader = options.metricReaders[0];
205+
assert.equal(metricReader.constructor.name, "PeriodicExportingMetricReader", "Should be a PeriodicExportingMetricReader");
206+
207+
// Verify the exporter is an OTLP protobuf exporter
208+
const exporter = (metricReader as any)._exporter;
209+
assert.equal(exporter.constructor.name, "OTLPMetricExporter", "Should be an OTLPMetricExporter");
210+
211+
// Verify that it's the protobuf version by checking if it was imported from the proto package
212+
// The protobuf exporter should have different internal structure than the HTTP exporter
213+
assert.ok(exporter, "Protobuf exporter should exist");
214+
});
186215
});

0 commit comments

Comments
 (0)