Skip to content

Commit 1c5de7a

Browse files
authored
feat!: use serializers in browser exporters (#4581)
* feat!: use serializer in browser exporters * feat!: remove unused convert * fixup! feat!: use serializer in browser exporters * chore: update changleog
1 parent 75d88f7 commit 1c5de7a

File tree

65 files changed

+135
-861
lines changed

Some content is hidden

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

65 files changed

+135
-861
lines changed

experimental/CHANGELOG.md

+6
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,12 @@ All notable changes to experimental packages in this project will be documented
1111
* (user-facing) `convert()` now returns an empty object and will be removed in a follow-up
1212
* (internal) OTLPExporterNodeBase now has additional constructor parameters that are required
1313
* (internal) OTLPExporterNodeBase now has an additional `ResponseType` type parameter
14+
* feat(exporter-*-otlp-*)!: move serialization for Node.js exporters to `@opentelemetry/otlp-transformer` [#4581](https://github.com/open-telemetry/opentelemetry-js/pull/4581) @pichlermarc
15+
* Breaking changes:
16+
* (user-facing) `convert()` has been removed from all exporters
17+
* (internal) OTLPExporterBrowserBase: `RequestType` has been replaced by a `ResponseType` type-argument
18+
* (internal) OTLPExporterNodeBase: `ServiceRequest` has been replaced by a `ServiceResponse` type-argument
19+
* (internal) the `@opentelemetry/otlp-exporter-proto-base` package has been removed, and will from now on be deprecated in `npm`
1420

1521
### :rocket: (Enhancement)
1622

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

-2
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import {
2323
DEFAULT_COLLECTOR_URL,
2424
} from '@opentelemetry/otlp-grpc-exporter-base';
2525
import {
26-
IExportLogsServiceRequest,
2726
IExportLogsServiceResponse,
2827
ProtobufLogsSerializer,
2928
} from '@opentelemetry/otlp-transformer';
@@ -39,7 +38,6 @@ const USER_AGENT = {
3938
export class OTLPLogExporter
4039
extends OTLPGRPCExporterNodeBase<
4140
ReadableLogRecord,
42-
IExportLogsServiceRequest,
4341
IExportLogsServiceResponse
4442
>
4543
implements LogRecordExporter

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

+11-14
Original file line numberDiff line numberDiff line change
@@ -19,26 +19,30 @@ import type {
1919
LogRecordExporter,
2020
} from '@opentelemetry/sdk-logs';
2121
import type { OTLPExporterConfigBase } from '@opentelemetry/otlp-exporter-base';
22-
import type { IExportLogsServiceRequest } from '@opentelemetry/otlp-transformer';
22+
import type { IExportLogsServiceResponse } from '@opentelemetry/otlp-transformer';
2323
import { OTLPExporterBrowserBase } from '@opentelemetry/otlp-exporter-base';
2424
import { baggageUtils, getEnv } from '@opentelemetry/core';
25-
import { createExportLogsServiceRequest } from '@opentelemetry/otlp-transformer';
25+
import { JsonLogsSerializer } from '@opentelemetry/otlp-transformer';
2626

2727
import { getDefaultUrl } from '../config';
2828

2929
/**
3030
* Collector Logs Exporter for Web
3131
*/
3232
export class OTLPLogExporter
33-
extends OTLPExporterBrowserBase<ReadableLogRecord, IExportLogsServiceRequest>
33+
extends OTLPExporterBrowserBase<ReadableLogRecord, IExportLogsServiceResponse>
3434
implements LogRecordExporter
3535
{
3636
constructor(config: OTLPExporterConfigBase = {}) {
3737
// load OTEL_EXPORTER_OTLP_LOGS_TIMEOUT env var
38-
super({
39-
timeoutMillis: getEnv().OTEL_EXPORTER_OTLP_LOGS_TIMEOUT,
40-
...config,
41-
});
38+
super(
39+
{
40+
timeoutMillis: getEnv().OTEL_EXPORTER_OTLP_LOGS_TIMEOUT,
41+
...config,
42+
},
43+
JsonLogsSerializer,
44+
'application/json'
45+
);
4246
this._headers = {
4347
...this._headers,
4448
...baggageUtils.parseKeyPairsIntoRecord(
@@ -47,13 +51,6 @@ export class OTLPLogExporter
4751
};
4852
}
4953

50-
convert(logRecords: ReadableLogRecord[]): IExportLogsServiceRequest {
51-
return createExportLogsServiceRequest(logRecords, {
52-
useHex: true,
53-
useLongBits: false,
54-
});
55-
}
56-
5754
getDefaultUrl(config: OTLPExporterConfigBase): string {
5855
return getDefaultUrl(config);
5956
}

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

+2-9
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,7 @@ import type {
1919
LogRecordExporter,
2020
} from '@opentelemetry/sdk-logs';
2121
import type { OTLPExporterNodeConfigBase } from '@opentelemetry/otlp-exporter-base';
22-
import type {
23-
IExportLogsServiceRequest,
24-
IExportLogsServiceResponse,
25-
} from '@opentelemetry/otlp-transformer';
22+
import type { IExportLogsServiceResponse } from '@opentelemetry/otlp-transformer';
2623
import { getEnv, baggageUtils } from '@opentelemetry/core';
2724
import {
2825
OTLPExporterNodeBase,
@@ -41,11 +38,7 @@ const USER_AGENT = {
4138
* Collector Logs Exporter for Node
4239
*/
4340
export class OTLPLogExporter
44-
extends OTLPExporterNodeBase<
45-
ReadableLogRecord,
46-
IExportLogsServiceRequest,
47-
IExportLogsServiceResponse
48-
>
41+
extends OTLPExporterNodeBase<ReadableLogRecord, IExportLogsServiceResponse>
4942
implements LogRecordExporter
5043
{
5144
constructor(config: OTLPExporterNodeConfigBase = {}) {

experimental/packages/exporter-logs-otlp-proto/package.json

-1
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,6 @@
9797
"@opentelemetry/api-logs": "0.51.0",
9898
"@opentelemetry/core": "1.24.0",
9999
"@opentelemetry/otlp-exporter-base": "0.51.0",
100-
"@opentelemetry/otlp-proto-exporter-base": "0.51.0",
101100
"@opentelemetry/otlp-transformer": "0.51.0",
102101
"@opentelemetry/resources": "1.24.0",
103102
"@opentelemetry/sdk-logs": "0.51.0",

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

+5-18
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,11 @@ import {
1919
OTLPExporterConfigBase,
2020
appendResourcePathToUrl,
2121
appendRootPathToUrlIfNeeded,
22+
OTLPExporterBrowserBase,
2223
} from '@opentelemetry/otlp-exporter-base';
2324
import {
24-
OTLPProtoExporterBrowserBase,
25-
ServiceClientType,
26-
} from '@opentelemetry/otlp-proto-exporter-base';
27-
import {
28-
createExportLogsServiceRequest,
29-
IExportLogsServiceRequest,
25+
IExportLogsServiceResponse,
26+
ProtobufLogsSerializer,
3027
} from '@opentelemetry/otlp-transformer';
3128

3229
import { ReadableLogRecord, LogRecordExporter } from '@opentelemetry/sdk-logs';
@@ -38,24 +35,18 @@ const DEFAULT_COLLECTOR_URL = `http://localhost:4318/${DEFAULT_COLLECTOR_RESOURC
3835
* Collector Trace Exporter for Web
3936
*/
4037
export class OTLPLogExporter
41-
extends OTLPProtoExporterBrowserBase<
42-
ReadableLogRecord,
43-
IExportLogsServiceRequest
44-
>
38+
extends OTLPExporterBrowserBase<ReadableLogRecord, IExportLogsServiceResponse>
4539
implements LogRecordExporter
4640
{
4741
constructor(config: OTLPExporterConfigBase = {}) {
48-
super(config);
42+
super(config, ProtobufLogsSerializer, 'application/x-protobuf');
4943
this._headers = Object.assign(
5044
this._headers,
5145
baggageUtils.parseKeyPairsIntoRecord(
5246
getEnv().OTEL_EXPORTER_OTLP_LOGS_HEADERS
5347
)
5448
);
5549
}
56-
convert(logs: ReadableLogRecord[]): IExportLogsServiceRequest {
57-
return createExportLogsServiceRequest(logs);
58-
}
5950

6051
getDefaultUrl(config: OTLPExporterConfigBase): string {
6152
return typeof config.url === 'string'
@@ -69,8 +60,4 @@ export class OTLPLogExporter
6960
)
7061
: DEFAULT_COLLECTOR_URL;
7162
}
72-
73-
getServiceClientType() {
74-
return ServiceClientType.LOGS;
75-
}
7663
}

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

+1-11
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,7 @@ import {
2222
OTLPExporterNodeBase,
2323
parseHeaders,
2424
} from '@opentelemetry/otlp-exporter-base';
25-
import { ServiceClientType } from '@opentelemetry/otlp-proto-exporter-base';
2625
import {
27-
IExportLogsServiceRequest,
2826
IExportLogsServiceResponse,
2927
ProtobufLogsSerializer,
3028
} from '@opentelemetry/otlp-transformer';
@@ -43,11 +41,7 @@ const DEFAULT_COLLECTOR_URL = `http://localhost:4318/${DEFAULT_COLLECTOR_RESOURC
4341
* Collector Trace Exporter for Node
4442
*/
4543
export class OTLPLogExporter
46-
extends OTLPExporterNodeBase<
47-
ReadableLogRecord,
48-
IExportLogsServiceRequest,
49-
IExportLogsServiceResponse
50-
>
44+
extends OTLPExporterNodeBase<ReadableLogRecord, IExportLogsServiceResponse>
5145
implements LogRecordExporter
5246
{
5347
constructor(config: OTLPExporterConfigBase = {}) {
@@ -74,8 +68,4 @@ export class OTLPLogExporter
7468
)
7569
: DEFAULT_COLLECTOR_URL;
7670
}
77-
78-
getServiceClientType() {
79-
return ServiceClientType.LOGS;
80-
}
8171
}

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

+17-12
Original file line numberDiff line numberDiff line change
@@ -33,16 +33,27 @@ import {
3333
OTLPExporterNodeConfigBase,
3434
OTLPExporterError,
3535
} from '@opentelemetry/otlp-exporter-base';
36-
import {
37-
getExportRequestProto,
38-
ServiceClientType,
39-
} from '@opentelemetry/otlp-proto-exporter-base';
4036
import { IExportLogsServiceRequest } from '@opentelemetry/otlp-transformer';
4137
import { ReadableLogRecord } from '@opentelemetry/sdk-logs';
4238
import { VERSION } from '../../src/version';
39+
import { Root } from 'protobufjs';
40+
import * as path from 'path';
4341

4442
let fakeRequest: PassThrough;
4543

44+
const dir = path.resolve(__dirname, '../../../otlp-transformer/protos');
45+
const root = new Root();
46+
root.resolvePath = function (origin, target) {
47+
return `${dir}/${target}`;
48+
};
49+
const proto = root.loadSync([
50+
'opentelemetry/proto/common/v1/common.proto',
51+
'opentelemetry/proto/resource/v1/resource.proto',
52+
'opentelemetry/proto/logs/v1/logs.proto',
53+
'opentelemetry/proto/collector/logs/v1/logs_service.proto',
54+
]);
55+
const exportRequestServiceProto = proto?.lookupType('ExportLogsServiceRequest');
56+
4657
describe('OTLPLogExporter - node with proto over http', () => {
4758
let collectorExporter: OTLPLogExporter;
4859
let collectorExporterConfig: OTLPExporterNodeConfigBase;
@@ -240,10 +251,7 @@ describe('OTLPLogExporter - node with proto over http', () => {
240251

241252
let buff = Buffer.from('');
242253
fakeRequest.on('end', () => {
243-
const ExportLogsServiceRequestProto = getExportRequestProto(
244-
ServiceClientType.LOGS
245-
);
246-
const data = ExportLogsServiceRequestProto.decode(buff);
254+
const data = exportRequestServiceProto.decode(buff);
247255
const json = data?.toJSON() as IExportLogsServiceRequest;
248256
const log1 = json.resourceLogs?.[0].scopeLogs?.[0].logRecords?.[0];
249257
assert.ok(typeof log1 !== 'undefined', "log doesn't exist");
@@ -328,10 +336,7 @@ describe('OTLPLogExporter - node with proto over http', () => {
328336
let buff = Buffer.from('');
329337
fakeRequest.on('end', () => {
330338
const unzippedBuff = zlib.gunzipSync(buff);
331-
const ExportLogsServiceRequestProto = getExportRequestProto(
332-
ServiceClientType.LOGS
333-
);
334-
const data = ExportLogsServiceRequestProto.decode(unzippedBuff);
339+
const data = exportRequestServiceProto.decode(unzippedBuff);
335340
const json = data?.toJSON() as IExportLogsServiceRequest;
336341
const log1 = json.resourceLogs?.[0].scopeLogs?.[0].logRecords?.[0];
337342
assert.ok(typeof log1 !== 'undefined', "log doesn't exist");

experimental/packages/exporter-logs-otlp-proto/tsconfig.esm.json

-3
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,6 @@
2727
{
2828
"path": "../otlp-exporter-base"
2929
},
30-
{
31-
"path": "../otlp-proto-exporter-base"
32-
},
3330
{
3431
"path": "../otlp-transformer"
3532
},

experimental/packages/exporter-logs-otlp-proto/tsconfig.esnext.json

-3
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,6 @@
2727
{
2828
"path": "../otlp-exporter-base"
2929
},
30-
{
31-
"path": "../otlp-proto-exporter-base"
32-
},
3330
{
3431
"path": "../otlp-transformer"
3532
},

experimental/packages/exporter-logs-otlp-proto/tsconfig.json

-3
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,6 @@
2727
{
2828
"path": "../otlp-exporter-base"
2929
},
30-
{
31-
"path": "../otlp-proto-exporter-base"
32-
},
3330
{
3431
"path": "../otlp-transformer"
3532
},

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

+1-6
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import {
2323
DEFAULT_COLLECTOR_URL,
2424
} from '@opentelemetry/otlp-grpc-exporter-base';
2525
import {
26-
IExportTraceServiceRequest,
2726
IExportTraceServiceResponse,
2827
ProtobufTraceSerializer,
2928
} from '@opentelemetry/otlp-transformer';
@@ -37,11 +36,7 @@ const USER_AGENT = {
3736
* OTLP Trace Exporter for Node
3837
*/
3938
export class OTLPTraceExporter
40-
extends OTLPGRPCExporterNodeBase<
41-
ReadableSpan,
42-
IExportTraceServiceRequest,
43-
IExportTraceServiceResponse
44-
>
39+
extends OTLPGRPCExporterNodeBase<ReadableSpan, IExportTraceServiceResponse>
4540
implements SpanExporter
4641
{
4742
constructor(config: OTLPGRPCExporterConfigNode = {}) {

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

+4-10
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ import {
2323
OTLPExporterBrowserBase,
2424
} from '@opentelemetry/otlp-exporter-base';
2525
import {
26-
createExportTraceServiceRequest,
27-
IExportTraceServiceRequest,
26+
IExportTraceServiceResponse,
27+
JsonTraceSerializer,
2828
} from '@opentelemetry/otlp-transformer';
2929

3030
const DEFAULT_COLLECTOR_RESOURCE_PATH = 'v1/traces';
@@ -34,24 +34,18 @@ const DEFAULT_COLLECTOR_URL = `http://localhost:4318/${DEFAULT_COLLECTOR_RESOURC
3434
* Collector Trace Exporter for Web
3535
*/
3636
export class OTLPTraceExporter
37-
extends OTLPExporterBrowserBase<ReadableSpan, IExportTraceServiceRequest>
37+
extends OTLPExporterBrowserBase<ReadableSpan, IExportTraceServiceResponse>
3838
implements SpanExporter
3939
{
4040
constructor(config: OTLPExporterConfigBase = {}) {
41-
super(config);
41+
super(config, JsonTraceSerializer, 'application/json');
4242
this._headers = Object.assign(
4343
this._headers,
4444
baggageUtils.parseKeyPairsIntoRecord(
4545
getEnv().OTEL_EXPORTER_OTLP_TRACES_HEADERS
4646
)
4747
);
4848
}
49-
convert(spans: ReadableSpan[]): IExportTraceServiceRequest {
50-
return createExportTraceServiceRequest(spans, {
51-
useHex: true,
52-
useLongBits: false,
53-
});
54-
}
5549

5650
getDefaultUrl(config: OTLPExporterConfigBase): string {
5751
return typeof config.url === 'string'

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

+2-9
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,7 @@ import {
2525
appendResourcePathToUrl,
2626
appendRootPathToUrlIfNeeded,
2727
} from '@opentelemetry/otlp-exporter-base';
28-
import {
29-
IExportTraceServiceRequest,
30-
IExportTraceServiceResponse,
31-
} from '@opentelemetry/otlp-transformer';
28+
import { IExportTraceServiceResponse } from '@opentelemetry/otlp-transformer';
3229
import { VERSION } from '../../version';
3330
import { JsonTraceSerializer } from '@opentelemetry/otlp-transformer';
3431

@@ -42,11 +39,7 @@ const USER_AGENT = {
4239
* Collector Trace Exporter for Node
4340
*/
4441
export class OTLPTraceExporter
45-
extends OTLPExporterNodeBase<
46-
ReadableSpan,
47-
IExportTraceServiceRequest,
48-
IExportTraceServiceResponse
49-
>
42+
extends OTLPExporterNodeBase<ReadableSpan, IExportTraceServiceResponse>
5043
implements SpanExporter
5144
{
5245
constructor(config: OTLPExporterNodeConfigBase = {}) {

experimental/packages/exporter-trace-otlp-http/test/browser/CollectorTraceExporter.test.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,10 @@ describe('OTLPTraceExporter - web', () => {
195195
assert.strictEqual(request.url, 'http://foo.bar.com');
196196

197197
const body = request.requestBody;
198-
const json = JSON.parse(body) as IExportTraceServiceRequest;
198+
const decoder = new TextDecoder();
199+
const json = JSON.parse(
200+
decoder.decode(body)
201+
) as IExportTraceServiceRequest;
199202
const span1 = json.resourceSpans?.[0].scopeSpans?.[0].spans?.[0];
200203

201204
assert.ok(typeof span1 !== 'undefined', "span doesn't exist");

experimental/packages/exporter-trace-otlp-proto/package.json

-1
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,6 @@
9595
"dependencies": {
9696
"@opentelemetry/core": "1.24.0",
9797
"@opentelemetry/otlp-exporter-base": "0.51.0",
98-
"@opentelemetry/otlp-proto-exporter-base": "0.51.0",
9998
"@opentelemetry/otlp-transformer": "0.51.0",
10099
"@opentelemetry/resources": "1.24.0",
101100
"@opentelemetry/sdk-trace-base": "1.24.0"

0 commit comments

Comments
 (0)