@blaxel/telemetry 0.2.18-dev.134 → 0.2.18-dev.137

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.
@@ -59,6 +59,7 @@ declare class TelemetryManager {
59
59
  */
60
60
  getLogExporter(): OTLPLogExporter;
61
61
  instrumentApp(): void;
62
+ setupProviders(): void;
62
63
  setExporters(): void;
63
64
  shutdownApp(): Promise<void>;
64
65
  }
package/dist/telemetry.js CHANGED
@@ -192,22 +192,67 @@ class TelemetryManager {
192
192
  });
193
193
  }
194
194
  instrumentApp() {
195
+ // Setup telemetry provider first
195
196
  core_1.telemetryRegistry.registerProvider(new telemetry_provider_1.OtelTelemetryProvider());
197
+ // Setup TracerProvider and other providers BEFORE instrumentation
198
+ this.setupProviders();
196
199
  const httpInstrumentation = new instrumentation_http_1.HttpInstrumentation({
197
- requireParentforOutgoingSpans: true,
200
+ requireParentforOutgoingSpans: false, // Allow spans from incoming headers
201
+ requestHook: (span) => {
202
+ // Debug incoming trace headers
203
+ console.log("=== HTTP INSTRUMENTATION REQUEST HOOK ===");
204
+ // Check current span context after HTTP instrumentation processes headers
205
+ const activeSpan = api_1.trace.getActiveSpan();
206
+ if (activeSpan) {
207
+ console.log("Active span in request hook:", {
208
+ traceId: activeSpan.spanContext().traceId,
209
+ spanId: activeSpan.spanContext().spanId,
210
+ traceFlags: activeSpan.spanContext().traceFlags,
211
+ });
212
+ }
213
+ else {
214
+ console.log("No active span found in request hook");
215
+ }
216
+ console.log("Current span from hook parameter:", {
217
+ traceId: span.spanContext().traceId,
218
+ spanId: span.spanContext().spanId,
219
+ traceFlags: span.spanContext().traceFlags,
220
+ });
221
+ console.log("=== END HTTP INSTRUMENTATION REQUEST HOOK ===");
222
+ },
198
223
  });
199
224
  (0, instrumentation_1.registerInstrumentations)({
200
225
  instrumentations: [httpInstrumentation],
201
226
  });
202
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
+ }
203
246
  setExporters() {
204
247
  const resource = new BlaxelResource(this.resourceAttributes);
248
+ // Setup logging
205
249
  const logExporter = this.getLogExporter();
206
250
  this.loggerProvider = new sdk_logs_1.LoggerProvider({
207
251
  resource,
208
252
  });
209
253
  this.loggerProvider.addLogRecordProcessor(new sdk_logs_1.BatchLogRecordProcessor(logExporter));
210
254
  api_logs_1.logs.setGlobalLoggerProvider(this.loggerProvider);
255
+ // Recreate TracerProvider with exporters - this ensures proper initialization
211
256
  const traceExporter = this.getTraceExporter();
212
257
  this.nodeTracerProvider = new sdk_trace_node_1.NodeTracerProvider({
213
258
  resource,
@@ -222,7 +267,10 @@ class TelemetryManager {
222
267
  new HasBeenProcessedSpanProcessor(traceExporter),
223
268
  ],
224
269
  });
270
+ // Re-register the tracer provider with exporters
225
271
  this.nodeTracerProvider.register();
272
+ console.log("TracerProvider re-registered with exporters");
273
+ // Setup metrics
226
274
  const metricExporter = this.getMetricExporter();
227
275
  this.meterProvider = new sdk_metrics_1.MeterProvider({
228
276
  resource,
@@ -1,7 +1,5 @@
1
1
  import { BlaxelSpan, BlaxelSpanOptions, BlaxelTelemetryProvider } from "@blaxel/core";
2
2
  export declare class OtelTelemetryProvider implements BlaxelTelemetryProvider {
3
- private spans;
4
- retrieveActiveSpanContext(): import("@opentelemetry/api").Context;
5
3
  startSpan(name: string, options?: BlaxelSpanOptions): BlaxelSpan;
6
4
  flush(): Promise<void>;
7
5
  }
@@ -21,7 +21,7 @@ class OtelSpan {
21
21
  }
22
22
  setStatus(status, message) {
23
23
  this.span.setStatus({
24
- code: status === 'ok' ? api_1.SpanStatusCode.OK : api_1.SpanStatusCode.ERROR,
24
+ code: status === "ok" ? api_1.SpanStatusCode.OK : api_1.SpanStatusCode.ERROR,
25
25
  message,
26
26
  });
27
27
  }
@@ -34,25 +34,39 @@ class OtelSpan {
34
34
  }
35
35
  }
36
36
  class OtelTelemetryProvider {
37
- spans = [];
38
- retrieveActiveSpanContext() {
39
- for (let i = this.spans.length - 1; i >= 0; i--) {
40
- const span = this.spans[i];
41
- if (!span.closed) {
42
- return api_1.trace.setSpanContext(api_1.ROOT_CONTEXT, span.getContext());
43
- }
44
- }
45
- return api_1.context.active();
46
- }
47
37
  startSpan(name, options) {
48
38
  const tracer = api_1.trace.getTracer("blaxel");
39
+ // Get the current active context - this will include any traceparent propagation
40
+ const activeContext = api_1.context.active();
41
+ const activeSpan = api_1.trace.getActiveSpan();
42
+ // Debug logging to help understand context propagation
43
+ console.log("=== CREATING NEW SPAN ===");
44
+ console.log("Span name:", name);
45
+ console.log("Active context span:", activeSpan
46
+ ? {
47
+ traceId: activeSpan.spanContext().traceId,
48
+ spanId: activeSpan.spanContext().spanId,
49
+ traceFlags: activeSpan.spanContext().traceFlags,
50
+ }
51
+ : "null");
52
+ // Check if there's a span context in the active context (from traceparent headers)
53
+ const spanContext = api_1.trace.getSpanContext(activeContext);
54
+ if (spanContext) {
55
+ console.log("Span context from active context:", {
56
+ traceId: spanContext.traceId,
57
+ spanId: spanContext.spanId,
58
+ traceFlags: spanContext.traceFlags,
59
+ });
60
+ }
49
61
  const otelOptions = {
50
62
  attributes: options?.attributes,
51
63
  root: options?.isRoot,
52
64
  };
53
- const ctx = this.retrieveActiveSpanContext();
54
- const span = new OtelSpan(tracer.startSpan(name, otelOptions, ctx));
55
- this.spans.push(span);
65
+ // Use the active context unless explicitly requesting a root span
66
+ const contextToUse = options?.isRoot ? api_1.ROOT_CONTEXT : activeContext;
67
+ const span = new OtelSpan(tracer.startSpan(name, otelOptions, contextToUse));
68
+ console.log("Created span context:", span.getContext());
69
+ console.log("=== END CREATING NEW SPAN ===");
56
70
  return span;
57
71
  }
58
72
  async flush() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blaxel/telemetry",
3
- "version": "0.2.18-dev.134",
3
+ "version": "0.2.18-dev.137",
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.134"
74
+ "@blaxel/core": "0.2.18-dev.137"
75
75
  },
76
76
  "devDependencies": {
77
77
  "@eslint/js": "^9.26.0",