@atrim/instrument-node 0.5.1-dev.14fdea7.20260108231120 → 0.5.1-dev.14fdea7.20260109021657

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atrim/instrument-node",
3
- "version": "0.5.1-dev.14fdea7.20260108231120",
3
+ "version": "0.5.1-dev.14fdea7.20260109021657",
4
4
  "description": "OpenTelemetry instrumentation for Node.js with centralized YAML configuration",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -611,67 +611,6 @@ var loadFullConfig = (options) => effect.Effect.gen(function* () {
611
611
  }
612
612
  return config;
613
613
  });
614
-
615
- // src/integrations/effect/auto/effect-tracing.ts
616
- var createEffectTracingLayer = () => {
617
- return effect.Layer.unwrapEffect(
618
- effect.Effect.gen(function* () {
619
- const config = yield* loadFullConfig();
620
- const serviceName = process.env.OTEL_SERVICE_NAME || "effect-service";
621
- const serviceVersion = process.env.npm_package_version || "1.0.0";
622
- const exporterConfig = config.effect?.exporter_config ?? {
623
- type: "otlp",
624
- processor: "batch"
625
- };
626
- logger.log("@atrim/auto-trace: Effect-native tracing enabled");
627
- logger.log(` Service: ${serviceName}`);
628
- logger.log(` Exporter: ${exporterConfig.type}`);
629
- if (exporterConfig.type === "none") {
630
- logger.log('@atrim/auto-trace: Exporter type is "none", using empty layer');
631
- return effect.Layer.empty;
632
- }
633
- const createSpanProcessor = () => {
634
- if (exporterConfig.type === "console") {
635
- logger.log("@atrim/auto-trace: Using ConsoleSpanExporter with SimpleSpanProcessor");
636
- return new sdkTraceBase.SimpleSpanProcessor(new sdkTraceBase.ConsoleSpanExporter());
637
- }
638
- const endpoint = exporterConfig.endpoint || process.env.OTEL_EXPORTER_OTLP_ENDPOINT || "http://localhost:4318";
639
- logger.log(`@atrim/auto-trace: Using OTLPTraceExporter (${endpoint})`);
640
- const otlpConfig = {
641
- url: `${endpoint}/v1/traces`
642
- };
643
- if (exporterConfig.headers) {
644
- otlpConfig.headers = exporterConfig.headers;
645
- logger.log(`@atrim/auto-trace: Using custom headers: ${Object.keys(exporterConfig.headers).join(", ")}`);
646
- }
647
- const exporter = new exporterTraceOtlpHttp.OTLPTraceExporter(otlpConfig);
648
- if (exporterConfig.processor === "simple") {
649
- logger.log("@atrim/auto-trace: Using SimpleSpanProcessor");
650
- return new sdkTraceBase.SimpleSpanProcessor(exporter);
651
- }
652
- const batchConfig = exporterConfig.batch ?? {
653
- scheduled_delay_millis: 1e3,
654
- max_export_batch_size: 100
655
- };
656
- logger.log("@atrim/auto-trace: Using BatchSpanProcessor");
657
- return new sdkTraceBase.BatchSpanProcessor(exporter, {
658
- scheduledDelayMillis: batchConfig.scheduled_delay_millis,
659
- maxExportBatchSize: batchConfig.max_export_batch_size
660
- });
661
- };
662
- const sdkLayer = opentelemetry.NodeSdk.layer(() => ({
663
- resource: {
664
- serviceName,
665
- serviceVersion
666
- },
667
- spanProcessor: createSpanProcessor()
668
- }));
669
- logger.log("@atrim/auto-trace: NodeSdk layer created - HTTP requests will be auto-traced");
670
- return effect.Layer.discard(sdkLayer);
671
- })
672
- );
673
- };
674
- var EffectTracingLive = createEffectTracingLayer();
675
614
  var compiledRulesCache = /* @__PURE__ */ new WeakMap();
676
615
  function compileNamingRules(rules) {
677
616
  const cached = compiledRulesCache.get(rules);
@@ -792,7 +731,7 @@ function sanitizeSpanName(name) {
792
731
  var AutoTracingEnabled = effect.FiberRef.unsafeMake(true);
793
732
  var AutoTracingSpanName = effect.FiberRef.unsafeMake(effect.Option.none());
794
733
  var AutoTracingSupervisor = class extends effect.Supervisor.AbstractSupervisor {
795
- constructor(config) {
734
+ constructor(config, tracerProvider) {
796
735
  super();
797
736
  this.config = config;
798
737
  // WeakMap to associate fibers with their OTel spans
@@ -801,6 +740,8 @@ var AutoTracingSupervisor = class extends effect.Supervisor.AbstractSupervisor {
801
740
  __publicField(this, "fiberStartTimes", /* @__PURE__ */ new WeakMap());
802
741
  // OpenTelemetry tracer - lazily initialized
803
742
  __publicField(this, "_tracer", null);
743
+ // Optional TracerProvider (if provided, use this instead of global)
744
+ __publicField(this, "tracerProvider", null);
804
745
  // Compiled filter patterns
805
746
  __publicField(this, "includePatterns");
806
747
  __publicField(this, "excludePatterns");
@@ -808,6 +749,10 @@ var AutoTracingSupervisor = class extends effect.Supervisor.AbstractSupervisor {
808
749
  __publicField(this, "activeFiberCount", 0);
809
750
  // Root span for parent context (set by withAutoTracing)
810
751
  __publicField(this, "_rootSpan", null);
752
+ if (tracerProvider) {
753
+ this.tracerProvider = tracerProvider;
754
+ logger.log("@atrim/auto-trace: Using provided TracerProvider");
755
+ }
811
756
  this.includePatterns = (config.filter?.include || []).map((p) => new RegExp(p));
812
757
  this.excludePatterns = (config.filter?.exclude || []).map((p) => new RegExp(p));
813
758
  logger.log("@atrim/auto-trace: Supervisor initialized");
@@ -822,11 +767,17 @@ var AutoTracingSupervisor = class extends effect.Supervisor.AbstractSupervisor {
822
767
  this._rootSpan = span;
823
768
  }
824
769
  /**
825
- * Get the tracer lazily - this allows time for the NodeSdk layer to register the global provider
770
+ * Get the tracer lazily - uses provided TracerProvider if available, otherwise uses global
826
771
  */
827
772
  get tracer() {
828
773
  if (!this._tracer) {
829
- this._tracer = OtelApi__namespace.trace.getTracer("@atrim/auto-trace", "1.0.0");
774
+ if (this.tracerProvider) {
775
+ logger.log("@atrim/auto-trace: Getting tracer from provided TracerProvider");
776
+ this._tracer = this.tracerProvider.getTracer("@atrim/auto-trace", "1.0.0");
777
+ } else {
778
+ logger.log("@atrim/auto-trace: Getting tracer from global API");
779
+ this._tracer = OtelApi__namespace.trace.getTracer("@atrim/auto-trace", "1.0.0");
780
+ }
830
781
  }
831
782
  return this._tracer;
832
783
  }
@@ -840,9 +791,11 @@ var AutoTracingSupervisor = class extends effect.Supervisor.AbstractSupervisor {
840
791
  * Called when a fiber starts executing
841
792
  */
842
793
  onStart(_context, _effect, parent, fiber) {
794
+ logger.log(`@atrim/auto-trace: onStart called for fiber ${fiber.id().id}`);
843
795
  const fiberRefsValue = fiber.getFiberRefs();
844
796
  const enabled = effect.FiberRefs.getOrDefault(fiberRefsValue, AutoTracingEnabled);
845
797
  if (!enabled) {
798
+ logger.log(`@atrim/auto-trace: Auto-tracing disabled for fiber ${fiber.id().id}`);
846
799
  return;
847
800
  }
848
801
  const samplingRate = this.config.performance?.sampling_rate ?? 1;
@@ -866,7 +819,19 @@ var AutoTracingSupervisor = class extends effect.Supervisor.AbstractSupervisor {
866
819
  }
867
820
  let parentContext = OtelApi__namespace.ROOT_CONTEXT;
868
821
  let parentFiberId;
869
- if (effect.Option.isSome(parent)) {
822
+ const maybeEffectParentSpan = effect.Context.getOption(_context, effect.Tracer.ParentSpan);
823
+ if (effect.Option.isSome(maybeEffectParentSpan)) {
824
+ const effectSpan = maybeEffectParentSpan.value;
825
+ logger.log(`@atrim/auto-trace: Found ParentSpan - traceId=${effectSpan.traceId.slice(0, 8)}..., spanId=${effectSpan.spanId.slice(0, 8)}...`);
826
+ const otelSpanContext = {
827
+ traceId: effectSpan.traceId,
828
+ spanId: effectSpan.spanId,
829
+ traceFlags: effectSpan.sampled ? OtelApi__namespace.TraceFlags.SAMPLED : OtelApi__namespace.TraceFlags.NONE,
830
+ isRemote: false
831
+ };
832
+ const wrappedSpan = OtelApi__namespace.trace.wrapSpanContext(otelSpanContext);
833
+ parentContext = OtelApi__namespace.trace.setSpan(OtelApi__namespace.ROOT_CONTEXT, wrappedSpan);
834
+ } else if (effect.Option.isSome(parent)) {
870
835
  parentFiberId = parent.value.id().id;
871
836
  const parentSpan = this.fiberSpans.get(parent.value);
872
837
  if (parentSpan) {
@@ -877,6 +842,9 @@ var AutoTracingSupervisor = class extends effect.Supervisor.AbstractSupervisor {
877
842
  } else if (this._rootSpan) {
878
843
  parentContext = OtelApi__namespace.trace.setSpan(OtelApi__namespace.ROOT_CONTEXT, this._rootSpan);
879
844
  }
845
+ if (effect.Option.isSome(parent)) {
846
+ parentFiberId = parent.value.id().id;
847
+ }
880
848
  const span = this.tracer.startSpan(
881
849
  spanName,
882
850
  {
@@ -885,6 +853,7 @@ var AutoTracingSupervisor = class extends effect.Supervisor.AbstractSupervisor {
885
853
  },
886
854
  parentContext
887
855
  );
856
+ logger.log(`@atrim/auto-trace: Created span "${spanName}" for fiber ${fiber.id().id}`);
888
857
  this.fiberSpans.set(fiber, span);
889
858
  this.fiberStartTimes.set(fiber, process.hrtime.bigint());
890
859
  this.activeFiberCount++;
@@ -1012,8 +981,8 @@ var AutoTracingSupervisor = class extends effect.Supervisor.AbstractSupervisor {
1012
981
  }
1013
982
  }
1014
983
  };
1015
- var createAutoTracingSupervisor = (config) => {
1016
- return new AutoTracingSupervisor(config);
984
+ var createAutoTracingSupervisor = (config, tracerProvider) => {
985
+ return new AutoTracingSupervisor(config, tracerProvider);
1017
986
  };
1018
987
  var createAutoTracingLayer = (options) => {
1019
988
  return effect.Layer.unwrapEffect(
@@ -1156,6 +1125,157 @@ var createFullAutoTracingLayer = () => {
1156
1125
  };
1157
1126
  var FullAutoTracingLive = createFullAutoTracingLayer();
1158
1127
 
1128
+ // src/integrations/effect/auto/effect-tracing.ts
1129
+ var createEffectTracingLayer = () => {
1130
+ return effect.Layer.unwrapEffect(
1131
+ effect.Effect.gen(function* () {
1132
+ const config = yield* loadFullConfig();
1133
+ const serviceName = process.env.OTEL_SERVICE_NAME || "effect-service";
1134
+ const serviceVersion = process.env.npm_package_version || "1.0.0";
1135
+ const exporterConfig = config.effect?.exporter_config ?? {
1136
+ type: "otlp",
1137
+ processor: "batch"
1138
+ };
1139
+ logger.log("@atrim/auto-trace: Effect-native tracing enabled");
1140
+ logger.log(` Service: ${serviceName}`);
1141
+ logger.log(` Exporter: ${exporterConfig.type}`);
1142
+ if (exporterConfig.type === "none") {
1143
+ logger.log('@atrim/auto-trace: Exporter type is "none", using empty layer');
1144
+ return effect.Layer.empty;
1145
+ }
1146
+ const createSpanProcessor = () => {
1147
+ if (exporterConfig.type === "console") {
1148
+ logger.log("@atrim/auto-trace: Using ConsoleSpanExporter with SimpleSpanProcessor");
1149
+ return new sdkTraceBase.SimpleSpanProcessor(new sdkTraceBase.ConsoleSpanExporter());
1150
+ }
1151
+ const endpoint = exporterConfig.endpoint || process.env.OTEL_EXPORTER_OTLP_ENDPOINT || "http://localhost:4318";
1152
+ logger.log(`@atrim/auto-trace: Using OTLPTraceExporter (${endpoint})`);
1153
+ const otlpConfig = {
1154
+ url: `${endpoint}/v1/traces`
1155
+ };
1156
+ if (exporterConfig.headers) {
1157
+ otlpConfig.headers = exporterConfig.headers;
1158
+ logger.log(`@atrim/auto-trace: Using custom headers: ${Object.keys(exporterConfig.headers).join(", ")}`);
1159
+ }
1160
+ const exporter = new exporterTraceOtlpHttp.OTLPTraceExporter(otlpConfig);
1161
+ if (exporterConfig.processor === "simple") {
1162
+ logger.log("@atrim/auto-trace: Using SimpleSpanProcessor");
1163
+ return new sdkTraceBase.SimpleSpanProcessor(exporter);
1164
+ }
1165
+ const batchConfig = exporterConfig.batch ?? {
1166
+ scheduled_delay_millis: 1e3,
1167
+ max_export_batch_size: 100
1168
+ };
1169
+ logger.log("@atrim/auto-trace: Using BatchSpanProcessor");
1170
+ return new sdkTraceBase.BatchSpanProcessor(exporter, {
1171
+ scheduledDelayMillis: batchConfig.scheduled_delay_millis,
1172
+ maxExportBatchSize: batchConfig.max_export_batch_size
1173
+ });
1174
+ };
1175
+ const sdkLayer = opentelemetry.NodeSdk.layer(() => ({
1176
+ resource: {
1177
+ serviceName,
1178
+ serviceVersion
1179
+ },
1180
+ spanProcessor: createSpanProcessor()
1181
+ }));
1182
+ logger.log("@atrim/auto-trace: NodeSdk layer created - HTTP requests will be auto-traced");
1183
+ return effect.Layer.discard(sdkLayer);
1184
+ })
1185
+ );
1186
+ };
1187
+ var EffectTracingLive = createEffectTracingLayer();
1188
+ var createCombinedTracingLayer = () => {
1189
+ return effect.Layer.unwrapEffect(
1190
+ effect.Effect.gen(function* () {
1191
+ const config = yield* loadFullConfig();
1192
+ const serviceName = process.env.OTEL_SERVICE_NAME || "effect-service";
1193
+ const serviceVersion = process.env.npm_package_version || "1.0.0";
1194
+ const exporterConfig = config.effect?.exporter_config ?? {
1195
+ type: "otlp",
1196
+ processor: "batch"
1197
+ };
1198
+ const autoConfig = config.effect?.auto_instrumentation ?? {
1199
+ enabled: true,
1200
+ granularity: "fiber",
1201
+ span_naming: {
1202
+ default: "effect.{function}",
1203
+ infer_from_source: true,
1204
+ rules: []
1205
+ },
1206
+ filter: { include: [], exclude: [] },
1207
+ performance: { sampling_rate: 1, min_duration: "0ms", max_concurrent: 0 },
1208
+ metadata: { fiber_info: true, source_location: true, parent_fiber: true }
1209
+ };
1210
+ logger.log("@atrim/auto-trace: Combined tracing enabled (HTTP + Fiber)");
1211
+ logger.log(` Service: ${serviceName}`);
1212
+ logger.log(` Exporter: ${exporterConfig.type}`);
1213
+ if (exporterConfig.type === "none") {
1214
+ logger.log('@atrim/auto-trace: Exporter type is "none", using empty layer');
1215
+ return effect.Layer.empty;
1216
+ }
1217
+ const createSpanProcessor = () => {
1218
+ if (exporterConfig.type === "console") {
1219
+ logger.log("@atrim/auto-trace: Using ConsoleSpanExporter with SimpleSpanProcessor");
1220
+ return new sdkTraceBase.SimpleSpanProcessor(new sdkTraceBase.ConsoleSpanExporter());
1221
+ }
1222
+ const endpoint = exporterConfig.endpoint || process.env.OTEL_EXPORTER_OTLP_ENDPOINT || "http://localhost:4318";
1223
+ logger.log(`@atrim/auto-trace: Using OTLPTraceExporter (${endpoint})`);
1224
+ const otlpConfig = {
1225
+ url: `${endpoint}/v1/traces`
1226
+ };
1227
+ if (exporterConfig.headers) {
1228
+ otlpConfig.headers = exporterConfig.headers;
1229
+ logger.log(`@atrim/auto-trace: Using custom headers: ${Object.keys(exporterConfig.headers).join(", ")}`);
1230
+ }
1231
+ const exporter = new exporterTraceOtlpHttp.OTLPTraceExporter(otlpConfig);
1232
+ if (exporterConfig.processor === "simple") {
1233
+ logger.log("@atrim/auto-trace: Using SimpleSpanProcessor");
1234
+ return new sdkTraceBase.SimpleSpanProcessor(exporter);
1235
+ }
1236
+ const batchConfig = exporterConfig.batch ?? {
1237
+ scheduled_delay_millis: 1e3,
1238
+ max_export_batch_size: 100
1239
+ };
1240
+ logger.log("@atrim/auto-trace: Using BatchSpanProcessor");
1241
+ return new sdkTraceBase.BatchSpanProcessor(exporter, {
1242
+ scheduledDelayMillis: batchConfig.scheduled_delay_millis,
1243
+ maxExportBatchSize: batchConfig.max_export_batch_size
1244
+ });
1245
+ };
1246
+ const sdkLayer = opentelemetry.NodeSdk.layer(() => ({
1247
+ resource: {
1248
+ serviceName,
1249
+ serviceVersion
1250
+ },
1251
+ spanProcessor: createSpanProcessor()
1252
+ }));
1253
+ const supervisorLayer = effect.Layer.unwrapScoped(
1254
+ effect.Effect.gen(function* () {
1255
+ const tracerProvider = yield* effect.Effect.serviceOption(opentelemetry.Tracer.OtelTracerProvider);
1256
+ if (effect.Option.isSome(tracerProvider)) {
1257
+ logger.log("@atrim/auto-trace: Got TracerProvider from NodeSdk layer");
1258
+ const supervisor = createAutoTracingSupervisor(autoConfig, tracerProvider.value);
1259
+ logger.log("@atrim/auto-trace: Combined layer created");
1260
+ logger.log(" - HTTP requests: auto-traced via Effect platform");
1261
+ logger.log(" - Forked fibers: auto-traced via Supervisor");
1262
+ return effect.Supervisor.addSupervisor(supervisor);
1263
+ } else {
1264
+ logger.log("@atrim/auto-trace: WARNING: No TracerProvider found, creating supervisor without it");
1265
+ const supervisor = createAutoTracingSupervisor(autoConfig);
1266
+ logger.log("@atrim/auto-trace: Combined layer created (fallback)");
1267
+ logger.log(" - HTTP requests: auto-traced via Effect platform");
1268
+ logger.log(" - Forked fibers: auto-traced via Supervisor");
1269
+ return effect.Supervisor.addSupervisor(supervisor);
1270
+ }
1271
+ })
1272
+ );
1273
+ return supervisorLayer.pipe(effect.Layer.provide(effect.Layer.discard(sdkLayer)));
1274
+ })
1275
+ );
1276
+ };
1277
+ var CombinedTracingLive = createCombinedTracingLayer();
1278
+
1159
1279
  exports.AutoTracingConfig = AutoTracingConfig;
1160
1280
  exports.AutoTracingConfigLayer = AutoTracingConfigLayer;
1161
1281
  exports.AutoTracingConfigLive = AutoTracingConfigLive;
@@ -1163,10 +1283,12 @@ exports.AutoTracingEnabled = AutoTracingEnabled;
1163
1283
  exports.AutoTracingLive = AutoTracingLive;
1164
1284
  exports.AutoTracingSpanName = AutoTracingSpanName;
1165
1285
  exports.AutoTracingSupervisor = AutoTracingSupervisor;
1286
+ exports.CombinedTracingLive = CombinedTracingLive;
1166
1287
  exports.EffectTracingLive = EffectTracingLive;
1167
1288
  exports.FullAutoTracingLive = FullAutoTracingLive;
1168
1289
  exports.createAutoTracingLayer = createAutoTracingLayer;
1169
1290
  exports.createAutoTracingSupervisor = createAutoTracingSupervisor;
1291
+ exports.createCombinedTracingLayer = createCombinedTracingLayer;
1170
1292
  exports.createEffectTracingLayer = createEffectTracingLayer;
1171
1293
  exports.createFullAutoTracingLayer = createFullAutoTracingLayer;
1172
1294
  exports.defaultAutoTracingConfig = defaultAutoTracingConfig;