@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.
@@ -34,6 +34,7 @@ declare class TelemetryManager {
34
34
  private configured;
35
35
  constructor();
36
36
  initialize(): void;
37
+ setupBasicTracerProvider(): void;
37
38
  setConfiguration(): Promise<void>;
38
39
  get tracer(): import("@opentelemetry/api").Tracer;
39
40
  get enabled(): boolean;
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
- // Setup TracerProvider with all processors including exporters
236
- const traceExporter = this.getTraceExporter();
237
- this.nodeTracerProvider = new sdk_trace_node_1.NodeTracerProvider({
238
- resource,
239
- sampler: new sdk_trace_node_1.AlwaysOnSampler(),
240
- spanProcessors: [
241
- new DefaultAttributesSpanProcessor({
242
- "workload.id": core_1.settings.name || "",
243
- "workload.type": core_1.settings.type ? core_1.settings.type + "s" : "",
244
- workspace: core_1.settings.workspace || "",
245
- }),
246
- new sdk_trace_node_1.BatchSpanProcessor(traceExporter),
247
- new HasBeenProcessedSpanProcessor(traceExporter),
248
- ],
249
- });
250
- // Register the tracer provider - this enables context propagation
251
- this.nodeTracerProvider.register();
252
- console.log("TracerProvider registered with exporters - ready for context propagation");
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.138",
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.138"
74
+ "@blaxel/core": "0.2.18-dev.141"
75
75
  },
76
76
  "devDependencies": {
77
77
  "@eslint/js": "^9.26.0",