Skip to content

Commit 3007d3e

Browse files
authored
feat(exporters)!: rewrite exporter config logic (open-telemetry#4971)
1 parent 77f12c5 commit 3007d3e

File tree

63 files changed

+2722
-2759
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+2722
-2759
lines changed

experimental/CHANGELOG.md

+24
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,30 @@ All notable changes to experimental packages in this project will be documented
2222
* fix(sdk-events): remove devDependencies to old `@opentelemetry/[email protected]`, `@opentelemetry/[email protected]` packages [#5013](https://github.com/open-telemetry/opentelemetry-js/pull/5013) @pichlermarc
2323
* fix(sdk-logs): remove devDependencies to old `@opentelemetry/[email protected]` [#5013](https://github.com/open-telemetry/opentelemetry-js/pull/5013) @pichlermarc
2424
* fix(sdk-logs): align LogRecord#setAttribute type with types from `@opentelemetry/[email protected]` [#5013](https://github.com/open-telemetry/opentelemetry-js/pull/5013) @pichlermarc
25+
* feat(exporter-*-otlp-*)!: rewrite exporter config logic for testability [#4971](https://github.com/open-telemetry/opentelemetry-js/pull/4971) @pichlermarc
26+
* (user-facing) `getDefaultUrl` was intended for internal use has been removed from all exporters
27+
* (user-facing) `getUrlFromConfig` was intended for internal use and has been removed from all exporters
28+
* (user-facing) `hostname` was intended for internal use and has been removed from all exporters
29+
* (user-facing) `url` was intended for internal use and has been removed from all exporters
30+
* (user-facing) `timeoutMillis` was intended for internal use and has been removed from all exporters
31+
* (user-facing) `onInit` was intended for internal use and has been removed from all exporters
32+
* fix(exporter-*-otlp-*): fixes a bug where signal-specific environment variables would not be applied and the trace-specific one was used instead [#4971](https://github.com/open-telemetry/opentelemetry-js/pull/4971) @pichlermarc
33+
* Fixes:
34+
* `OTEL_EXPORTER_OTLP_METRICS_COMPRESSION`
35+
* `OTEL_EXPORTER_OTLP_LOGS_COMPRESSION`
36+
* `OTEL_EXPORTER_OTLP_METRICS_CLIENT_CERTIFICATE`
37+
* `OTEL_EXPORTER_OTLP_LOGS_CLIENT_CERTIFICATE`
38+
* `OTEL_EXPORTER_OTLP_METRICS_CLIENT_KEY`
39+
* `OTEL_EXPORTER_OTLP_LOGS_CLIENT_KEY`
40+
* `OTEL_EXPORTER_OTLP_METRICS_INSECURE`
41+
* `OTEL_EXPORTER_OTLP_LOGS_INSECURE`
42+
* feat(otlp-exporter-base)!: do not export functions that are intended for internal use [#4971](https://github.com/open-telemetry/opentelemetry-js/pull/4971) @pichlermarc
43+
* Drops the following functions and types that were intended for internal use from the package exports:
44+
* `parseHeaders`
45+
* `appendResourcePathToUrl`
46+
* `appendResourcePathToUrlIfNeeded`
47+
* `configureExporterTimeout`
48+
* `invalidTimeout`
2549

2650
### :books: (Refine Doc)
2751

experimental/packages/exporter-logs-otlp-grpc/src/OTLPLogExporter.ts

+2-32
Original file line numberDiff line numberDiff line change
@@ -15,22 +15,14 @@
1515
*/
1616

1717
import { LogRecordExporter, ReadableLogRecord } from '@opentelemetry/sdk-logs';
18-
import { baggageUtils, getEnv } from '@opentelemetry/core';
1918
import {
2019
OTLPGRPCExporterConfigNode,
2120
OTLPGRPCExporterNodeBase,
22-
validateAndNormalizeUrl,
23-
DEFAULT_COLLECTOR_URL,
2421
} from '@opentelemetry/otlp-grpc-exporter-base';
2522
import {
2623
IExportLogsServiceResponse,
2724
ProtobufLogsSerializer,
2825
} from '@opentelemetry/otlp-transformer';
29-
import { VERSION } from './version';
30-
31-
const USER_AGENT = {
32-
'User-Agent': `OTel-OTLP-Exporter-JavaScript/${VERSION}`,
33-
};
3426

3527
/**
3628
* OTLP Logs Exporter for Node
@@ -43,34 +35,12 @@ export class OTLPLogExporter
4335
implements LogRecordExporter
4436
{
4537
constructor(config: OTLPGRPCExporterConfigNode = {}) {
46-
const signalSpecificMetadata = {
47-
...USER_AGENT,
48-
...baggageUtils.parseKeyPairsIntoRecord(
49-
getEnv().OTEL_EXPORTER_OTLP_LOGS_HEADERS
50-
),
51-
};
5238
super(
5339
config,
54-
signalSpecificMetadata,
40+
ProtobufLogsSerializer,
5541
'LogsExportService',
5642
'/opentelemetry.proto.collector.logs.v1.LogsService/Export',
57-
ProtobufLogsSerializer
58-
);
59-
}
60-
61-
getDefaultUrl(config: OTLPGRPCExporterConfigNode) {
62-
return validateAndNormalizeUrl(this.getUrlFromConfig(config));
63-
}
64-
65-
getUrlFromConfig(config: OTLPGRPCExporterConfigNode): string {
66-
if (typeof config.url === 'string') {
67-
return config.url;
68-
}
69-
70-
return (
71-
getEnv().OTEL_EXPORTER_OTLP_LOGS_ENDPOINT ||
72-
getEnv().OTEL_EXPORTER_OTLP_ENDPOINT ||
73-
DEFAULT_COLLECTOR_URL
43+
'LOGS'
7444
);
7545
}
7646
}

experimental/packages/exporter-logs-otlp-grpc/test/OTLPLogExporter.test.ts

-96
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ import {
3737
IExportLogsServiceRequest,
3838
IResourceLogs,
3939
} from '@opentelemetry/otlp-transformer';
40-
import { VERSION } from '../src/version';
4140

4241
const logsServiceProtoPath =
4342
'opentelemetry/proto/collector/logs/v1/logs_service.proto';
@@ -294,104 +293,9 @@ const testCollectorExporter = (params: TestParams) => {
294293
}, 500);
295294
});
296295
});
297-
describe('Logs Exporter with compression', () => {
298-
const envSource = process.env;
299-
it('should return gzip compression algorithm on exporter', () => {
300-
const credentials = useTLS
301-
? grpc.credentials.createSsl(
302-
fs.readFileSync('./test/certs/ca.crt'),
303-
fs.readFileSync('./test/certs/client.key'),
304-
fs.readFileSync('./test/certs/client.crt')
305-
)
306-
: grpc.credentials.createInsecure();
307-
308-
envSource.OTEL_EXPORTER_OTLP_COMPRESSION = 'gzip';
309-
collectorExporter = new OTLPLogExporter({
310-
url: address,
311-
credentials,
312-
metadata: metadata,
313-
});
314-
assert.strictEqual(
315-
collectorExporter.compression,
316-
CompressionAlgorithm.GZIP
317-
);
318-
delete envSource.OTEL_EXPORTER_OTLP_COMPRESSION;
319-
});
320-
});
321296
});
322297
};
323298

324-
describe('OTLPLogExporter - node (getDefaultUrl)', () => {
325-
it('should default to localhost', done => {
326-
const collectorExporter = new OTLPLogExporter({});
327-
setTimeout(() => {
328-
assert.strictEqual(collectorExporter['url'], 'localhost:4317');
329-
done();
330-
});
331-
});
332-
it('should keep the URL if included', done => {
333-
const url = 'http://foo.bar.com';
334-
const collectorExporter = new OTLPLogExporter({ url });
335-
setTimeout(() => {
336-
assert.strictEqual(collectorExporter['url'], 'foo.bar.com');
337-
done();
338-
});
339-
});
340-
});
341-
342-
describe('when configuring via environment', () => {
343-
const envSource = process.env;
344-
345-
afterEach(function () {
346-
// Ensure we don't pollute other tests if assertions fail
347-
delete envSource.OTEL_EXPORTER_OTLP_ENDPOINT;
348-
delete envSource.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT;
349-
delete envSource.OTEL_EXPORTER_OTLP_HEADERS;
350-
delete envSource.OTEL_EXPORTER_OTLP_LOGS_HEADERS;
351-
sinon.restore();
352-
});
353-
354-
it('should use url defined in env', () => {
355-
envSource.OTEL_EXPORTER_OTLP_ENDPOINT = 'http://foo.bar';
356-
const collectorExporter = new OTLPLogExporter();
357-
assert.strictEqual(collectorExporter.url, 'foo.bar');
358-
});
359-
it('should override global exporter url with signal url defined in env', () => {
360-
envSource.OTEL_EXPORTER_OTLP_ENDPOINT = 'http://foo.bar';
361-
envSource.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT = 'http://foo.logs';
362-
const collectorExporter = new OTLPLogExporter();
363-
assert.strictEqual(collectorExporter.url, 'foo.logs');
364-
});
365-
it('should include user-agent header by default', () => {
366-
const collectorExporter = new OTLPLogExporter();
367-
const actualMetadata =
368-
collectorExporter['_transport']['_parameters'].metadata();
369-
assert.deepStrictEqual(actualMetadata.get('User-Agent'), [
370-
`OTel-OTLP-Exporter-JavaScript/${VERSION}`,
371-
]);
372-
});
373-
it('should use headers defined via env', () => {
374-
envSource.OTEL_EXPORTER_OTLP_HEADERS = 'foo=bar';
375-
const collectorExporter = new OTLPLogExporter();
376-
const actualMetadata =
377-
collectorExporter['_transport']['_parameters'].metadata();
378-
assert.deepStrictEqual(actualMetadata.get('foo'), ['bar']);
379-
});
380-
it('should not override hard-coded headers config with headers defined via env', () => {
381-
const metadata = new grpc.Metadata();
382-
metadata.set('foo', 'bar');
383-
metadata.set('goo', 'lol');
384-
envSource.OTEL_EXPORTER_OTLP_HEADERS = 'foo=jar,bar=foo';
385-
envSource.OTEL_EXPORTER_OTLP_LOGS_HEADERS = 'foo=boo';
386-
const collectorExporter = new OTLPLogExporter({ metadata });
387-
const actualMetadata =
388-
collectorExporter['_transport']['_parameters'].metadata();
389-
assert.deepStrictEqual(actualMetadata.get('foo'), ['bar']);
390-
assert.deepStrictEqual(actualMetadata.get('goo'), ['lol']);
391-
assert.deepStrictEqual(actualMetadata.get('bar'), ['foo']);
392-
});
393-
});
394-
395299
testCollectorExporter({ useTLS: true });
396300
testCollectorExporter({ useTLS: false });
397301
testCollectorExporter({ metadata });

experimental/packages/exporter-logs-otlp-http/src/platform/browser/OTLPLogExporter.ts

+4-7
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@ import type { IExportLogsServiceResponse } from '@opentelemetry/otlp-transformer
2323
import { OTLPExporterBrowserBase } from '@opentelemetry/otlp-exporter-base';
2424
import { JsonLogsSerializer } from '@opentelemetry/otlp-transformer';
2525

26-
import { getDefaultUrl } from '../config';
27-
2826
/**
2927
* Collector Logs Exporter for Web
3028
*/
@@ -38,11 +36,10 @@ export class OTLPLogExporter
3836
...config,
3937
},
4038
JsonLogsSerializer,
41-
'application/json'
39+
{
40+
'Content-Type': 'application/json',
41+
},
42+
'v1/logs'
4243
);
4344
}
44-
45-
getDefaultUrl(config: OTLPExporterConfigBase): string {
46-
return getDefaultUrl(config);
47-
}
4845
}

experimental/packages/exporter-logs-otlp-http/src/platform/config.ts

-50
This file was deleted.

experimental/packages/exporter-logs-otlp-http/src/platform/node/OTLPLogExporter.ts

+4-17
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,9 @@ import type {
2020
} from '@opentelemetry/sdk-logs';
2121
import type { OTLPExporterNodeConfigBase } from '@opentelemetry/otlp-exporter-base';
2222
import type { IExportLogsServiceResponse } from '@opentelemetry/otlp-transformer';
23-
import { getEnv, baggageUtils } from '@opentelemetry/core';
24-
import {
25-
OTLPExporterNodeBase,
26-
parseHeaders,
27-
} from '@opentelemetry/otlp-exporter-base';
23+
import { OTLPExporterNodeBase } from '@opentelemetry/otlp-exporter-base';
2824
import { JsonLogsSerializer } from '@opentelemetry/otlp-transformer';
2925

30-
import { getDefaultUrl } from '../config';
3126
import { VERSION } from '../../version';
3227

3328
const USER_AGENT = {
@@ -42,25 +37,17 @@ export class OTLPLogExporter
4237
implements LogRecordExporter
4338
{
4439
constructor(config: OTLPExporterNodeConfigBase = {}) {
45-
// load OTEL_EXPORTER_OTLP_LOGS_TIMEOUT env
4640
super(
4741
{
48-
timeoutMillis: getEnv().OTEL_EXPORTER_OTLP_LOGS_TIMEOUT,
4942
...config,
5043
},
5144
JsonLogsSerializer,
5245
{
53-
...baggageUtils.parseKeyPairsIntoRecord(
54-
getEnv().OTEL_EXPORTER_OTLP_LOGS_HEADERS
55-
),
56-
...parseHeaders(config?.headers),
5746
...USER_AGENT,
5847
'Content-Type': 'application/json',
59-
}
48+
},
49+
'LOGS',
50+
'v1/logs'
6051
);
6152
}
62-
63-
getDefaultUrl(config: OTLPExporterNodeConfigBase): string {
64-
return getDefaultUrl(config);
65-
}
6653
}

experimental/packages/exporter-logs-otlp-http/test/browser/OTLPLogExporter.test.ts

-11
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
import * as assert from 'assert';
1717
import * as sinon from 'sinon';
1818

19-
import * as Config from '../../src/platform/config';
2019
import { OTLPLogExporter } from '../../src/platform/browser';
2120
import { OTLPExporterConfigBase } from '@opentelemetry/otlp-exporter-base';
2221
import { ReadableLogRecord } from '@opentelemetry/sdk-logs';
@@ -38,16 +37,6 @@ describe('OTLPLogExporter', () => {
3837
});
3938
});
4039

41-
describe('getDefaultUrl', () => {
42-
it('should call getDefaultUrl', () => {
43-
const getDefaultUrl = sinon.stub(Config, 'getDefaultUrl');
44-
const exporter = new OTLPLogExporter();
45-
exporter.getDefaultUrl({});
46-
// this callCount is 2, because new OTLPLogExporter also call it
47-
assert.strictEqual(getDefaultUrl.callCount, 2);
48-
});
49-
});
50-
5140
describe('export - common', () => {
5241
let spySend: any;
5342
beforeEach(() => {

0 commit comments

Comments
 (0)