Skip to content
Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
0b0d1bc
feat: support OpenTelemetry JS SDK 2.x
bengigone Aug 24, 2025
42945f1
Resolving linting issues
bengigone Aug 24, 2025
cbf098d
feat: revert to custom protobuf encoding for 2.x compatibility
bengigone Sep 3, 2025
64a9843
feat: use custom proto encoding for otel 2.x support
bengigone Sep 3, 2025
37bac3d
feat: implement custom protobuf encoding with OpenTelemetry 2.x compa…
bengigone Sep 3, 2025
6b8211a
Remove package-lock.json
bengigone Sep 18, 2025
32cd780
fix: use official createExportTraceServiceRequest and improve protobu…
bengigone Sep 18, 2025
9ad64dd
update lockfile
kakadiadarpan Sep 19, 2025
02e46aa
Resolving comments
bengigone Sep 22, 2025
c24a59b
[build] increase build size temporarily
kakadiadarpan Sep 23, 2025
b1bda52
[opentelemetry] update OTel deps in all the packages/apps
kakadiadarpan Sep 23, 2025
cbc9c16
[otel] add missing context manager setup in sdk
kakadiadarpan Sep 23, 2025
8d43337
[collector] fix imports & types
kakadiadarpan Sep 23, 2025
0a0ea48
[otelzero] update tests
kakadiadarpan Sep 23, 2025
6d6869a
[otelzero] fix types & build size
kakadiadarpan Sep 23, 2025
5e436d1
add util to normalize id
kakadiadarpan Sep 24, 2025
1956819
[otelzero] add createGauge
kakadiadarpan Sep 24, 2025
5bab857
[dependencies] fix version conflicts to drop bundle size
kakadiadarpan Sep 24, 2025
2116caf
update build size limit
kakadiadarpan Sep 24, 2025
574fcac
[configuration] update logRecordProcessors type & setup
kakadiadarpan Sep 24, 2025
4543f03
fix env parsing & contextManager disabling
kakadiadarpan Sep 24, 2025
68d1b75
[env] load all env vars together
kakadiadarpan Sep 24, 2025
a0fbff9
fix: make SDK start() synchronous and add @internal annotationsRetry
bengigone Sep 24, 2025
d036965
remove usage of legacy `addLogRecordProcessor`
kakadiadarpan Sep 25, 2025
d62a92d
[env-parser] eslint and add comment
kakadiadarpan Sep 25, 2025
b79a447
drop void as start is not async anymore
kakadiadarpan Sep 25, 2025
1fb0065
[collector] normalize traceId before using them
kakadiadarpan Sep 25, 2025
3603246
add changeset & pre for beta release
kakadiadarpan Sep 25, 2025
6eabb51
update migration guide
kakadiadarpan Sep 25, 2025
3758bd5
[otel] update logs sdk version
kakadiadarpan Sep 25, 2025
963b1bb
update metricReaders types
kakadiadarpan Sep 25, 2025
8f86520
update @opentelemetry/api allowed versions
kakadiadarpan Sep 25, 2025
8e91d86
update configuration section
kakadiadarpan Sep 25, 2025
f5e904e
add node.js version requirement changes
kakadiadarpan Sep 25, 2025
15e3490
[packages] run prettier
kakadiadarpan Sep 25, 2025
a986198
[tests] run prettier
kakadiadarpan Sep 25, 2025
497e83d
[changeset] run prettier
kakadiadarpan Sep 25, 2025
99a9432
[changesets] update
kakadiadarpan Sep 26, 2025
2cf7cf1
remove pre.json to do a snapshot release
kakadiadarpan Sep 26, 2025
b62e0aa
reformat changesets
kakadiadarpan Sep 29, 2025
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
37 changes: 18 additions & 19 deletions packages/otel/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -65,19 +65,18 @@
},
"dependencies": {},
"devDependencies": {
"@opentelemetry/api": "^1.7.0",
"@opentelemetry/api-logs": "^0.46.0",
"@opentelemetry/context-async-hooks": "^1.19.0",
"@opentelemetry/core": "^1.19.0",
"@opentelemetry/exporter-trace-otlp-http": "^0.46.0",
"@opentelemetry/instrumentation": "^0.46.0",
"@opentelemetry/otlp-exporter-base": "^0.46.0",
"@opentelemetry/otlp-proto-exporter-base": "^0.46.0",
"@opentelemetry/otlp-transformer": "^0.46.0",
"@opentelemetry/resources": "^1.19.0",
"@opentelemetry/sdk-logs": "^0.46.0",
"@opentelemetry/sdk-metrics": "^1.19.0",
"@opentelemetry/sdk-trace-base": "^1.19.0",
"@opentelemetry/api": "^1.9.0",
"@opentelemetry/api-logs": "^0.200.0",
"@opentelemetry/context-async-hooks": "^2.0.0",
"@opentelemetry/core": "^2.0.0",
"@opentelemetry/exporter-trace-otlp-http": "^0.200.0",
"@opentelemetry/instrumentation": "^0.200.0",
"@opentelemetry/otlp-exporter-base": "^0.200.0",
"@opentelemetry/otlp-transformer": "^0.200.0",
"@opentelemetry/resources": "^2.0.0",
"@opentelemetry/sdk-logs": "^0.200.0",
"@opentelemetry/sdk-metrics": "^2.0.0",
"@opentelemetry/sdk-trace-base": "^2.0.0",
"@types/node": "18.15.11",
"esbuild": "^0.19.4",
"eslint-config": "workspace:*",
Expand All @@ -91,11 +90,11 @@
},
"peerDependencies": {
"@opentelemetry/api": ">=1.7.0 <2.0.0",
"@opentelemetry/api-logs": ">=0.46.0 <0.200.0",
"@opentelemetry/instrumentation": ">=0.46.0 <0.200.0",
"@opentelemetry/resources": ">=1.19.0 <2.0.0",
"@opentelemetry/sdk-logs": ">=0.46.0 <0.200.0",
"@opentelemetry/sdk-metrics": ">=1.19.0 <2.0.0",
"@opentelemetry/sdk-trace-base": ">=1.19.0 <2.0.0"
"@opentelemetry/api-logs": ">=0.200.0 <0.300.0",
"@opentelemetry/instrumentation": ">=0.200.0 <0.300.0",
"@opentelemetry/resources": ">=2.0.0 <3.0.0",
"@opentelemetry/sdk-logs": ">=0.200.0 <0.300.0",
"@opentelemetry/sdk-metrics": ">=2.0.0 <3.0.0",
"@opentelemetry/sdk-trace-base": ">=2.0.0 <3.0.0"
}
}
20 changes: 7 additions & 13 deletions packages/otel/src/exporters/exporter-trace-otlp-http-fetch.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import type { ReadableSpan, SpanExporter } from "@opentelemetry/sdk-trace-base";
import type { IExportTraceServiceRequest } from "@opentelemetry/otlp-transformer";
import { createExportTraceServiceRequest } from "@opentelemetry/otlp-transformer/build/src/trace";
import { JsonTraceSerializer } from "@opentelemetry/otlp-transformer/build/src/trace/json/trace";
import type { ExportResult } from "@opentelemetry/core";
import { OTLPExporterEdgeBase } from "./otlp-exporter-base";
import { getDefaultUrl } from "./trace-config";
Expand Down Expand Up @@ -37,24 +36,19 @@ export class OTLPHttpJsonTraceExporter implements SpanExporter {
}

/** @internal */
class Impl extends OTLPExporterEdgeBase<
ReadableSpan,
IExportTraceServiceRequest
> {
convert(spans: ReadableSpan[]): IExportTraceServiceRequest {
return createExportTraceServiceRequest(spans, {
useHex: true,
useLongBits: false,
});
class Impl extends OTLPExporterEdgeBase<ReadableSpan, ReadableSpan[]> {
convert(spans: ReadableSpan[]): ReadableSpan[] {
return spans;
}

override toMessage(serviceRequest: IExportTraceServiceRequest): {
override toMessage(spans: ReadableSpan[]): {
body: string | Uint8Array | Blob;
contentType: string;
headers?: Record<string, string> | undefined;
} {
const serialized = JsonTraceSerializer.serializeRequest(spans);
return {
body: JSON.stringify(serviceRequest),
body: new TextDecoder().decode(serialized),
contentType: "application/json",
};
}
Expand Down
16 changes: 4 additions & 12 deletions packages/otel/src/exporters/exporter-trace-otlp-proto-fetch.ts
Original file line number Diff line number Diff line change
@@ -1,49 +1,41 @@
import type { ReadableSpan, SpanExporter } from "@opentelemetry/sdk-trace-base";
import type { IExportTraceServiceRequest } from "@opentelemetry/otlp-transformer";
import { createExportTraceServiceRequest } from "@opentelemetry/otlp-transformer/build/src/trace";
import type { IExportTraceServiceRequest } from "@opentelemetry/otlp-transformer/build/src/trace/internal-types";
import { createExportTraceServiceRequest } from "@opentelemetry/otlp-transformer/build/src/trace/internal";
import type { ExportResult } from "@opentelemetry/core";
import { encodeTraceServiceRequest } from "./proto";
import { OTLPExporterEdgeBase } from "./otlp-exporter-base";
import { getDefaultUrl } from "./trace-config";
import type { OTLPExporterConfig } from "./config";
import { encodeTraceServiceRequest } from "./proto";

/**
* OTLP exporter for the `http/protobuf` protocol. Compatible with the "edge" runtime.
*/
export class OTLPHttpProtoTraceExporter implements SpanExporter {
/** @internal */
private readonly impl: Impl;

constructor(config: OTLPExporterConfig = {}) {
this.impl = new Impl(config);
}

/** See `SpanExporter#export()` */
export(
spans: ReadableSpan[],
resultCallback: (result: ExportResult) => void
): void {
this.impl.export(spans, resultCallback);
}

/** See `SpanExporter#shutdown()` */
shutdown(): Promise<void> {
return this.impl.shutdown();
}

/** See `SpanExporter#forceFlush()` */
forceFlush(): Promise<void> {
return this.impl.forceFlush();
}
}

/** @internal */
class Impl extends OTLPExporterEdgeBase<
ReadableSpan,
IExportTraceServiceRequest
> {
convert(spans: ReadableSpan[]): IExportTraceServiceRequest {
return createExportTraceServiceRequest(spans, undefined);
return createExportTraceServiceRequest(spans);
}

override toMessage(serviceRequest: IExportTraceServiceRequest): {
Expand Down
52 changes: 41 additions & 11 deletions packages/otel/src/exporters/otlp-exporter-base.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,25 @@
import type { OTLPExporterError } from "@opentelemetry/otlp-exporter-base";
import { OTLPExporterBase } from "@opentelemetry/otlp-exporter-base/build/src/OTLPExporterBase";
import { diag } from "@opentelemetry/api";
import type { ExportResult } from "@opentelemetry/core";
import type { OTLPExporterConfig } from "./config";

/** @internal */
export abstract class OTLPExporterEdgeBase<
ExportItem,
ServiceRequest,
> extends OTLPExporterBase<OTLPExporterConfig, ExportItem, ServiceRequest> {
export abstract class OTLPExporterEdgeBase<ExportItem, ServiceRequest> {
/** @internal */
private _headers: Record<string, unknown> | undefined;
/** @internal */
private _shutdownOnce = { isCalled: false };
/** @internal */
private _sendingPromises: Promise<void>[] = [];
/** @internal */
protected url: string;

constructor(config: OTLPExporterConfig = {}) {
super(config);
this.url = config.url || this.getDefaultUrl(config);
if (config.headers) {
this._headers = config.headers;
}
this.onInit();
}

onShutdown(): void {
Expand All @@ -26,6 +30,34 @@ export abstract class OTLPExporterEdgeBase<
diag.debug("@vercel/otel/otlp: onInit");
}

export(
items: ExportItem[],
resultCallback: (result: ExportResult) => void
): void {
if (this._shutdownOnce.isCalled) {
diag.debug(
"@vercel/otel/otlp: Shutdown already started. Cannot send objects"
);
return;
}

this.send(
items,
() => resultCallback({ code: 0 }), // SUCCESS
(error: OTLPExporterError) => resultCallback({ code: 1, error }) // FAILED
);
}

async forceFlush(): Promise<void> {
await Promise.all(this._sendingPromises);
}

async shutdown(): Promise<void> {
this._shutdownOnce.isCalled = true;
this.onShutdown();
await this.forceFlush();
}

send(
items: ExportItem[],
onSuccess: () => void,
Expand Down Expand Up @@ -53,7 +85,7 @@ export abstract class OTLPExporterEdgeBase<

const promise = fetch(this.url, {
method: "POST",
body,
body: body as BodyInit,
headers: {
...this._headers,
...headers,
Expand Down Expand Up @@ -81,10 +113,8 @@ export abstract class OTLPExporterEdgeBase<
this._sendingPromises.push(promise);
}

getDefaultUrl(_config: OTLPExporterConfig): string {
throw new Error("Method not implemented.");
}

abstract convert(items: ExportItem[]): ServiceRequest;
abstract getDefaultUrl(config: OTLPExporterConfig): string;
abstract toMessage(serviceRequest: ServiceRequest): {
body: string | Uint8Array | Blob;
contentType: string;
Expand Down
Loading
Loading