Skip to content

Commit 27bfaec

Browse files
galkleinmannirgaellipsis-dev[bot]claude
authored
fix(sdk): defensive resource creation for otel v1, v2 resolution (#647)
Co-authored-by: Nir Gazit <[email protected]> Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> Co-authored-by: Claude <[email protected]>
1 parent 16ab34d commit 27bfaec

File tree

2 files changed

+52
-4
lines changed

2 files changed

+52
-4
lines changed

packages/traceloop-sdk/package.json

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,26 @@
2222
"engines": {
2323
"node": ">=14"
2424
},
25+
"peerDependencies": {
26+
"@opentelemetry/api": "^1.9.0",
27+
"@opentelemetry/resources": "^2.0.0",
28+
"@opentelemetry/sdk-trace-base": "^2.0.0",
29+
"@opentelemetry/exporter-trace-otlp-proto": "^0.203.0"
30+
},
31+
"peerDependenciesMeta": {
32+
"@opentelemetry/api": {
33+
"optional": false
34+
},
35+
"@opentelemetry/resources": {
36+
"optional": false
37+
},
38+
"@opentelemetry/sdk-trace-base": {
39+
"optional": false
40+
},
41+
"@opentelemetry/exporter-trace-otlp-proto": {
42+
"optional": false
43+
}
44+
},
2545
"files": [
2646
"dist/**/*.js",
2747
"dist/**/*.mjs",

packages/traceloop-sdk/src/lib/tracing/index.ts

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { NodeSDK } from "@opentelemetry/sdk-node";
22
import { SpanProcessor } from "@opentelemetry/sdk-trace-node";
33
import { context, diag } from "@opentelemetry/api";
44
import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-proto";
5-
import { resourceFromAttributes } from "@opentelemetry/resources";
5+
import { resourceFromAttributes, Resource } from "@opentelemetry/resources";
66
import { ATTR_SERVICE_NAME } from "@opentelemetry/semantic-conventions";
77
import { Instrumentation } from "@opentelemetry/instrumentation";
88
import { InitializeOptions } from "../interfaces";
@@ -307,10 +307,38 @@ export const startTracing = (options: InitializeOptions) => {
307307
spanProcessors.push(options.processor);
308308
}
309309

310+
// Create resource with proper detection and defensive handling for OTLP serialization
311+
const serviceName =
312+
options.appName || process.env.npm_package_name || "unknown-service";
313+
let resource: Resource;
314+
315+
try {
316+
// Create our custom resource with service name and let NodeSDK handle default detection
317+
resource = resourceFromAttributes({
318+
[ATTR_SERVICE_NAME]: serviceName,
319+
});
320+
321+
// Defensive check to prevent OTLP serialization errors
322+
if (!resource || typeof resource !== "object") {
323+
throw new Error("Invalid resource object");
324+
}
325+
326+
if (!resource.attributes || typeof resource.attributes !== "object") {
327+
throw new Error("Resource missing attributes");
328+
}
329+
} catch (error) {
330+
// Fallback: create a basic resource manually
331+
diag.warn(
332+
"Failed to create resource with resourceFromAttributes, using fallback",
333+
error,
334+
);
335+
resource = resourceFromAttributes({
336+
[ATTR_SERVICE_NAME]: serviceName,
337+
});
338+
}
339+
310340
_sdk = new NodeSDK({
311-
resource: resourceFromAttributes({
312-
[ATTR_SERVICE_NAME]: options.appName || process.env.npm_package_name,
313-
}),
341+
resource,
314342
spanProcessors,
315343
contextManager: options.contextManager,
316344
textMapPropagator: options.propagator,

0 commit comments

Comments
 (0)