Skip to content

Commit 44730d2

Browse files
pichlermarcZirak
authored andcommitted
feat!: move serialization to @opentelemetry/otlp-transformer (open-telemetry#4542)
* feat!:move serializers to otlp-transformer * feat!: use serializeres in protobuf and json exporters * test(otlp-transformer): add tests for trace serializer * test(otlp-transformer): add tests for metrics serializer * test(otlp-transformer): add tests for logs serializer * chore: resolve more conflicts * fix: sync package-lock * chore: cleanup dependencies, unused code, .gitignore * chore: fix changelog indentation * fix(otlp-transformer): remove unused useHex from JsonMetricsSerializer * chore: add comment about how logs data is structured * docs: move submodule.md, adapt contents * fixup! Merge branch 'main' into feat/transformer-serializer * fixup! Merge branch 'main' into feat/transformer-serializer
1 parent e547c35 commit 44730d2

File tree

51 files changed

+1330
-791
lines changed

Some content is hidden

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

51 files changed

+1330
-791
lines changed

.gitmodules

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
[submodule "experimental/packages/otlp-grpc-exporter-base/protos"]
2-
path = experimental/packages/otlp-grpc-exporter-base/protos
3-
url = https://github.com/open-telemetry/opentelemetry-proto.git
41
[submodule "experimental/packages/otlp-proto-exporter-base/protos"]
52
path = experimental/packages/otlp-proto-exporter-base/protos
63
url = https://github.com/open-telemetry/opentelemetry-proto.git
4+
[submodule "experimental/packages/otlp-transformer/protos"]
5+
path = experimental/packages/otlp-transformer/protos
6+
url = https://github.com/open-telemetry/opentelemetry-proto.git

experimental/CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@ All notable changes to experimental packages in this project will be documented
66

77
### :boom: Breaking Change
88

9+
* feat(exporter-*-otlp-*)!: move serialization for Node.js exporters to `@opentelemetry/otlp-transformer` [#4542](https://github.com/open-telemetry/opentelemetry-js/pull/4542) @pichlermarc
10+
* Breaking changes:
11+
* (user-facing) `convert()` now returns an empty object and will be removed in a follow-up
12+
* (internal) OTLPExporterNodeBase now has additional constructor parameters that are required
13+
* (internal) OTLPExporterNodeBase now has an additional `ResponseType` type parameter
14+
915
### :rocket: (Enhancement)
1016

1117
### :bug: (Bug Fix)

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

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,11 @@ import {
2121
OTLPGRPCExporterNodeBase,
2222
validateAndNormalizeUrl,
2323
DEFAULT_COLLECTOR_URL,
24-
LogsSerializer,
2524
} from '@opentelemetry/otlp-grpc-exporter-base';
2625
import {
27-
createExportLogsServiceRequest,
2826
IExportLogsServiceRequest,
2927
IExportLogsServiceResponse,
28+
ProtobufLogsSerializer,
3029
} from '@opentelemetry/otlp-transformer';
3130
import { VERSION } from './version';
3231

@@ -57,14 +56,10 @@ export class OTLPLogExporter
5756
signalSpecificMetadata,
5857
'LogsExportService',
5958
'/opentelemetry.proto.collector.logs.v1.LogsService/Export',
60-
LogsSerializer
59+
ProtobufLogsSerializer
6160
);
6261
}
6362

64-
convert(logRecords: ReadableLogRecord[]): IExportLogsServiceRequest {
65-
return createExportLogsServiceRequest(logRecords);
66-
}
67-
6863
getDefaultUrl(config: OTLPGRPCExporterConfigNode) {
6964
return validateAndNormalizeUrl(this.getUrlFromConfig(config));
7065
}

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,7 @@ import { VERSION } from '../src/version';
4040

4141
const logsServiceProtoPath =
4242
'opentelemetry/proto/collector/logs/v1/logs_service.proto';
43-
const includeDirs = [
44-
path.resolve(__dirname, '../../otlp-grpc-exporter-base/protos'),
45-
];
43+
const includeDirs = [path.resolve(__dirname, '../../otlp-transformer/protos')];
4644

4745
const httpAddr = 'https://localhost:1503';
4846
const udsAddr = 'unix:///tmp/otlp-logs.sock';

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

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,16 @@ import type {
1919
LogRecordExporter,
2020
} from '@opentelemetry/sdk-logs';
2121
import type { OTLPExporterNodeConfigBase } from '@opentelemetry/otlp-exporter-base';
22-
import type { IExportLogsServiceRequest } from '@opentelemetry/otlp-transformer';
22+
import type {
23+
IExportLogsServiceRequest,
24+
IExportLogsServiceResponse,
25+
} from '@opentelemetry/otlp-transformer';
2326
import { getEnv, baggageUtils } from '@opentelemetry/core';
2427
import {
2528
OTLPExporterNodeBase,
2629
parseHeaders,
2730
} from '@opentelemetry/otlp-exporter-base';
28-
import { createExportLogsServiceRequest } from '@opentelemetry/otlp-transformer';
31+
import { JsonLogsSerializer } from '@opentelemetry/otlp-transformer';
2932

3033
import { getDefaultUrl } from '../config';
3134
import { VERSION } from '../../version';
@@ -38,15 +41,23 @@ const USER_AGENT = {
3841
* Collector Logs Exporter for Node
3942
*/
4043
export class OTLPLogExporter
41-
extends OTLPExporterNodeBase<ReadableLogRecord, IExportLogsServiceRequest>
44+
extends OTLPExporterNodeBase<
45+
ReadableLogRecord,
46+
IExportLogsServiceRequest,
47+
IExportLogsServiceResponse
48+
>
4249
implements LogRecordExporter
4350
{
4451
constructor(config: OTLPExporterNodeConfigBase = {}) {
4552
// load OTEL_EXPORTER_OTLP_LOGS_TIMEOUT env
46-
super({
47-
timeoutMillis: getEnv().OTEL_EXPORTER_OTLP_LOGS_TIMEOUT,
48-
...config,
49-
});
53+
super(
54+
{
55+
timeoutMillis: getEnv().OTEL_EXPORTER_OTLP_LOGS_TIMEOUT,
56+
...config,
57+
},
58+
JsonLogsSerializer,
59+
'application/json'
60+
);
5061
this.headers = {
5162
...this.headers,
5263
...USER_AGENT,
@@ -57,13 +68,6 @@ export class OTLPLogExporter
5768
};
5869
}
5970

60-
convert(logRecords: ReadableLogRecord[]): IExportLogsServiceRequest {
61-
return createExportLogsServiceRequest(logRecords, {
62-
useHex: true,
63-
useLongBits: false,
64-
});
65-
}
66-
6771
getDefaultUrl(config: OTLPExporterNodeConfigBase): string {
6872
return getDefaultUrl(config);
6973
}

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

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,14 @@ import {
1919
OTLPExporterConfigBase,
2020
appendResourcePathToUrl,
2121
appendRootPathToUrlIfNeeded,
22+
OTLPExporterNodeBase,
2223
parseHeaders,
2324
} from '@opentelemetry/otlp-exporter-base';
25+
import { ServiceClientType } from '@opentelemetry/otlp-proto-exporter-base';
2426
import {
25-
OTLPProtoExporterNodeBase,
26-
ServiceClientType,
27-
} from '@opentelemetry/otlp-proto-exporter-base';
28-
import {
29-
createExportLogsServiceRequest,
3027
IExportLogsServiceRequest,
28+
IExportLogsServiceResponse,
29+
ProtobufLogsSerializer,
3130
} from '@opentelemetry/otlp-transformer';
3231

3332
import { ReadableLogRecord, LogRecordExporter } from '@opentelemetry/sdk-logs';
@@ -44,14 +43,15 @@ const DEFAULT_COLLECTOR_URL = `http://localhost:4318/${DEFAULT_COLLECTOR_RESOURC
4443
* Collector Trace Exporter for Node
4544
*/
4645
export class OTLPLogExporter
47-
extends OTLPProtoExporterNodeBase<
46+
extends OTLPExporterNodeBase<
4847
ReadableLogRecord,
49-
IExportLogsServiceRequest
48+
IExportLogsServiceRequest,
49+
IExportLogsServiceResponse
5050
>
5151
implements LogRecordExporter
5252
{
5353
constructor(config: OTLPExporterConfigBase = {}) {
54-
super(config);
54+
super(config, ProtobufLogsSerializer, 'application/x-protobuf');
5555
this.headers = {
5656
...this.headers,
5757
...USER_AGENT,
@@ -61,9 +61,6 @@ export class OTLPLogExporter
6161
...parseHeaders(config?.headers),
6262
};
6363
}
64-
convert(logs: ReadableLogRecord[]): IExportLogsServiceRequest {
65-
return createExportLogsServiceRequest(logs);
66-
}
6764

6865
getDefaultUrl(config: OTLPExporterConfigBase): string {
6966
return typeof config.url === 'string'

experimental/packages/exporter-logs-otlp-proto/test/node/OTLPLogExporter.test.ts

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -193,8 +193,6 @@ describe('OTLPLogExporter - node with proto over http', () => {
193193
});
194194

195195
it('should open the connection', done => {
196-
collectorExporter.export(logs, () => {});
197-
198196
sinon.stub(http, 'request').callsFake((options: any, cb: any) => {
199197
assert.strictEqual(options.hostname, 'foo.bar.com');
200198
assert.strictEqual(options.method, 'POST');
@@ -206,11 +204,10 @@ describe('OTLPLogExporter - node with proto over http', () => {
206204
done();
207205
return fakeRequest as any;
208206
});
207+
collectorExporter.export(logs, () => {});
209208
});
210209

211210
it('should set custom headers', done => {
212-
collectorExporter.export(logs, () => {});
213-
214211
sinon.stub(http, 'request').callsFake((options: any, cb: any) => {
215212
assert.strictEqual(options.headers['foo'], 'bar');
216213

@@ -220,11 +217,10 @@ describe('OTLPLogExporter - node with proto over http', () => {
220217
done();
221218
return fakeRequest as any;
222219
});
220+
collectorExporter.export(logs, () => {});
223221
});
224222

225223
it('should have keep alive and keepAliveMsecs option set', done => {
226-
collectorExporter.export(logs, () => {});
227-
228224
sinon.stub(http, 'request').callsFake((options: any, cb: any) => {
229225
assert.strictEqual(options.agent.keepAlive, true);
230226
assert.strictEqual(options.agent.options.keepAliveMsecs, 2000);
@@ -235,6 +231,7 @@ describe('OTLPLogExporter - node with proto over http', () => {
235231
done();
236232
return fakeRequest as any;
237233
});
234+
collectorExporter.export(logs, () => {});
238235
});
239236

240237
it('should successfully send the logs', done => {
@@ -271,35 +268,35 @@ describe('OTLPLogExporter - node with proto over http', () => {
271268
// Need to stub/spy on the underlying logger as the "diag" instance is global
272269
const spyLoggerError = sinon.stub(diag, 'error');
273270

274-
collectorExporter.export(logs, result => {
275-
assert.strictEqual(result.code, ExportResultCode.SUCCESS);
276-
assert.strictEqual(spyLoggerError.args.length, 0);
277-
done();
278-
});
279-
280271
sinon.stub(http, 'request').callsFake((options: any, cb: any) => {
281272
const mockRes = new MockedResponse(200);
282273
cb(mockRes);
283274
mockRes.send('success');
284275
return fakeRequest as any;
285276
});
286-
});
287277

288-
it('should log the error message', done => {
289278
collectorExporter.export(logs, result => {
290-
assert.strictEqual(result.code, ExportResultCode.FAILED);
291-
// @ts-expect-error verify error code
292-
assert.strictEqual(result.error.code, 400);
279+
assert.strictEqual(result.code, ExportResultCode.SUCCESS);
280+
assert.strictEqual(spyLoggerError.args.length, 0);
293281
done();
294282
});
283+
});
295284

285+
it('should log the error message', done => {
296286
sinon.stub(http, 'request').callsFake((options: any, cb: any) => {
297287
const mockResError = new MockedResponse(400);
298288
cb(mockResError);
299289
mockResError.send('failed');
300290

301291
return fakeRequest as any;
302292
});
293+
294+
collectorExporter.export(logs, result => {
295+
assert.strictEqual(result.code, ExportResultCode.FAILED);
296+
// @ts-expect-error verify error code
297+
assert.strictEqual(result.error.code, 400);
298+
done();
299+
});
303300
});
304301
});
305302
describe('export - with compression', () => {

experimental/packages/exporter-trace-otlp-grpc/src/OTLPTraceExporter.ts

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,11 @@ import {
2121
OTLPGRPCExporterNodeBase,
2222
validateAndNormalizeUrl,
2323
DEFAULT_COLLECTOR_URL,
24-
TraceSerializer,
2524
} from '@opentelemetry/otlp-grpc-exporter-base';
2625
import {
27-
createExportTraceServiceRequest,
2826
IExportTraceServiceRequest,
2927
IExportTraceServiceResponse,
28+
ProtobufTraceSerializer,
3029
} from '@opentelemetry/otlp-transformer';
3130
import { VERSION } from './version';
3231

@@ -57,14 +56,10 @@ export class OTLPTraceExporter
5756
signalSpecificMetadata,
5857
'TraceExportService',
5958
'/opentelemetry.proto.collector.trace.v1.TraceService/Export',
60-
TraceSerializer
59+
ProtobufTraceSerializer
6160
);
6261
}
6362

64-
convert(spans: ReadableSpan[]): IExportTraceServiceRequest {
65-
return createExportTraceServiceRequest(spans);
66-
}
67-
6863
getDefaultUrl(config: OTLPGRPCExporterConfigNode) {
6964
return validateAndNormalizeUrl(this.getUrlFromConfig(config));
7065
}

experimental/packages/exporter-trace-otlp-grpc/test/OTLPTraceExporter.test.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,7 @@ import {
4444

4545
const traceServiceProtoPath =
4646
'opentelemetry/proto/collector/trace/v1/trace_service.proto';
47-
const includeDirs = [
48-
path.resolve(__dirname, '../../otlp-grpc-exporter-base/protos'),
49-
];
47+
const includeDirs = [path.resolve(__dirname, '../../otlp-transformer/protos')];
5048

5149
const httpAddr = 'https://localhost:1501';
5250
const udsAddr = 'unix:///tmp/otlp-traces.sock';

experimental/packages/exporter-trace-otlp-http/src/platform/node/OTLPTraceExporter.ts

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,11 @@ import {
2626
appendRootPathToUrlIfNeeded,
2727
} from '@opentelemetry/otlp-exporter-base';
2828
import {
29-
createExportTraceServiceRequest,
3029
IExportTraceServiceRequest,
30+
IExportTraceServiceResponse,
3131
} from '@opentelemetry/otlp-transformer';
3232
import { VERSION } from '../../version';
33+
import { JsonTraceSerializer } from '@opentelemetry/otlp-transformer';
3334

3435
const DEFAULT_COLLECTOR_RESOURCE_PATH = 'v1/traces';
3536
const DEFAULT_COLLECTOR_URL = `http://localhost:4318/${DEFAULT_COLLECTOR_RESOURCE_PATH}`;
@@ -41,11 +42,15 @@ const USER_AGENT = {
4142
* Collector Trace Exporter for Node
4243
*/
4344
export class OTLPTraceExporter
44-
extends OTLPExporterNodeBase<ReadableSpan, IExportTraceServiceRequest>
45+
extends OTLPExporterNodeBase<
46+
ReadableSpan,
47+
IExportTraceServiceRequest,
48+
IExportTraceServiceResponse
49+
>
4550
implements SpanExporter
4651
{
4752
constructor(config: OTLPExporterNodeConfigBase = {}) {
48-
super(config);
53+
super(config, JsonTraceSerializer, 'application/json');
4954
this.headers = {
5055
...this.headers,
5156
...USER_AGENT,
@@ -56,13 +61,6 @@ export class OTLPTraceExporter
5661
};
5762
}
5863

59-
convert(spans: ReadableSpan[]): IExportTraceServiceRequest {
60-
return createExportTraceServiceRequest(spans, {
61-
useHex: true,
62-
useLongBits: false,
63-
});
64-
}
65-
6664
getDefaultUrl(config: OTLPExporterNodeConfigBase): string {
6765
return typeof config.url === 'string'
6866
? config.url

experimental/packages/exporter-trace-otlp-proto/src/platform/node/OTLPTraceExporter.ts

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,14 @@ import {
2020
OTLPExporterNodeConfigBase,
2121
appendResourcePathToUrl,
2222
appendRootPathToUrlIfNeeded,
23+
OTLPExporterNodeBase,
2324
parseHeaders,
2425
} from '@opentelemetry/otlp-exporter-base';
26+
import { ServiceClientType } from '@opentelemetry/otlp-proto-exporter-base';
2527
import {
26-
OTLPProtoExporterNodeBase,
27-
ServiceClientType,
28-
} from '@opentelemetry/otlp-proto-exporter-base';
29-
import {
30-
createExportTraceServiceRequest,
3128
IExportTraceServiceRequest,
29+
IExportTraceServiceResponse,
30+
ProtobufTraceSerializer,
3231
} from '@opentelemetry/otlp-transformer';
3332
import { VERSION } from '../../version';
3433

@@ -42,11 +41,15 @@ const USER_AGENT = {
4241
* Collector Trace Exporter for Node with protobuf
4342
*/
4443
export class OTLPTraceExporter
45-
extends OTLPProtoExporterNodeBase<ReadableSpan, IExportTraceServiceRequest>
44+
extends OTLPExporterNodeBase<
45+
ReadableSpan,
46+
IExportTraceServiceRequest,
47+
IExportTraceServiceResponse
48+
>
4649
implements SpanExporter
4750
{
4851
constructor(config: OTLPExporterNodeConfigBase = {}) {
49-
super(config);
52+
super(config, ProtobufTraceSerializer, 'application/x-protobuf');
5053
this.headers = {
5154
...this.headers,
5255
...USER_AGENT,
@@ -57,10 +60,6 @@ export class OTLPTraceExporter
5760
};
5861
}
5962

60-
convert(spans: ReadableSpan[]): IExportTraceServiceRequest {
61-
return createExportTraceServiceRequest(spans);
62-
}
63-
6463
getDefaultUrl(config: OTLPExporterNodeConfigBase) {
6564
return typeof config.url === 'string'
6665
? config.url

0 commit comments

Comments
 (0)