Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,9 @@
"@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/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",
Expand Down
15 changes: 13 additions & 2 deletions src/agent/aksLoader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ 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 { OTLPMetricExporter as OTLPHttpMetricExporter } from "@opentelemetry/exporter-metrics-otlp-http";
import { MetricReader, PeriodicExportingMetricReader } from "@opentelemetry/sdk-metrics";
import { OTLP_METRIC_EXPORTER_EXPORT_INTERVAL } from './types';

Expand Down Expand Up @@ -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 OTLPMetricExporter();
// 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,
Expand Down
29 changes: 29 additions & 0 deletions test/unitTests/agent/aksLoader.tests.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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");
});
});
Loading