@blaxel/telemetry 0.2.18-dev.141 → 0.2.18-dev.142

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,7 +34,6 @@ declare class TelemetryManager {
34
34
  private configured;
35
35
  constructor();
36
36
  initialize(): void;
37
- setupBasicTracerProvider(): void;
38
37
  setConfiguration(): Promise<void>;
39
38
  get tracer(): import("@opentelemetry/api").Tracer;
40
39
  get enabled(): boolean;
@@ -60,6 +59,7 @@ declare class TelemetryManager {
60
59
  */
61
60
  getLogExporter(): OTLPLogExporter;
62
61
  instrumentApp(): void;
62
+ setupProviders(): void;
63
63
  setExporters(): void;
64
64
  shutdownApp(): Promise<void>;
65
65
  }
package/dist/telemetry.js CHANGED
@@ -78,49 +78,13 @@ 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
84
81
  this.instrumentApp();
85
82
  this.setupSignalHandler();
86
83
  this.initialized = true;
87
- // Add exporters later asynchronously
88
84
  this.setConfiguration().catch((error) => {
89
85
  core_1.logger.error("Error setting configuration:", error);
90
86
  });
91
87
  }
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
- }
124
88
  async setConfiguration() {
125
89
  if (!this.enabled || this.configured) {
126
90
  return;
@@ -230,39 +194,24 @@ class TelemetryManager {
230
194
  instrumentApp() {
231
195
  // Setup telemetry provider first
232
196
  core_1.telemetryRegistry.registerProvider(new telemetry_provider_1.OtelTelemetryProvider());
197
+ // Setup TracerProvider and other providers BEFORE instrumentation
198
+ this.setupProviders();
233
199
  const httpInstrumentation = new instrumentation_http_1.HttpInstrumentation({
234
- requireParentforOutgoingSpans: true, // Maintain parent-child relationships
200
+ requireParentforOutgoingSpans: false, // Allow spans from incoming headers
235
201
  requestHook: (span) => {
236
202
  // Debug incoming trace headers
237
203
  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");
251
204
  // Check current span context after HTTP instrumentation processes headers
252
205
  const activeSpan = api_1.trace.getActiveSpan();
253
206
  if (activeSpan) {
254
- console.log("Active span found in request hook:", {
207
+ console.log("Active span in request hook:", {
255
208
  traceId: activeSpan.spanContext().traceId,
256
209
  spanId: activeSpan.spanContext().spanId,
257
210
  traceFlags: activeSpan.spanContext().traceFlags,
258
211
  });
259
212
  }
260
213
  else {
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");
214
+ console.log("No active span found in request hook");
266
215
  }
267
216
  console.log("Current span from hook parameter:", {
268
217
  traceId: span.spanContext().traceId,
@@ -276,6 +225,24 @@ class TelemetryManager {
276
225
  instrumentations: [httpInstrumentation],
277
226
  });
278
227
  }
228
+ setupProviders() {
229
+ const resource = new BlaxelResource(this.resourceAttributes);
230
+ // Setup TracerProvider first - this is critical for context propagation
231
+ this.nodeTracerProvider = new sdk_trace_node_1.NodeTracerProvider({
232
+ resource,
233
+ sampler: new sdk_trace_node_1.AlwaysOnSampler(),
234
+ spanProcessors: [
235
+ new DefaultAttributesSpanProcessor({
236
+ "workload.id": core_1.settings.name || "",
237
+ "workload.type": core_1.settings.type ? core_1.settings.type + "s" : "",
238
+ workspace: core_1.settings.workspace || "",
239
+ }),
240
+ ],
241
+ });
242
+ // Register the tracer provider BEFORE any instrumentation
243
+ this.nodeTracerProvider.register();
244
+ console.log("TracerProvider registered - ready for context propagation");
245
+ }
279
246
  setExporters() {
280
247
  const resource = new BlaxelResource(this.resourceAttributes);
281
248
  // Setup logging
@@ -285,38 +252,24 @@ class TelemetryManager {
285
252
  });
286
253
  this.loggerProvider.addLogRecordProcessor(new sdk_logs_1.BatchLogRecordProcessor(logExporter));
287
254
  api_logs_1.logs.setGlobalLoggerProvider(this.loggerProvider);
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
- }
255
+ // Recreate TracerProvider with exporters - this ensures proper initialization
256
+ const traceExporter = this.getTraceExporter();
257
+ this.nodeTracerProvider = new sdk_trace_node_1.NodeTracerProvider({
258
+ resource,
259
+ sampler: new sdk_trace_node_1.AlwaysOnSampler(),
260
+ spanProcessors: [
261
+ new DefaultAttributesSpanProcessor({
262
+ "workload.id": core_1.settings.name || "",
263
+ "workload.type": core_1.settings.type ? core_1.settings.type + "s" : "",
264
+ workspace: core_1.settings.workspace || "",
265
+ }),
266
+ new sdk_trace_node_1.BatchSpanProcessor(traceExporter),
267
+ new HasBeenProcessedSpanProcessor(traceExporter),
268
+ ],
269
+ });
270
+ // Re-register the tracer provider with exporters
271
+ this.nodeTracerProvider.register();
272
+ console.log("TracerProvider re-registered with exporters");
320
273
  // Setup metrics
321
274
  const metricExporter = this.getMetricExporter();
322
275
  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.141",
3
+ "version": "0.2.18-dev.142",
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.141"
74
+ "@blaxel/core": "0.2.18-dev.142"
75
75
  },
76
76
  "devDependencies": {
77
77
  "@eslint/js": "^9.26.0",