@blaxel/telemetry 0.2.18-dev.138 → 0.2.18-dev.141
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/telemetry.d.ts +1 -0
- package/dist/telemetry.js +87 -20
- package/package.json +2 -2
package/dist/telemetry.d.ts
CHANGED
package/dist/telemetry.js
CHANGED
|
@@ -78,13 +78,49 @@ class TelemetryManager {
|
|
|
78
78
|
if (!this.enabled || this.initialized) {
|
|
79
79
|
return;
|
|
80
80
|
}
|
|
81
|
+
// Setup basic TracerProvider first - this is critical for context propagation
|
|
82
|
+
this.setupBasicTracerProvider();
|
|
83
|
+
// Now setup instrumentation - it can now extract traceparent headers
|
|
81
84
|
this.instrumentApp();
|
|
82
85
|
this.setupSignalHandler();
|
|
83
86
|
this.initialized = true;
|
|
87
|
+
// Add exporters later asynchronously
|
|
84
88
|
this.setConfiguration().catch((error) => {
|
|
85
89
|
core_1.logger.error("Error setting configuration:", error);
|
|
86
90
|
});
|
|
87
91
|
}
|
|
92
|
+
setupBasicTracerProvider() {
|
|
93
|
+
const resource = new BlaxelResource(this.resourceAttributes);
|
|
94
|
+
// Create TracerProvider with complete setup including exporters
|
|
95
|
+
// This ensures we don't need to recreate it later, preserving context
|
|
96
|
+
const spanProcessors = [
|
|
97
|
+
new DefaultAttributesSpanProcessor({
|
|
98
|
+
"workload.id": core_1.settings.name || "",
|
|
99
|
+
"workload.type": core_1.settings.type ? core_1.settings.type + "s" : "",
|
|
100
|
+
workspace: core_1.settings.workspace || "",
|
|
101
|
+
}),
|
|
102
|
+
];
|
|
103
|
+
// Try to add exporters if authentication is available
|
|
104
|
+
try {
|
|
105
|
+
if (core_1.settings.authorization) {
|
|
106
|
+
const traceExporter = this.getTraceExporter();
|
|
107
|
+
spanProcessors.push(new sdk_trace_node_1.BatchSpanProcessor(traceExporter));
|
|
108
|
+
spanProcessors.push(new HasBeenProcessedSpanProcessor(traceExporter));
|
|
109
|
+
console.log("🚀 TracerProvider created with exporters from the start");
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
console.log("🚀 TracerProvider created without exporters - will be added later");
|
|
114
|
+
}
|
|
115
|
+
this.nodeTracerProvider = new sdk_trace_node_1.NodeTracerProvider({
|
|
116
|
+
resource,
|
|
117
|
+
sampler: new sdk_trace_node_1.AlwaysOnSampler(),
|
|
118
|
+
spanProcessors,
|
|
119
|
+
});
|
|
120
|
+
// Register immediately - this enables context propagation
|
|
121
|
+
this.nodeTracerProvider.register();
|
|
122
|
+
console.log("🚀 TracerProvider registered BEFORE instrumentation - context propagation enabled");
|
|
123
|
+
}
|
|
88
124
|
async setConfiguration() {
|
|
89
125
|
if (!this.enabled || this.configured) {
|
|
90
126
|
return;
|
|
@@ -199,17 +235,34 @@ class TelemetryManager {
|
|
|
199
235
|
requestHook: (span) => {
|
|
200
236
|
// Debug incoming trace headers
|
|
201
237
|
console.log("=== HTTP INSTRUMENTATION REQUEST HOOK ===");
|
|
238
|
+
// Check if TracerProvider is registered
|
|
239
|
+
const tracer = api_1.trace.getTracer("debug");
|
|
240
|
+
console.log("TracerProvider available:", !!tracer);
|
|
241
|
+
// Check active context
|
|
242
|
+
const activeContext = api_1.context.active();
|
|
243
|
+
const spanContext = api_1.trace.getSpanContext(activeContext);
|
|
244
|
+
console.log("Span context from active context:", spanContext
|
|
245
|
+
? {
|
|
246
|
+
traceId: spanContext.traceId,
|
|
247
|
+
spanId: spanContext.spanId,
|
|
248
|
+
traceFlags: spanContext.traceFlags,
|
|
249
|
+
}
|
|
250
|
+
: "null");
|
|
202
251
|
// Check current span context after HTTP instrumentation processes headers
|
|
203
252
|
const activeSpan = api_1.trace.getActiveSpan();
|
|
204
253
|
if (activeSpan) {
|
|
205
|
-
console.log("Active span in request hook:", {
|
|
254
|
+
console.log("✅ Active span found in request hook:", {
|
|
206
255
|
traceId: activeSpan.spanContext().traceId,
|
|
207
256
|
spanId: activeSpan.spanContext().spanId,
|
|
208
257
|
traceFlags: activeSpan.spanContext().traceFlags,
|
|
209
258
|
});
|
|
210
259
|
}
|
|
211
260
|
else {
|
|
212
|
-
console.log("No active span found in request hook");
|
|
261
|
+
console.log("❌ No active span found in request hook");
|
|
262
|
+
console.log("Possible causes:");
|
|
263
|
+
console.log("1. TracerProvider not registered before HTTP instrumentation");
|
|
264
|
+
console.log("2. Traceparent header not properly extracted");
|
|
265
|
+
console.log("3. Context lost across async boundaries");
|
|
213
266
|
}
|
|
214
267
|
console.log("Current span from hook parameter:", {
|
|
215
268
|
traceId: span.spanContext().traceId,
|
|
@@ -232,24 +285,38 @@ class TelemetryManager {
|
|
|
232
285
|
});
|
|
233
286
|
this.loggerProvider.addLogRecordProcessor(new sdk_logs_1.BatchLogRecordProcessor(logExporter));
|
|
234
287
|
api_logs_1.logs.setGlobalLoggerProvider(this.loggerProvider);
|
|
235
|
-
//
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
288
|
+
// Check if we need to add exporters to existing TracerProvider
|
|
289
|
+
if (this.nodeTracerProvider && !core_1.settings.authorization) {
|
|
290
|
+
// If we didn't have authorization before but we do now, recreate with exporters
|
|
291
|
+
// But only if we didn't already have them
|
|
292
|
+
try {
|
|
293
|
+
const traceExporter = this.getTraceExporter();
|
|
294
|
+
// Unfortunately, we need to recreate the TracerProvider to add exporters
|
|
295
|
+
// This is a limitation of OpenTelemetry SDK
|
|
296
|
+
const newTracerProvider = new sdk_trace_node_1.NodeTracerProvider({
|
|
297
|
+
resource,
|
|
298
|
+
sampler: new sdk_trace_node_1.AlwaysOnSampler(),
|
|
299
|
+
spanProcessors: [
|
|
300
|
+
new DefaultAttributesSpanProcessor({
|
|
301
|
+
"workload.id": core_1.settings.name || "",
|
|
302
|
+
"workload.type": core_1.settings.type ? core_1.settings.type + "s" : "",
|
|
303
|
+
workspace: core_1.settings.workspace || "",
|
|
304
|
+
}),
|
|
305
|
+
new sdk_trace_node_1.BatchSpanProcessor(traceExporter),
|
|
306
|
+
new HasBeenProcessedSpanProcessor(traceExporter),
|
|
307
|
+
],
|
|
308
|
+
});
|
|
309
|
+
this.nodeTracerProvider = newTracerProvider;
|
|
310
|
+
this.nodeTracerProvider.register();
|
|
311
|
+
console.log("📡 TracerProvider updated with exporters");
|
|
312
|
+
}
|
|
313
|
+
catch {
|
|
314
|
+
console.log("📡 Could not add exporters to TracerProvider");
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
else {
|
|
318
|
+
console.log("📡 TracerProvider already has exporters or no changes needed");
|
|
319
|
+
}
|
|
253
320
|
// Setup metrics
|
|
254
321
|
const metricExporter = this.getMetricExporter();
|
|
255
322
|
this.meterProvider = new sdk_metrics_1.MeterProvider({
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@blaxel/telemetry",
|
|
3
|
-
"version": "0.2.18-dev.
|
|
3
|
+
"version": "0.2.18-dev.141",
|
|
4
4
|
"description": "Blaxel SDK for TypeScript",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Blaxel, INC (https://blaxel.ai)",
|
|
@@ -71,7 +71,7 @@
|
|
|
71
71
|
"@opentelemetry/sdk-trace-base": "^2.0.0",
|
|
72
72
|
"@opentelemetry/sdk-trace-node": "^2.0.0",
|
|
73
73
|
"ai": "^4.3.13",
|
|
74
|
-
"@blaxel/core": "0.2.18-dev.
|
|
74
|
+
"@blaxel/core": "0.2.18-dev.141"
|
|
75
75
|
},
|
|
76
76
|
"devDependencies": {
|
|
77
77
|
"@eslint/js": "^9.26.0",
|