Skip to content

Commit 2276e4f

Browse files
vreynoldsvmarchauddyladan
authored
feat: otlp-grpc exporter uses headers environment variables (#2304)
* feat: otlp-grpc exporter uses headers environment variables * chore: smaller import radius Co-authored-by: Valentin Marchaud <[email protected]> Co-authored-by: Daniel Dyla <[email protected]>
1 parent 8f2209f commit 2276e4f

File tree

5 files changed

+69
-4
lines changed

5 files changed

+69
-4
lines changed

packages/opentelemetry-exporter-collector-grpc/src/CollectorExporterNodeBase.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,14 @@ import {
1919
CollectorExporterBase,
2020
collectorTypes,
2121
} from '@opentelemetry/exporter-collector';
22-
import type { Metadata } from '@grpc/grpc-js';
22+
import { Metadata } from '@grpc/grpc-js';
2323
import {
2424
CollectorExporterConfigNode,
2525
GRPCQueueItem,
2626
ServiceClientType,
2727
} from './types';
2828
import { ServiceClient } from './types';
29+
import { getEnv, baggageUtils } from "@opentelemetry/core";
2930

3031
/**
3132
* Collector Metric Exporter abstract base class
@@ -48,8 +49,13 @@ export abstract class CollectorExporterNodeBase<
4849
if (config.headers) {
4950
diag.warn('Headers cannot be set when using grpc');
5051
}
51-
this.metadata = config.metadata;
52+
const headers = baggageUtils.parseKeyPairsIntoRecord(getEnv().OTEL_EXPORTER_OTLP_HEADERS);
53+
this.metadata = config.metadata || new Metadata();
54+
for (const [k, v] of Object.entries(headers)) {
55+
this.metadata.set(k, v)
56+
}
5257
}
58+
5359
private _sendPromise(
5460
objects: ExportItem[],
5561
onSuccess: () => void,

packages/opentelemetry-exporter-collector-grpc/src/CollectorMetricExporter.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,9 @@ import {
2121
import { MetricRecord, MetricExporter } from '@opentelemetry/metrics';
2222
import { CollectorExporterConfigNode, ServiceClientType } from './types';
2323
import { CollectorExporterNodeBase } from './CollectorExporterNodeBase';
24-
import { getEnv } from '@opentelemetry/core';
24+
import { baggageUtils, getEnv } from '@opentelemetry/core';
2525
import { validateAndNormalizeUrl } from './util';
26+
import { Metadata } from "@grpc/grpc-js";
2627

2728
const DEFAULT_COLLECTOR_URL = 'localhost:4317';
2829

@@ -38,6 +39,15 @@ export class CollectorMetricExporter
3839
// Converts time to nanoseconds
3940
protected readonly _startTime = new Date().getTime() * 1000000;
4041

42+
constructor(config: CollectorExporterConfigNode = {}) {
43+
super(config);
44+
const headers = baggageUtils.parseKeyPairsIntoRecord(getEnv().OTEL_EXPORTER_OTLP_METRICS_HEADERS);
45+
this.metadata ||= new Metadata();
46+
for (const [k, v] of Object.entries(headers)) {
47+
this.metadata.set(k, v)
48+
}
49+
}
50+
4151
convert(
4252
metrics: MetricRecord[]
4353
): collectorTypes.opentelemetryProto.collector.metrics.v1.ExportMetricsServiceRequest {

packages/opentelemetry-exporter-collector-grpc/src/CollectorTraceExporter.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,9 @@ import {
2121
toCollectorExportTraceServiceRequest,
2222
} from '@opentelemetry/exporter-collector';
2323
import { CollectorExporterConfigNode, ServiceClientType } from './types';
24-
import { getEnv } from '@opentelemetry/core';
24+
import { baggageUtils, getEnv } from '@opentelemetry/core';
2525
import { validateAndNormalizeUrl } from './util';
26+
import { Metadata } from "@grpc/grpc-js";
2627

2728
const DEFAULT_COLLECTOR_URL = 'localhost:4317';
2829

@@ -35,6 +36,16 @@ export class CollectorTraceExporter
3536
collectorTypes.opentelemetryProto.collector.trace.v1.ExportTraceServiceRequest
3637
>
3738
implements SpanExporter {
39+
40+
constructor(config: CollectorExporterConfigNode = {}) {
41+
super(config);
42+
const headers = baggageUtils.parseKeyPairsIntoRecord(getEnv().OTEL_EXPORTER_OTLP_TRACES_HEADERS);
43+
this.metadata ||= new Metadata();
44+
for (const [k, v] of Object.entries(headers)) {
45+
this.metadata.set(k, v)
46+
}
47+
}
48+
3849
convert(
3950
spans: ReadableSpan[]
4051
): collectorTypes.opentelemetryProto.collector.trace.v1.ExportTraceServiceRequest {

packages/opentelemetry-exporter-collector-grpc/test/CollectorMetricExporter.test.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,25 @@ describe('when configuring via environment', () => {
278278
envSource.OTEL_EXPORTER_OTLP_ENDPOINT = '';
279279
envSource.OTEL_EXPORTER_OTLP_METRICS_ENDPOINT = '';
280280
});
281+
it('should use headers defined via env', () => {
282+
envSource.OTEL_EXPORTER_OTLP_HEADERS = 'foo=bar';
283+
const collectorExporter = new CollectorMetricExporter();
284+
assert.deepStrictEqual(collectorExporter.metadata?.get('foo'), ['bar']);
285+
envSource.OTEL_EXPORTER_OTLP_HEADERS = '';
286+
});
287+
it('should override global headers config with signal headers defined via env', () => {
288+
const metadata = new grpc.Metadata();
289+
metadata.set('foo', 'bar');
290+
metadata.set('goo', 'lol');
291+
envSource.OTEL_EXPORTER_OTLP_HEADERS = 'foo=jar,bar=foo';
292+
envSource.OTEL_EXPORTER_OTLP_METRICS_HEADERS = 'foo=boo';
293+
const collectorExporter = new CollectorMetricExporter({ metadata });
294+
assert.deepStrictEqual(collectorExporter.metadata?.get('foo'), ['boo']);
295+
assert.deepStrictEqual(collectorExporter.metadata?.get('bar'), ['foo']);
296+
assert.deepStrictEqual(collectorExporter.metadata?.get('goo'), ['lol']);
297+
envSource.OTEL_EXPORTER_OTLP_METRICS_HEADERS = '';
298+
envSource.OTEL_EXPORTER_OTLP_HEADERS = '';
299+
});
281300
});
282301

283302
testCollectorMetricExporter({ useTLS: true });

packages/opentelemetry-exporter-collector-grpc/test/CollectorTraceExporter.test.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,25 @@ describe('when configuring via environment', () => {
240240
envSource.OTEL_EXPORTER_OTLP_ENDPOINT = '';
241241
envSource.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT = '';
242242
});
243+
it('should use headers defined via env', () => {
244+
envSource.OTEL_EXPORTER_OTLP_HEADERS = 'foo=bar';
245+
const collectorExporter = new CollectorTraceExporter();
246+
assert.deepStrictEqual(collectorExporter.metadata?.get('foo'), ['bar']);
247+
envSource.OTEL_EXPORTER_OTLP_HEADERS = '';
248+
});
249+
it('should override global headers config with signal headers defined via env', () => {
250+
const metadata = new grpc.Metadata();
251+
metadata.set('foo', 'bar');
252+
metadata.set('goo', 'lol');
253+
envSource.OTEL_EXPORTER_OTLP_HEADERS = 'foo=jar,bar=foo';
254+
envSource.OTEL_EXPORTER_OTLP_TRACES_HEADERS = 'foo=boo';
255+
const collectorExporter = new CollectorTraceExporter({ metadata });
256+
assert.deepStrictEqual(collectorExporter.metadata?.get('foo'), ['boo']);
257+
assert.deepStrictEqual(collectorExporter.metadata?.get('bar'), ['foo']);
258+
assert.deepStrictEqual(collectorExporter.metadata?.get('goo'), ['lol']);
259+
envSource.OTEL_EXPORTER_OTLP_TRACES_HEADERS = '';
260+
envSource.OTEL_EXPORTER_OTLP_HEADERS = '';
261+
});
243262
});
244263

245264
testCollectorExporter({ useTLS: true });

0 commit comments

Comments
 (0)