autotel 2.25.2 → 2.25.3

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.
Files changed (113) hide show
  1. package/README.md +152 -1
  2. package/dist/attributes.d.cts +2 -2
  3. package/dist/attributes.d.ts +2 -2
  4. package/dist/auto.cjs +6 -6
  5. package/dist/auto.js +4 -4
  6. package/dist/{chunk-QUW4I2OI.js → chunk-3ZLYWPMY.js} +3 -3
  7. package/dist/{chunk-QUW4I2OI.js.map → chunk-3ZLYWPMY.js.map} +1 -1
  8. package/dist/{chunk-BGVKKL2N.cjs → chunk-7FIGORWI.cjs} +46 -2
  9. package/dist/chunk-7FIGORWI.cjs.map +1 -0
  10. package/dist/{chunk-MNMLCLHH.cjs → chunk-AQXPGGQK.cjs} +5 -5
  11. package/dist/{chunk-MNMLCLHH.cjs.map → chunk-AQXPGGQK.cjs.map} +1 -1
  12. package/dist/{chunk-4KGC5N3J.cjs → chunk-FXKB7EPR.cjs} +13 -13
  13. package/dist/{chunk-4KGC5N3J.cjs.map → chunk-FXKB7EPR.cjs.map} +1 -1
  14. package/dist/{chunk-4SCBD22Z.js → chunk-IFKDBL65.js} +3 -3
  15. package/dist/{chunk-4SCBD22Z.js.map → chunk-IFKDBL65.js.map} +1 -1
  16. package/dist/{chunk-JVICEM6W.cjs → chunk-ITYASFHQ.cjs} +91 -19
  17. package/dist/chunk-ITYASFHQ.cjs.map +1 -0
  18. package/dist/{chunk-IKRHEUS7.js → chunk-JM63D22M.js} +10 -10
  19. package/dist/{chunk-IKRHEUS7.js.map → chunk-JM63D22M.js.map} +1 -1
  20. package/dist/{chunk-GVLK7YUU.cjs → chunk-KZEC4CHV.cjs} +6 -4
  21. package/dist/chunk-KZEC4CHV.cjs.map +1 -0
  22. package/dist/{chunk-VXLEJWLY.js → chunk-MNBAXRVG.js} +89 -17
  23. package/dist/chunk-MNBAXRVG.js.map +1 -0
  24. package/dist/{chunk-6YIDHH2S.cjs → chunk-OFPZULMQ.cjs} +32 -10
  25. package/dist/chunk-OFPZULMQ.cjs.map +1 -0
  26. package/dist/{chunk-UKUYBUFQ.cjs → chunk-OWXXS4JB.cjs} +7 -7
  27. package/dist/{chunk-UKUYBUFQ.cjs.map → chunk-OWXXS4JB.cjs.map} +1 -1
  28. package/dist/{chunk-77PLEJ54.js → chunk-PKXD2RMI.js} +4 -4
  29. package/dist/{chunk-77PLEJ54.js.map → chunk-PKXD2RMI.js.map} +1 -1
  30. package/dist/{chunk-RWOVNF3V.cjs → chunk-RMGSBMQF.cjs} +36 -36
  31. package/dist/chunk-RMGSBMQF.cjs.map +1 -0
  32. package/dist/{chunk-YTGF4L2C.js → chunk-RUD7KS4R.js} +27 -5
  33. package/dist/chunk-RUD7KS4R.js.map +1 -0
  34. package/dist/{chunk-KUSYIHW7.js → chunk-VVYSQXQL.js} +3 -3
  35. package/dist/{chunk-KUSYIHW7.js.map → chunk-VVYSQXQL.js.map} +1 -1
  36. package/dist/{chunk-XND7WBVX.js → chunk-VYA6QDNA.js} +43 -3
  37. package/dist/chunk-VYA6QDNA.js.map +1 -0
  38. package/dist/{chunk-L627YSSP.cjs → chunk-WOWTZ4EB.cjs} +9 -9
  39. package/dist/{chunk-L627YSSP.cjs.map → chunk-WOWTZ4EB.cjs.map} +1 -1
  40. package/dist/{chunk-X4RMFFMR.js → chunk-XDKK53OL.js} +6 -4
  41. package/dist/chunk-XDKK53OL.js.map +1 -0
  42. package/dist/decorators.cjs +5 -5
  43. package/dist/decorators.js +5 -5
  44. package/dist/event.cjs +8 -8
  45. package/dist/event.js +5 -5
  46. package/dist/functional.cjs +12 -12
  47. package/dist/functional.js +5 -5
  48. package/dist/index.cjs +71 -51
  49. package/dist/index.d.cts +4 -4
  50. package/dist/index.d.ts +4 -4
  51. package/dist/index.js +13 -13
  52. package/dist/{init-Q4uIQKbq.d.cts → init-CIzpC5kZ.d.cts} +9 -2
  53. package/dist/{init-ls4xSZe5.d.ts → init-C_PiC_Su.d.ts} +9 -2
  54. package/dist/instrumentation.cjs +12 -12
  55. package/dist/instrumentation.cjs.map +1 -1
  56. package/dist/instrumentation.js +4 -4
  57. package/dist/instrumentation.js.map +1 -1
  58. package/dist/messaging-adapters.d.cts +1 -1
  59. package/dist/messaging-adapters.d.ts +1 -1
  60. package/dist/messaging.cjs +9 -9
  61. package/dist/messaging.d.cts +1 -1
  62. package/dist/messaging.d.ts +1 -1
  63. package/dist/messaging.js +6 -6
  64. package/dist/metric-helpers.d.cts +1 -1
  65. package/dist/metric-helpers.d.ts +1 -1
  66. package/dist/sampling.cjs +26 -10
  67. package/dist/sampling.d.cts +49 -1
  68. package/dist/sampling.d.ts +49 -1
  69. package/dist/sampling.js +1 -1
  70. package/dist/semantic-helpers.cjs +10 -10
  71. package/dist/semantic-helpers.js +6 -6
  72. package/dist/tail-sampling-processor.cjs +6 -2
  73. package/dist/tail-sampling-processor.d.cts +2 -2
  74. package/dist/tail-sampling-processor.d.ts +2 -2
  75. package/dist/tail-sampling-processor.js +5 -1
  76. package/dist/trace-helpers.d.cts +1 -1
  77. package/dist/trace-helpers.d.ts +1 -1
  78. package/dist/{utils-D1trOLNm.d.ts → utils-Buel3cj0.d.ts} +1 -1
  79. package/dist/{utils-DuNJfXSH.d.cts → utils-CbUkl8r1.d.cts} +1 -1
  80. package/dist/webhook.cjs +6 -6
  81. package/dist/webhook.js +5 -5
  82. package/dist/workflow-distributed.cjs +7 -7
  83. package/dist/workflow-distributed.js +5 -5
  84. package/dist/workflow.cjs +10 -10
  85. package/dist/workflow.js +6 -6
  86. package/dist/yaml-config.cjs +5 -5
  87. package/dist/yaml-config.d.cts +5 -4
  88. package/dist/yaml-config.d.ts +5 -4
  89. package/dist/yaml-config.js +2 -2
  90. package/package.json +1 -1
  91. package/src/env-config.test.ts +77 -0
  92. package/src/env-config.ts +106 -0
  93. package/src/functional.ts +13 -7
  94. package/src/index.ts +6 -0
  95. package/src/init.customization.test.ts +61 -0
  96. package/src/init.integrations.test.ts +6 -1
  97. package/src/init.ts +23 -13
  98. package/src/instrumentation.ts +1 -1
  99. package/src/sampling.test.ts +96 -3
  100. package/src/sampling.ts +90 -0
  101. package/src/tail-sampling-processor.test.ts +26 -22
  102. package/src/tail-sampling-processor.ts +8 -4
  103. package/src/yaml-config.test.ts +71 -0
  104. package/src/yaml-config.ts +32 -2
  105. package/dist/chunk-6YIDHH2S.cjs.map +0 -1
  106. package/dist/chunk-BGVKKL2N.cjs.map +0 -1
  107. package/dist/chunk-GVLK7YUU.cjs.map +0 -1
  108. package/dist/chunk-JVICEM6W.cjs.map +0 -1
  109. package/dist/chunk-RWOVNF3V.cjs.map +0 -1
  110. package/dist/chunk-VXLEJWLY.js.map +0 -1
  111. package/dist/chunk-X4RMFFMR.js.map +0 -1
  112. package/dist/chunk-XND7WBVX.js.map +0 -1
  113. package/dist/chunk-YTGF4L2C.js.map +0 -1
@@ -1,15 +1,15 @@
1
1
  'use strict';
2
2
 
3
- var chunkJVICEM6W_cjs = require('./chunk-JVICEM6W.cjs');
4
- require('./chunk-6YIDHH2S.cjs');
5
- var chunkGVLK7YUU_cjs = require('./chunk-GVLK7YUU.cjs');
3
+ var chunkITYASFHQ_cjs = require('./chunk-ITYASFHQ.cjs');
4
+ require('./chunk-OFPZULMQ.cjs');
5
+ var chunkKZEC4CHV_cjs = require('./chunk-KZEC4CHV.cjs');
6
6
  require('./chunk-ZNMBW67B.cjs');
7
7
  require('./chunk-IOYFAFHJ.cjs');
8
8
  require('./chunk-ELW34S4C.cjs');
9
9
  require('./chunk-CU6IDACR.cjs');
10
10
  require('./chunk-6S5RUKU3.cjs');
11
11
  var chunkYS6C2YJE_cjs = require('./chunk-YS6C2YJE.cjs');
12
- require('./chunk-BGVKKL2N.cjs');
12
+ require('./chunk-7FIGORWI.cjs');
13
13
  require('./chunk-AZ24DJAG.cjs');
14
14
  require('./chunk-ESLWRGAG.cjs');
15
15
  require('./chunk-YREV3LGG.cjs');
@@ -53,17 +53,17 @@ var shutdownHandlerRegistered = false;
53
53
  async function shutdownInstrumentation(sdk) {
54
54
  const sdkToShutdown = sdk || currentSDK;
55
55
  if (!sdkToShutdown) {
56
- chunkJVICEM6W_cjs.getLogger().warn({}, "No SDK to shutdown");
56
+ chunkITYASFHQ_cjs.getLogger().warn({}, "No SDK to shutdown");
57
57
  return;
58
58
  }
59
59
  try {
60
60
  await sdkToShutdown.shutdown();
61
- chunkJVICEM6W_cjs.getLogger().info({}, "OpenTelemetry terminated successfully");
61
+ chunkITYASFHQ_cjs.getLogger().info({}, "OpenTelemetry terminated successfully");
62
62
  if (sdkToShutdown === currentSDK) {
63
63
  currentSDK = null;
64
64
  }
65
65
  } catch (error) {
66
- chunkJVICEM6W_cjs.getLogger().error(
66
+ chunkITYASFHQ_cjs.getLogger().error(
67
67
  {
68
68
  err: error instanceof Error ? error : void 0
69
69
  },
@@ -74,7 +74,7 @@ async function shutdownInstrumentation(sdk) {
74
74
  }
75
75
  async function initInstrumentation(config) {
76
76
  if (currentSDK) {
77
- chunkJVICEM6W_cjs.getLogger().info(
77
+ chunkITYASFHQ_cjs.getLogger().info(
78
78
  {},
79
79
  "Shutting down existing OpenTelemetry SDK before reinitializing..."
80
80
  );
@@ -136,7 +136,7 @@ async function initInstrumentation(config) {
136
136
  url: `${config.otlpEndpoint || "http://localhost:4318"}/v1/traces`,
137
137
  headers: otlpHeaders
138
138
  });
139
- const spanProcessor = new chunkGVLK7YUU_cjs.TailSamplingSpanProcessor(
139
+ const spanProcessor = new chunkKZEC4CHV_cjs.TailSamplingSpanProcessor(
140
140
  new sdkTraceBase.BatchSpanProcessor(traceExporter)
141
141
  );
142
142
  const sdk = new sdkNode.NodeSDK({
@@ -161,9 +161,9 @@ async function initInstrumentation(config) {
161
161
  });
162
162
  try {
163
163
  await sdk.start();
164
- chunkJVICEM6W_cjs.getLogger().info({}, "OpenTelemetry instrumentation started successfully");
164
+ chunkITYASFHQ_cjs.getLogger().info({}, "OpenTelemetry instrumentation started successfully");
165
165
  } catch (error) {
166
- chunkJVICEM6W_cjs.getLogger().error(
166
+ chunkITYASFHQ_cjs.getLogger().error(
167
167
  {
168
168
  err: error instanceof Error ? error : void 0
169
169
  },
@@ -178,7 +178,7 @@ async function initInstrumentation(config) {
178
178
  shutdownInstrumentation().then(() => {
179
179
  process.exit(0);
180
180
  }).catch((error) => {
181
- chunkJVICEM6W_cjs.getLogger().error(
181
+ chunkITYASFHQ_cjs.getLogger().error(
182
182
  {
183
183
  err: error instanceof Error ? error : void 0
184
184
  },
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/instrumentation.ts"],"names":["getLogger","processDetector","hostDetector","detectResources","resourceFromAttributes","ATTR_SERVICE_NAME","ATTR_SERVICE_VERSION","requireModule","OTLPTraceExporter","TailSamplingSpanProcessor","BatchSpanProcessor","NodeSDK","PeriodicExportingMetricReader","OTLPMetricExporter","BatchLogRecordProcessor","OTLPLogExporter"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,SAAS,iBAAiB,aAAA,EAAgD;AACxE,EAAA,IAAI,CAAC,aAAA,EAAe,OAAO,EAAC;AAE5B,EAAA,MAAM,UAAkC,EAAC;AACzC,EAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,KAAA,CAAM,GAAG,CAAA;AAErC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,CAAC,GAAA,EAAK,GAAG,UAAU,CAAA,GAAI,IAAA,CAAK,MAAM,GAAG,CAAA;AAC3C,IAAA,IAAI,GAAA,IAAO,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG;AAChC,MAAA,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,GAAI,WAAW,IAAA,CAAK,GAAG,EAAE,IAAA,EAAK;AAAA,IAClD;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AAOA,SAAS,wBACP,gBAAA,EACwB;AACxB,EAAA,IAAI,CAAC,gBAAA,EAAkB,OAAO,EAAC;AAE/B,EAAA,MAAM,aAAqC,EAAC;AAC5C,EAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,KAAA,CAAM,GAAG,CAAA;AAExC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,CAAC,GAAA,EAAK,GAAG,UAAU,CAAA,GAAI,IAAA,CAAK,MAAM,GAAG,CAAA;AAC3C,IAAA,IAAI,GAAA,IAAO,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG;AAChC,MAAA,UAAA,CAAW,GAAA,CAAI,MAAM,CAAA,GAAI,WAAW,IAAA,CAAK,GAAG,EAAE,IAAA,EAAK;AAAA,IACrD;AAAA,EACF;AAEA,EAAA,OAAO,UAAA;AACT;AAuEA,IAAI,UAAA,GAA6B,IAAA;AACjC,IAAI,yBAAA,GAA4B,KAAA;AAMhC,eAAsB,wBAAwB,GAAA,EAA8B;AAC1E,EAAA,MAAM,gBAAgB,GAAA,IAAO,UAAA;AAC7B,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAAA,2BAAA,EAAU,CAAE,IAAA,CAAK,EAAC,EAAG,oBAAoB,CAAA;AACzC,IAAA;AAAA,EACF;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,cAAc,QAAA,EAAS;AAC7B,IAAAA,2BAAA,EAAU,CAAE,IAAA,CAAK,EAAC,EAAG,uCAAuC,CAAA;AAC5D,IAAA,IAAI,kBAAkB,UAAA,EAAY;AAChC,MAAA,UAAA,GAAa,IAAA;AAAA,IACf;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAAA,2BAAA,EAAU,CAAE,KAAA;AAAA,MACV;AAAA,QACE,GAAA,EAAK,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ;AAAA,OACxC;AAAA,MACA;AAAA,KACF;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAEA,eAAsB,oBACpB,MAAA,EACkB;AAElB,EAAA,IAAI,UAAA,EAAY;AACd,IAAAA,2BAAA,EAAU,CAAE,IAAA;AAAA,MACV,EAAC;AAAA,MACD;AAAA,KACF;AACA,IAAA,MAAM,wBAAwB,UAAU,CAAA;AAAA,EAC1C;AAGA,EAAA,MAAM,WAAA,GAAc,gBAAA,CAAiB,MAAA,CAAO,OAAO,CAAA;AACnD,EAAA,MAAM,wBAAA,GAA2B,uBAAA;AAAA,IAC/B,MAAA,CAAO;AAAA,GACT;AAEA,EAAA,IAAI,QAAA;AAGJ,EAAA,MAAM,SAAA,GAAgC,CAACC,yBAAA,EAAiBC,sBAAY,CAAA;AACpE,EAAA,IAAI;AACF,IAAA,MAAM,YAAA,GAAe,MAAM,OAAO,sCAAsC,CAAA;AACxE,IAAA,SAAA,CAAU,IAAA;AAAA,MACR,YAAA,CAAa,cAAA;AAAA,MACb,YAAA,CAAa,cAAA;AAAA,MACb,YAAA,CAAa;AAAA,KACf;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,IAAI;AACF,IAAA,MAAM,YAAA,GAAe,MAAM,OAAO,sCAAsC,CAAA;AACxE,IAAA,SAAA,CAAU,IAAA,CAAK,aAAa,WAAW,CAAA;AAAA,EACzC,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,IAAI;AACF,IAAA,MAAM,kBAAA,GACJ,MAAM,OAAO,4CAA4C,CAAA;AAC3D,IAAA,SAAA,CAAU,IAAA,CAAK,mBAAmB,iBAAiB,CAAA;AAAA,EACrD,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,IAAI,OAAO,eAAA,EAAiB;AAC1B,IAAA,MAAM,gBAAA,GAAmB,MAAMC,yBAAA,CAAgB;AAAA,MAC7C;AAAA,KACD,CAAA;AAED,IAAA,QAAA,GAAW,gBAAA,CAAiB,KAAA;AAAA,MAC1BC,gCAAA,CAAuB;AAAA,QACrB,CAACC,4BAAiB,GAAG,MAAA,CAAO,WAAA;AAAA,QAC5B,CAACC,+BAAoB,GAAG,MAAA,CAAO,cAAA,IAAkB,OAAA;AAAA,QACjD,wBAAA,EAA0B,OAAO,qBAAA,IAAyB,aAAA;AAAA,QAC1D,GAAG;AAAA;AAAA,OACJ;AAAA,KACH;AAAA,EACF,CAAA,MAAO;AACL,IAAA,QAAA,GAAWF,gCAAA,CAAuB;AAAA,MAChC,CAACC,4BAAiB,GAAG,MAAA,CAAO,WAAA;AAAA,MAC5B,CAACC,+BAAoB,GAAG,MAAA,CAAO,cAAA,IAAkB,OAAA;AAAA,MACjD,wBAAA,EAA0B,OAAO,qBAAA,IAAyB,aAAA;AAAA,MAC1D,GAAG;AAAA;AAAA,KACJ,CAAA;AAAA,EACH;AAKA,EAAA,IAAI,gBAAA,GAA0B,MAAA,CAAO,gBAAA,IAAoB,EAAC;AAC1D,EAAA,IAAI,MAAA,CAAO,6BAA6B,KAAA,EAAO;AAC7C,IAAA,MAAM,GAAA,GAAMC,gCAET,2CAA2C,CAAA;AAC9C,IAAA,gBAAA,GAAmB,CAAC,GAAA,CAAI,2BAAA,EAA6B,CAAA;AAAA,EACvD;AAEA,EAAA,MAAM,aAAA,GAAgB,IAAIC,uCAAA,CAAkB;AAAA,IAC1C,GAAA,EAAK,CAAA,EAAG,MAAA,CAAO,YAAA,IAAgB,uBAAuB,CAAA,UAAA,CAAA;AAAA,IACtD,OAAA,EAAS;AAAA,GACV,CAAA;AAGD,EAAA,MAAM,gBAAgB,IAAIC,2CAAA;AAAA,IACxB,IAAIC,gCAAmB,aAAa;AAAA,GACtC;AAEA,EAAA,MAAM,GAAA,GAAM,IAAIC,eAAA,CAAQ;AAAA,IACtB,QAAA;AAAA,IACA,aAAA;AAAA;AAAA,IACA,YAAA,EAAc,IAAIC,wCAAA,CAA8B;AAAA,MAC9C,QAAA,EAAU,IAAIC,0CAAA,CAAmB;AAAA,QAC/B,GAAA,EAAK,CAAA,EAAG,MAAA,CAAO,YAAA,IAAgB,uBAAuB,CAAA,WAAA,CAAA;AAAA,QACtD,OAAA,EAAS;AAAA,OACV;AAAA,KACF,CAAA;AAAA,IACD,mBAAA,EAAqB;AAAA,MACnB,IAAIC,+BAAA;AAAA,QACF,IAAIC,oCAAA,CAAgB;AAAA,UAClB,GAAA,EAAK,CAAA,EAAG,MAAA,CAAO,YAAA,IAAgB,uBAAuB,CAAA,QAAA,CAAA;AAAA,UACtD,OAAA,EAAS;AAAA,SACV;AAAA;AACH,KACF;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,IAAI;AACF,IAAA,MAAM,IAAI,KAAA,EAAM;AAChB,IAAAf,2BAAA,EAAU,CAAE,IAAA,CAAK,EAAC,EAAG,oDAAoD,CAAA;AAAA,EAC3E,SAAS,KAAA,EAAO;AACd,IAAAA,2BAAA,EAAU,CAAE,KAAA;AAAA,MACV;AAAA,QACE,GAAA,EAAK,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ;AAAA,OACxC;AAAA,MACA;AAAA,KACF;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AAGA,EAAA,UAAA,GAAa,GAAA;AAEb,EAAA,IAAI,CAAC,yBAAA,EAA2B;AAC9B,IAAA,yBAAA,GAA4B,IAAA;AAE5B,IAAA,MAAM,kBAAkB,MAAM;AAC5B,MAAA,uBAAA,EAAwB,CACrB,KAAK,MAAM;AAEV,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,KAAA,KAAU;AAChB,QAAAA,2BAAA,EAAU,CAAE,KAAA;AAAA,UACV;AAAA,YACE,GAAA,EAAK,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ;AAAA,WACxC;AAAA,UACA;AAAA,SACF;AAEA,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB,CAAC,CAAA;AAAA,IACL,CAAA;AAEA,IAAA,OAAA,CAAQ,EAAA,CAAG,WAAW,eAAe,CAAA;AACrC,IAAA,OAAA,CAAQ,EAAA,CAAG,UAAU,eAAe,CAAA;AAAA,EACtC;AAEA,EAAA,OAAO,GAAA;AACT","file":"instrumentation.cjs","sourcesContent":["import { NodeSDK } from '@opentelemetry/sdk-node';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';\nimport { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http';\nimport { BatchLogRecordProcessor } from '@opentelemetry/sdk-logs';\nimport { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport { TailSamplingSpanProcessor } from './tail-sampling-processor';\nimport { getLogger } from './init';\nimport {\n resourceFromAttributes,\n detectResources,\n processDetector,\n hostDetector,\n type Resource,\n type ResourceDetector,\n} from '@opentelemetry/resources';\nimport {\n ATTR_SERVICE_NAME,\n ATTR_SERVICE_VERSION,\n} from '@opentelemetry/semantic-conventions/incubating';\nimport { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http';\nimport { PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics';\nimport { requireModule } from './node-require';\n\n/**\n * Parse OTLP headers string into object format\n * @param headersString - Headers as \"key1=value1,key2=value2\" or \"Authorization=Basic ...\"\n * @returns Headers object for OTLP exporters\n */\nfunction parseOtlpHeaders(headersString?: string): Record<string, string> {\n if (!headersString) return {};\n\n const headers: Record<string, string> = {};\n const pairs = headersString.split(',');\n\n for (const pair of pairs) {\n const [key, ...valueParts] = pair.split('=');\n if (key && valueParts.length > 0) {\n headers[key.trim()] = valueParts.join('=').trim();\n }\n }\n\n return headers;\n}\n\n/**\n * Parse resource attributes string into object format\n * @param attributesString - Attributes as \"key1=value1,key2=value2\"\n * @returns Resource attributes object\n */\nfunction parseResourceAttributes(\n attributesString?: string,\n): Record<string, string> {\n if (!attributesString) return {};\n\n const attributes: Record<string, string> = {};\n const pairs = attributesString.split(',');\n\n for (const pair of pairs) {\n const [key, ...valueParts] = pair.split('=');\n if (key && valueParts.length > 0) {\n attributes[key.trim()] = valueParts.join('=').trim();\n }\n }\n\n return attributes;\n}\n\nexport interface InstrumentationConfig {\n serviceName: string;\n serviceVersion?: string;\n deploymentEnvironment?: string;\n otlpEndpoint?: string;\n /** Headers for authentication (e.g., Grafana Cloud, Honeycomb) */\n headers?: string;\n /** Resource attributes as comma-separated key=value pairs */\n resourceAttributes?: string;\n /** Enable async resource detection for process/host info (default: false) */\n detectResources?: boolean;\n /**\n * Use selective instrumentation instead of full auto-instrumentation\n * **Default: true** (performance-first)\n *\n * When true, auto-instrumentation is disabled. You can manually add\n * specific instrumentations via the `instrumentations` field.\n * This reduces overhead from ~81% to near-zero based on Platformatic benchmarks.\n *\n * Set to false to enable full auto-instrumentation (not recommended for production).\n *\n * @see https://blogger.platformatic.dev/the-hidden-cost-of-context\n */\n selectiveInstrumentation?: boolean;\n\n /**\n * Custom instrumentations to use (only when selectiveInstrumentation is true)\n * @example\n * ```typescript\n * import { HttpInstrumentation } from '@opentelemetry/instrumentation-http'\n *\n * initInstrumentation({\n * serviceName: 'api',\n * selectiveInstrumentation: true,\n * instrumentations: [new HttpInstrumentation()]\n * })\n * ```\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n instrumentations?: any[];\n}\n\n/**\n * Initialize OpenTelemetry instrumentation with OTLP exporters\n *\n * This sets up:\n * - Traces (OTLP HTTP)\n * - Metrics (OTLP HTTP)\n * - Logs (OTLP HTTP)\n * - Auto-instrumentation for common Node.js libraries\n *\n * @example\n * // Call this at the very start of your application\n * import { initInstrumentation } from '@your-org/otel-decorators'\n *\n * initInstrumentation({\n * serviceName: 'my-service' }\n * serviceVersion: '1.0.0',\n * deploymentEnvironment: 'production',\n * otlpEndpoint: 'http://localhost:4318'\n * })\n *\n * // Or with async resource detection (top-level await required)\n * await initInstrumentation({\n * serviceName: 'my-service' }\n * detectResources: true\n * })\n */\n// Enables graceful shutdown and prevents SDK leaks on hot-reload\nlet currentSDK: NodeSDK | null = null;\nlet shutdownHandlerRegistered = false;\n\n/**\n * Shutdown the OpenTelemetry SDK gracefully\n * Call this before process exit or during hot-reloads\n */\nexport async function shutdownInstrumentation(sdk?: NodeSDK): Promise<void> {\n const sdkToShutdown = sdk || currentSDK;\n if (!sdkToShutdown) {\n getLogger().warn({}, 'No SDK to shutdown');\n return;\n }\n\n try {\n await sdkToShutdown.shutdown();\n getLogger().info({}, 'OpenTelemetry terminated successfully');\n if (sdkToShutdown === currentSDK) {\n currentSDK = null;\n }\n } catch (error) {\n getLogger().error(\n {\n err: error instanceof Error ? error : undefined,\n },\n 'Error terminating OpenTelemetry',\n );\n throw error;\n }\n}\n\nexport async function initInstrumentation(\n config: InstrumentationConfig,\n): Promise<NodeSDK> {\n // Prevents resource leaks on hot-reload or multiple init calls\n if (currentSDK) {\n getLogger().info(\n {},\n 'Shutting down existing OpenTelemetry SDK before reinitializing...',\n );\n await shutdownInstrumentation(currentSDK);\n }\n\n // Parse headers and resource attributes\n const otlpHeaders = parseOtlpHeaders(config.headers);\n const customResourceAttributes = parseResourceAttributes(\n config.resourceAttributes,\n );\n\n let resource: Resource;\n\n // Dynamically load optional resource detectors\n const detectors: ResourceDetector[] = [processDetector, hostDetector];\n try {\n const awsDetectors = await import('@opentelemetry/resource-detector-aws');\n detectors.push(\n awsDetectors.awsEc2Detector,\n awsDetectors.awsEcsDetector,\n awsDetectors.awsEksDetector,\n );\n } catch {\n // ignore\n }\n try {\n const gcpDetectors = await import('@opentelemetry/resource-detector-gcp');\n detectors.push(gcpDetectors.gcpDetector);\n } catch {\n // ignore\n }\n try {\n const containerDetectors =\n await import('@opentelemetry/resource-detector-container');\n detectors.push(containerDetectors.containerDetector);\n } catch {\n // ignore\n }\n\n if (config.detectResources) {\n const detectedResource = await detectResources({\n detectors,\n });\n\n resource = detectedResource.merge(\n resourceFromAttributes({\n [ATTR_SERVICE_NAME]: config.serviceName,\n [ATTR_SERVICE_VERSION]: config.serviceVersion || '1.0.0',\n 'deployment.environment': config.deploymentEnvironment || 'development',\n ...customResourceAttributes, // Merge custom resource attributes\n }),\n );\n } else {\n resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: config.serviceName,\n [ATTR_SERVICE_VERSION]: config.serviceVersion || '1.0.0',\n 'deployment.environment': config.deploymentEnvironment || 'development',\n ...customResourceAttributes, // Merge custom resource attributes\n });\n }\n\n // Default to selective (near-zero overhead) vs full auto (~81% overhead)\n // Lazy-load to avoid importing ~40+ packages at module evaluation time\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let instrumentations: any[] = config.instrumentations || [];\n if (config.selectiveInstrumentation === false) {\n const mod = requireModule<{\n getNodeAutoInstrumentations: () => unknown[];\n }>('@opentelemetry/auto-instrumentations-node');\n instrumentations = [mod.getNodeAutoInstrumentations()];\n }\n\n const traceExporter = new OTLPTraceExporter({\n url: `${config.otlpEndpoint || 'http://localhost:4318'}/v1/traces`,\n headers: otlpHeaders,\n });\n\n // Enables tail sampling via sampling.tail.keep attribute\n const spanProcessor = new TailSamplingSpanProcessor(\n new BatchSpanProcessor(traceExporter),\n );\n\n const sdk = new NodeSDK({\n resource,\n spanProcessor, // Use our wrapped processor instead of traceExporter directly\n metricReader: new PeriodicExportingMetricReader({\n exporter: new OTLPMetricExporter({\n url: `${config.otlpEndpoint || 'http://localhost:4318'}/v1/metrics`,\n headers: otlpHeaders,\n }),\n }),\n logRecordProcessors: [\n new BatchLogRecordProcessor(\n new OTLPLogExporter({\n url: `${config.otlpEndpoint || 'http://localhost:4318'}/v1/logs`,\n headers: otlpHeaders,\n }),\n ),\n ],\n instrumentations,\n });\n\n try {\n await sdk.start();\n getLogger().info({}, 'OpenTelemetry instrumentation started successfully');\n } catch (error) {\n getLogger().error(\n {\n err: error instanceof Error ? error : undefined,\n },\n 'Failed to start OpenTelemetry SDK',\n );\n throw error;\n }\n\n // Track current SDK for shutdown handler\n currentSDK = sdk;\n\n if (!shutdownHandlerRegistered) {\n shutdownHandlerRegistered = true;\n\n const shutdownHandler = () => {\n shutdownInstrumentation()\n .then(() => {\n // eslint-disable-next-line unicorn/no-process-exit\n process.exit(0);\n })\n .catch((error) => {\n getLogger().error(\n {\n err: error instanceof Error ? error : undefined,\n },\n 'Shutdown error',\n );\n // eslint-disable-next-line unicorn/no-process-exit\n process.exit(1);\n });\n };\n\n process.on('SIGTERM', shutdownHandler);\n process.on('SIGINT', shutdownHandler);\n }\n\n return sdk;\n}\n"]}
1
+ {"version":3,"sources":["../src/instrumentation.ts"],"names":["getLogger","processDetector","hostDetector","detectResources","resourceFromAttributes","ATTR_SERVICE_NAME","ATTR_SERVICE_VERSION","requireModule","OTLPTraceExporter","TailSamplingSpanProcessor","BatchSpanProcessor","NodeSDK","PeriodicExportingMetricReader","OTLPMetricExporter","BatchLogRecordProcessor","OTLPLogExporter"],"mappings":"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","file":"instrumentation.cjs","sourcesContent":["import { NodeSDK } from '@opentelemetry/sdk-node';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';\nimport { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http';\nimport { BatchLogRecordProcessor } from '@opentelemetry/sdk-logs';\nimport { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport { TailSamplingSpanProcessor } from './tail-sampling-processor';\nimport { getLogger } from './init';\nimport {\n resourceFromAttributes,\n detectResources,\n processDetector,\n hostDetector,\n type Resource,\n type ResourceDetector,\n} from '@opentelemetry/resources';\nimport {\n ATTR_SERVICE_NAME,\n ATTR_SERVICE_VERSION,\n} from '@opentelemetry/semantic-conventions/incubating';\nimport { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http';\nimport { PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics';\nimport { requireModule } from './node-require';\n\n/**\n * Parse OTLP headers string into object format\n * @param headersString - Headers as \"key1=value1,key2=value2\" or \"Authorization=Basic ...\"\n * @returns Headers object for OTLP exporters\n */\nfunction parseOtlpHeaders(headersString?: string): Record<string, string> {\n if (!headersString) return {};\n\n const headers: Record<string, string> = {};\n const pairs = headersString.split(',');\n\n for (const pair of pairs) {\n const [key, ...valueParts] = pair.split('=');\n if (key && valueParts.length > 0) {\n headers[key.trim()] = valueParts.join('=').trim();\n }\n }\n\n return headers;\n}\n\n/**\n * Parse resource attributes string into object format\n * @param attributesString - Attributes as \"key1=value1,key2=value2\"\n * @returns Resource attributes object\n */\nfunction parseResourceAttributes(\n attributesString?: string,\n): Record<string, string> {\n if (!attributesString) return {};\n\n const attributes: Record<string, string> = {};\n const pairs = attributesString.split(',');\n\n for (const pair of pairs) {\n const [key, ...valueParts] = pair.split('=');\n if (key && valueParts.length > 0) {\n attributes[key.trim()] = valueParts.join('=').trim();\n }\n }\n\n return attributes;\n}\n\nexport interface InstrumentationConfig {\n serviceName: string;\n serviceVersion?: string;\n deploymentEnvironment?: string;\n otlpEndpoint?: string;\n /** Headers for authentication (e.g., Grafana Cloud, Honeycomb) */\n headers?: string;\n /** Resource attributes as comma-separated key=value pairs */\n resourceAttributes?: string;\n /** Enable async resource detection for process/host info (default: false) */\n detectResources?: boolean;\n /**\n * Use selective instrumentation instead of full auto-instrumentation\n * **Default: true** (performance-first)\n *\n * When true, auto-instrumentation is disabled. You can manually add\n * specific instrumentations via the `instrumentations` field.\n * This reduces overhead from ~81% to near-zero based on Platformatic benchmarks.\n *\n * Set to false to enable full auto-instrumentation (not recommended for production).\n *\n * @see https://blogger.platformatic.dev/the-hidden-cost-of-context\n */\n selectiveInstrumentation?: boolean;\n\n /**\n * Custom instrumentations to use (only when selectiveInstrumentation is true)\n * @example\n * ```typescript\n * import { HttpInstrumentation } from '@opentelemetry/instrumentation-http'\n *\n * initInstrumentation({\n * serviceName: 'api',\n * selectiveInstrumentation: true,\n * instrumentations: [new HttpInstrumentation()]\n * })\n * ```\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n instrumentations?: any[];\n}\n\n/**\n * Initialize OpenTelemetry instrumentation with OTLP exporters\n *\n * This sets up:\n * - Traces (OTLP HTTP)\n * - Metrics (OTLP HTTP)\n * - Logs (OTLP HTTP)\n * - Auto-instrumentation for common Node.js libraries\n *\n * @example\n * // Call this at the very start of your application\n * import { initInstrumentation } from '@your-org/otel-decorators'\n *\n * initInstrumentation({\n * serviceName: 'my-service' }\n * serviceVersion: '1.0.0',\n * deploymentEnvironment: 'production',\n * otlpEndpoint: 'http://localhost:4318'\n * })\n *\n * // Or with async resource detection (top-level await required)\n * await initInstrumentation({\n * serviceName: 'my-service' }\n * detectResources: true\n * })\n */\n// Enables graceful shutdown and prevents SDK leaks on hot-reload\nlet currentSDK: NodeSDK | null = null;\nlet shutdownHandlerRegistered = false;\n\n/**\n * Shutdown the OpenTelemetry SDK gracefully\n * Call this before process exit or during hot-reloads\n */\nexport async function shutdownInstrumentation(sdk?: NodeSDK): Promise<void> {\n const sdkToShutdown = sdk || currentSDK;\n if (!sdkToShutdown) {\n getLogger().warn({}, 'No SDK to shutdown');\n return;\n }\n\n try {\n await sdkToShutdown.shutdown();\n getLogger().info({}, 'OpenTelemetry terminated successfully');\n if (sdkToShutdown === currentSDK) {\n currentSDK = null;\n }\n } catch (error) {\n getLogger().error(\n {\n err: error instanceof Error ? error : undefined,\n },\n 'Error terminating OpenTelemetry',\n );\n throw error;\n }\n}\n\nexport async function initInstrumentation(\n config: InstrumentationConfig,\n): Promise<NodeSDK> {\n // Prevents resource leaks on hot-reload or multiple init calls\n if (currentSDK) {\n getLogger().info(\n {},\n 'Shutting down existing OpenTelemetry SDK before reinitializing...',\n );\n await shutdownInstrumentation(currentSDK);\n }\n\n // Parse headers and resource attributes\n const otlpHeaders = parseOtlpHeaders(config.headers);\n const customResourceAttributes = parseResourceAttributes(\n config.resourceAttributes,\n );\n\n let resource: Resource;\n\n // Dynamically load optional resource detectors\n const detectors: ResourceDetector[] = [processDetector, hostDetector];\n try {\n const awsDetectors = await import('@opentelemetry/resource-detector-aws');\n detectors.push(\n awsDetectors.awsEc2Detector,\n awsDetectors.awsEcsDetector,\n awsDetectors.awsEksDetector,\n );\n } catch {\n // ignore\n }\n try {\n const gcpDetectors = await import('@opentelemetry/resource-detector-gcp');\n detectors.push(gcpDetectors.gcpDetector);\n } catch {\n // ignore\n }\n try {\n const containerDetectors =\n await import('@opentelemetry/resource-detector-container');\n detectors.push(containerDetectors.containerDetector);\n } catch {\n // ignore\n }\n\n if (config.detectResources) {\n const detectedResource = await detectResources({\n detectors,\n });\n\n resource = detectedResource.merge(\n resourceFromAttributes({\n [ATTR_SERVICE_NAME]: config.serviceName,\n [ATTR_SERVICE_VERSION]: config.serviceVersion || '1.0.0',\n 'deployment.environment': config.deploymentEnvironment || 'development',\n ...customResourceAttributes, // Merge custom resource attributes\n }),\n );\n } else {\n resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: config.serviceName,\n [ATTR_SERVICE_VERSION]: config.serviceVersion || '1.0.0',\n 'deployment.environment': config.deploymentEnvironment || 'development',\n ...customResourceAttributes, // Merge custom resource attributes\n });\n }\n\n // Default to selective (near-zero overhead) vs full auto (~81% overhead)\n // Lazy-load to avoid importing ~40+ packages at module evaluation time\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let instrumentations: any[] = config.instrumentations || [];\n if (config.selectiveInstrumentation === false) {\n const mod = requireModule<{\n getNodeAutoInstrumentations: () => unknown[];\n }>('@opentelemetry/auto-instrumentations-node');\n instrumentations = [mod.getNodeAutoInstrumentations()];\n }\n\n const traceExporter = new OTLPTraceExporter({\n url: `${config.otlpEndpoint || 'http://localhost:4318'}/v1/traces`,\n headers: otlpHeaders,\n });\n\n // Enables tail sampling via autotel.sampling.tail.keep attribute\n const spanProcessor = new TailSamplingSpanProcessor(\n new BatchSpanProcessor(traceExporter),\n );\n\n const sdk = new NodeSDK({\n resource,\n spanProcessor, // Use our wrapped processor instead of traceExporter directly\n metricReader: new PeriodicExportingMetricReader({\n exporter: new OTLPMetricExporter({\n url: `${config.otlpEndpoint || 'http://localhost:4318'}/v1/metrics`,\n headers: otlpHeaders,\n }),\n }),\n logRecordProcessors: [\n new BatchLogRecordProcessor(\n new OTLPLogExporter({\n url: `${config.otlpEndpoint || 'http://localhost:4318'}/v1/logs`,\n headers: otlpHeaders,\n }),\n ),\n ],\n instrumentations,\n });\n\n try {\n await sdk.start();\n getLogger().info({}, 'OpenTelemetry instrumentation started successfully');\n } catch (error) {\n getLogger().error(\n {\n err: error instanceof Error ? error : undefined,\n },\n 'Failed to start OpenTelemetry SDK',\n );\n throw error;\n }\n\n // Track current SDK for shutdown handler\n currentSDK = sdk;\n\n if (!shutdownHandlerRegistered) {\n shutdownHandlerRegistered = true;\n\n const shutdownHandler = () => {\n shutdownInstrumentation()\n .then(() => {\n // eslint-disable-next-line unicorn/no-process-exit\n process.exit(0);\n })\n .catch((error) => {\n getLogger().error(\n {\n err: error instanceof Error ? error : undefined,\n },\n 'Shutdown error',\n );\n // eslint-disable-next-line unicorn/no-process-exit\n process.exit(1);\n });\n };\n\n process.on('SIGTERM', shutdownHandler);\n process.on('SIGINT', shutdownHandler);\n }\n\n return sdk;\n}\n"]}
@@ -1,13 +1,13 @@
1
- import { getLogger } from './chunk-VXLEJWLY.js';
2
- import './chunk-YTGF4L2C.js';
3
- import { TailSamplingSpanProcessor } from './chunk-X4RMFFMR.js';
1
+ import { getLogger } from './chunk-MNBAXRVG.js';
2
+ import './chunk-RUD7KS4R.js';
3
+ import { TailSamplingSpanProcessor } from './chunk-XDKK53OL.js';
4
4
  import './chunk-WGWSHJ2N.js';
5
5
  import './chunk-GYR5K654.js';
6
6
  import './chunk-SNINLBEE.js';
7
7
  import './chunk-6UQRVUN3.js';
8
8
  import './chunk-3QXBFGKP.js';
9
9
  import { requireModule } from './chunk-33WTKH7X.js';
10
- import './chunk-XND7WBVX.js';
10
+ import './chunk-VYA6QDNA.js';
11
11
  import './chunk-B33XPEKY.js';
12
12
  import './chunk-J5QENANM.js';
13
13
  import './chunk-HA2WBOGQ.js';
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/instrumentation.ts"],"names":[],"mappings":"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","file":"instrumentation.js","sourcesContent":["import { NodeSDK } from '@opentelemetry/sdk-node';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';\nimport { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http';\nimport { BatchLogRecordProcessor } from '@opentelemetry/sdk-logs';\nimport { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport { TailSamplingSpanProcessor } from './tail-sampling-processor';\nimport { getLogger } from './init';\nimport {\n resourceFromAttributes,\n detectResources,\n processDetector,\n hostDetector,\n type Resource,\n type ResourceDetector,\n} from '@opentelemetry/resources';\nimport {\n ATTR_SERVICE_NAME,\n ATTR_SERVICE_VERSION,\n} from '@opentelemetry/semantic-conventions/incubating';\nimport { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http';\nimport { PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics';\nimport { requireModule } from './node-require';\n\n/**\n * Parse OTLP headers string into object format\n * @param headersString - Headers as \"key1=value1,key2=value2\" or \"Authorization=Basic ...\"\n * @returns Headers object for OTLP exporters\n */\nfunction parseOtlpHeaders(headersString?: string): Record<string, string> {\n if (!headersString) return {};\n\n const headers: Record<string, string> = {};\n const pairs = headersString.split(',');\n\n for (const pair of pairs) {\n const [key, ...valueParts] = pair.split('=');\n if (key && valueParts.length > 0) {\n headers[key.trim()] = valueParts.join('=').trim();\n }\n }\n\n return headers;\n}\n\n/**\n * Parse resource attributes string into object format\n * @param attributesString - Attributes as \"key1=value1,key2=value2\"\n * @returns Resource attributes object\n */\nfunction parseResourceAttributes(\n attributesString?: string,\n): Record<string, string> {\n if (!attributesString) return {};\n\n const attributes: Record<string, string> = {};\n const pairs = attributesString.split(',');\n\n for (const pair of pairs) {\n const [key, ...valueParts] = pair.split('=');\n if (key && valueParts.length > 0) {\n attributes[key.trim()] = valueParts.join('=').trim();\n }\n }\n\n return attributes;\n}\n\nexport interface InstrumentationConfig {\n serviceName: string;\n serviceVersion?: string;\n deploymentEnvironment?: string;\n otlpEndpoint?: string;\n /** Headers for authentication (e.g., Grafana Cloud, Honeycomb) */\n headers?: string;\n /** Resource attributes as comma-separated key=value pairs */\n resourceAttributes?: string;\n /** Enable async resource detection for process/host info (default: false) */\n detectResources?: boolean;\n /**\n * Use selective instrumentation instead of full auto-instrumentation\n * **Default: true** (performance-first)\n *\n * When true, auto-instrumentation is disabled. You can manually add\n * specific instrumentations via the `instrumentations` field.\n * This reduces overhead from ~81% to near-zero based on Platformatic benchmarks.\n *\n * Set to false to enable full auto-instrumentation (not recommended for production).\n *\n * @see https://blogger.platformatic.dev/the-hidden-cost-of-context\n */\n selectiveInstrumentation?: boolean;\n\n /**\n * Custom instrumentations to use (only when selectiveInstrumentation is true)\n * @example\n * ```typescript\n * import { HttpInstrumentation } from '@opentelemetry/instrumentation-http'\n *\n * initInstrumentation({\n * serviceName: 'api',\n * selectiveInstrumentation: true,\n * instrumentations: [new HttpInstrumentation()]\n * })\n * ```\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n instrumentations?: any[];\n}\n\n/**\n * Initialize OpenTelemetry instrumentation with OTLP exporters\n *\n * This sets up:\n * - Traces (OTLP HTTP)\n * - Metrics (OTLP HTTP)\n * - Logs (OTLP HTTP)\n * - Auto-instrumentation for common Node.js libraries\n *\n * @example\n * // Call this at the very start of your application\n * import { initInstrumentation } from '@your-org/otel-decorators'\n *\n * initInstrumentation({\n * serviceName: 'my-service' }\n * serviceVersion: '1.0.0',\n * deploymentEnvironment: 'production',\n * otlpEndpoint: 'http://localhost:4318'\n * })\n *\n * // Or with async resource detection (top-level await required)\n * await initInstrumentation({\n * serviceName: 'my-service' }\n * detectResources: true\n * })\n */\n// Enables graceful shutdown and prevents SDK leaks on hot-reload\nlet currentSDK: NodeSDK | null = null;\nlet shutdownHandlerRegistered = false;\n\n/**\n * Shutdown the OpenTelemetry SDK gracefully\n * Call this before process exit or during hot-reloads\n */\nexport async function shutdownInstrumentation(sdk?: NodeSDK): Promise<void> {\n const sdkToShutdown = sdk || currentSDK;\n if (!sdkToShutdown) {\n getLogger().warn({}, 'No SDK to shutdown');\n return;\n }\n\n try {\n await sdkToShutdown.shutdown();\n getLogger().info({}, 'OpenTelemetry terminated successfully');\n if (sdkToShutdown === currentSDK) {\n currentSDK = null;\n }\n } catch (error) {\n getLogger().error(\n {\n err: error instanceof Error ? error : undefined,\n },\n 'Error terminating OpenTelemetry',\n );\n throw error;\n }\n}\n\nexport async function initInstrumentation(\n config: InstrumentationConfig,\n): Promise<NodeSDK> {\n // Prevents resource leaks on hot-reload or multiple init calls\n if (currentSDK) {\n getLogger().info(\n {},\n 'Shutting down existing OpenTelemetry SDK before reinitializing...',\n );\n await shutdownInstrumentation(currentSDK);\n }\n\n // Parse headers and resource attributes\n const otlpHeaders = parseOtlpHeaders(config.headers);\n const customResourceAttributes = parseResourceAttributes(\n config.resourceAttributes,\n );\n\n let resource: Resource;\n\n // Dynamically load optional resource detectors\n const detectors: ResourceDetector[] = [processDetector, hostDetector];\n try {\n const awsDetectors = await import('@opentelemetry/resource-detector-aws');\n detectors.push(\n awsDetectors.awsEc2Detector,\n awsDetectors.awsEcsDetector,\n awsDetectors.awsEksDetector,\n );\n } catch {\n // ignore\n }\n try {\n const gcpDetectors = await import('@opentelemetry/resource-detector-gcp');\n detectors.push(gcpDetectors.gcpDetector);\n } catch {\n // ignore\n }\n try {\n const containerDetectors =\n await import('@opentelemetry/resource-detector-container');\n detectors.push(containerDetectors.containerDetector);\n } catch {\n // ignore\n }\n\n if (config.detectResources) {\n const detectedResource = await detectResources({\n detectors,\n });\n\n resource = detectedResource.merge(\n resourceFromAttributes({\n [ATTR_SERVICE_NAME]: config.serviceName,\n [ATTR_SERVICE_VERSION]: config.serviceVersion || '1.0.0',\n 'deployment.environment': config.deploymentEnvironment || 'development',\n ...customResourceAttributes, // Merge custom resource attributes\n }),\n );\n } else {\n resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: config.serviceName,\n [ATTR_SERVICE_VERSION]: config.serviceVersion || '1.0.0',\n 'deployment.environment': config.deploymentEnvironment || 'development',\n ...customResourceAttributes, // Merge custom resource attributes\n });\n }\n\n // Default to selective (near-zero overhead) vs full auto (~81% overhead)\n // Lazy-load to avoid importing ~40+ packages at module evaluation time\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let instrumentations: any[] = config.instrumentations || [];\n if (config.selectiveInstrumentation === false) {\n const mod = requireModule<{\n getNodeAutoInstrumentations: () => unknown[];\n }>('@opentelemetry/auto-instrumentations-node');\n instrumentations = [mod.getNodeAutoInstrumentations()];\n }\n\n const traceExporter = new OTLPTraceExporter({\n url: `${config.otlpEndpoint || 'http://localhost:4318'}/v1/traces`,\n headers: otlpHeaders,\n });\n\n // Enables tail sampling via sampling.tail.keep attribute\n const spanProcessor = new TailSamplingSpanProcessor(\n new BatchSpanProcessor(traceExporter),\n );\n\n const sdk = new NodeSDK({\n resource,\n spanProcessor, // Use our wrapped processor instead of traceExporter directly\n metricReader: new PeriodicExportingMetricReader({\n exporter: new OTLPMetricExporter({\n url: `${config.otlpEndpoint || 'http://localhost:4318'}/v1/metrics`,\n headers: otlpHeaders,\n }),\n }),\n logRecordProcessors: [\n new BatchLogRecordProcessor(\n new OTLPLogExporter({\n url: `${config.otlpEndpoint || 'http://localhost:4318'}/v1/logs`,\n headers: otlpHeaders,\n }),\n ),\n ],\n instrumentations,\n });\n\n try {\n await sdk.start();\n getLogger().info({}, 'OpenTelemetry instrumentation started successfully');\n } catch (error) {\n getLogger().error(\n {\n err: error instanceof Error ? error : undefined,\n },\n 'Failed to start OpenTelemetry SDK',\n );\n throw error;\n }\n\n // Track current SDK for shutdown handler\n currentSDK = sdk;\n\n if (!shutdownHandlerRegistered) {\n shutdownHandlerRegistered = true;\n\n const shutdownHandler = () => {\n shutdownInstrumentation()\n .then(() => {\n // eslint-disable-next-line unicorn/no-process-exit\n process.exit(0);\n })\n .catch((error) => {\n getLogger().error(\n {\n err: error instanceof Error ? error : undefined,\n },\n 'Shutdown error',\n );\n // eslint-disable-next-line unicorn/no-process-exit\n process.exit(1);\n });\n };\n\n process.on('SIGTERM', shutdownHandler);\n process.on('SIGINT', shutdownHandler);\n }\n\n return sdk;\n}\n"]}
1
+ {"version":3,"sources":["../src/instrumentation.ts"],"names":[],"mappings":"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","file":"instrumentation.js","sourcesContent":["import { NodeSDK } from '@opentelemetry/sdk-node';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';\nimport { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http';\nimport { BatchLogRecordProcessor } from '@opentelemetry/sdk-logs';\nimport { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport { TailSamplingSpanProcessor } from './tail-sampling-processor';\nimport { getLogger } from './init';\nimport {\n resourceFromAttributes,\n detectResources,\n processDetector,\n hostDetector,\n type Resource,\n type ResourceDetector,\n} from '@opentelemetry/resources';\nimport {\n ATTR_SERVICE_NAME,\n ATTR_SERVICE_VERSION,\n} from '@opentelemetry/semantic-conventions/incubating';\nimport { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http';\nimport { PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics';\nimport { requireModule } from './node-require';\n\n/**\n * Parse OTLP headers string into object format\n * @param headersString - Headers as \"key1=value1,key2=value2\" or \"Authorization=Basic ...\"\n * @returns Headers object for OTLP exporters\n */\nfunction parseOtlpHeaders(headersString?: string): Record<string, string> {\n if (!headersString) return {};\n\n const headers: Record<string, string> = {};\n const pairs = headersString.split(',');\n\n for (const pair of pairs) {\n const [key, ...valueParts] = pair.split('=');\n if (key && valueParts.length > 0) {\n headers[key.trim()] = valueParts.join('=').trim();\n }\n }\n\n return headers;\n}\n\n/**\n * Parse resource attributes string into object format\n * @param attributesString - Attributes as \"key1=value1,key2=value2\"\n * @returns Resource attributes object\n */\nfunction parseResourceAttributes(\n attributesString?: string,\n): Record<string, string> {\n if (!attributesString) return {};\n\n const attributes: Record<string, string> = {};\n const pairs = attributesString.split(',');\n\n for (const pair of pairs) {\n const [key, ...valueParts] = pair.split('=');\n if (key && valueParts.length > 0) {\n attributes[key.trim()] = valueParts.join('=').trim();\n }\n }\n\n return attributes;\n}\n\nexport interface InstrumentationConfig {\n serviceName: string;\n serviceVersion?: string;\n deploymentEnvironment?: string;\n otlpEndpoint?: string;\n /** Headers for authentication (e.g., Grafana Cloud, Honeycomb) */\n headers?: string;\n /** Resource attributes as comma-separated key=value pairs */\n resourceAttributes?: string;\n /** Enable async resource detection for process/host info (default: false) */\n detectResources?: boolean;\n /**\n * Use selective instrumentation instead of full auto-instrumentation\n * **Default: true** (performance-first)\n *\n * When true, auto-instrumentation is disabled. You can manually add\n * specific instrumentations via the `instrumentations` field.\n * This reduces overhead from ~81% to near-zero based on Platformatic benchmarks.\n *\n * Set to false to enable full auto-instrumentation (not recommended for production).\n *\n * @see https://blogger.platformatic.dev/the-hidden-cost-of-context\n */\n selectiveInstrumentation?: boolean;\n\n /**\n * Custom instrumentations to use (only when selectiveInstrumentation is true)\n * @example\n * ```typescript\n * import { HttpInstrumentation } from '@opentelemetry/instrumentation-http'\n *\n * initInstrumentation({\n * serviceName: 'api',\n * selectiveInstrumentation: true,\n * instrumentations: [new HttpInstrumentation()]\n * })\n * ```\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n instrumentations?: any[];\n}\n\n/**\n * Initialize OpenTelemetry instrumentation with OTLP exporters\n *\n * This sets up:\n * - Traces (OTLP HTTP)\n * - Metrics (OTLP HTTP)\n * - Logs (OTLP HTTP)\n * - Auto-instrumentation for common Node.js libraries\n *\n * @example\n * // Call this at the very start of your application\n * import { initInstrumentation } from '@your-org/otel-decorators'\n *\n * initInstrumentation({\n * serviceName: 'my-service' }\n * serviceVersion: '1.0.0',\n * deploymentEnvironment: 'production',\n * otlpEndpoint: 'http://localhost:4318'\n * })\n *\n * // Or with async resource detection (top-level await required)\n * await initInstrumentation({\n * serviceName: 'my-service' }\n * detectResources: true\n * })\n */\n// Enables graceful shutdown and prevents SDK leaks on hot-reload\nlet currentSDK: NodeSDK | null = null;\nlet shutdownHandlerRegistered = false;\n\n/**\n * Shutdown the OpenTelemetry SDK gracefully\n * Call this before process exit or during hot-reloads\n */\nexport async function shutdownInstrumentation(sdk?: NodeSDK): Promise<void> {\n const sdkToShutdown = sdk || currentSDK;\n if (!sdkToShutdown) {\n getLogger().warn({}, 'No SDK to shutdown');\n return;\n }\n\n try {\n await sdkToShutdown.shutdown();\n getLogger().info({}, 'OpenTelemetry terminated successfully');\n if (sdkToShutdown === currentSDK) {\n currentSDK = null;\n }\n } catch (error) {\n getLogger().error(\n {\n err: error instanceof Error ? error : undefined,\n },\n 'Error terminating OpenTelemetry',\n );\n throw error;\n }\n}\n\nexport async function initInstrumentation(\n config: InstrumentationConfig,\n): Promise<NodeSDK> {\n // Prevents resource leaks on hot-reload or multiple init calls\n if (currentSDK) {\n getLogger().info(\n {},\n 'Shutting down existing OpenTelemetry SDK before reinitializing...',\n );\n await shutdownInstrumentation(currentSDK);\n }\n\n // Parse headers and resource attributes\n const otlpHeaders = parseOtlpHeaders(config.headers);\n const customResourceAttributes = parseResourceAttributes(\n config.resourceAttributes,\n );\n\n let resource: Resource;\n\n // Dynamically load optional resource detectors\n const detectors: ResourceDetector[] = [processDetector, hostDetector];\n try {\n const awsDetectors = await import('@opentelemetry/resource-detector-aws');\n detectors.push(\n awsDetectors.awsEc2Detector,\n awsDetectors.awsEcsDetector,\n awsDetectors.awsEksDetector,\n );\n } catch {\n // ignore\n }\n try {\n const gcpDetectors = await import('@opentelemetry/resource-detector-gcp');\n detectors.push(gcpDetectors.gcpDetector);\n } catch {\n // ignore\n }\n try {\n const containerDetectors =\n await import('@opentelemetry/resource-detector-container');\n detectors.push(containerDetectors.containerDetector);\n } catch {\n // ignore\n }\n\n if (config.detectResources) {\n const detectedResource = await detectResources({\n detectors,\n });\n\n resource = detectedResource.merge(\n resourceFromAttributes({\n [ATTR_SERVICE_NAME]: config.serviceName,\n [ATTR_SERVICE_VERSION]: config.serviceVersion || '1.0.0',\n 'deployment.environment': config.deploymentEnvironment || 'development',\n ...customResourceAttributes, // Merge custom resource attributes\n }),\n );\n } else {\n resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: config.serviceName,\n [ATTR_SERVICE_VERSION]: config.serviceVersion || '1.0.0',\n 'deployment.environment': config.deploymentEnvironment || 'development',\n ...customResourceAttributes, // Merge custom resource attributes\n });\n }\n\n // Default to selective (near-zero overhead) vs full auto (~81% overhead)\n // Lazy-load to avoid importing ~40+ packages at module evaluation time\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let instrumentations: any[] = config.instrumentations || [];\n if (config.selectiveInstrumentation === false) {\n const mod = requireModule<{\n getNodeAutoInstrumentations: () => unknown[];\n }>('@opentelemetry/auto-instrumentations-node');\n instrumentations = [mod.getNodeAutoInstrumentations()];\n }\n\n const traceExporter = new OTLPTraceExporter({\n url: `${config.otlpEndpoint || 'http://localhost:4318'}/v1/traces`,\n headers: otlpHeaders,\n });\n\n // Enables tail sampling via autotel.sampling.tail.keep attribute\n const spanProcessor = new TailSamplingSpanProcessor(\n new BatchSpanProcessor(traceExporter),\n );\n\n const sdk = new NodeSDK({\n resource,\n spanProcessor, // Use our wrapped processor instead of traceExporter directly\n metricReader: new PeriodicExportingMetricReader({\n exporter: new OTLPMetricExporter({\n url: `${config.otlpEndpoint || 'http://localhost:4318'}/v1/metrics`,\n headers: otlpHeaders,\n }),\n }),\n logRecordProcessors: [\n new BatchLogRecordProcessor(\n new OTLPLogExporter({\n url: `${config.otlpEndpoint || 'http://localhost:4318'}/v1/logs`,\n headers: otlpHeaders,\n }),\n ),\n ],\n instrumentations,\n });\n\n try {\n await sdk.start();\n getLogger().info({}, 'OpenTelemetry instrumentation started successfully');\n } catch (error) {\n getLogger().error(\n {\n err: error instanceof Error ? error : undefined,\n },\n 'Failed to start OpenTelemetry SDK',\n );\n throw error;\n }\n\n // Track current SDK for shutdown handler\n currentSDK = sdk;\n\n if (!shutdownHandlerRegistered) {\n shutdownHandlerRegistered = true;\n\n const shutdownHandler = () => {\n shutdownInstrumentation()\n .then(() => {\n // eslint-disable-next-line unicorn/no-process-exit\n process.exit(0);\n })\n .catch((error) => {\n getLogger().error(\n {\n err: error instanceof Error ? error : undefined,\n },\n 'Shutdown error',\n );\n // eslint-disable-next-line unicorn/no-process-exit\n process.exit(1);\n });\n };\n\n process.on('SIGTERM', shutdownHandler);\n process.on('SIGINT', shutdownHandler);\n }\n\n return sdk;\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import { AttributeValue, SpanContext } from '@opentelemetry/api';
2
- import { ProducerContext, ConsumerContext } from './messaging.cjs';
2
+ import { ConsumerContext, ProducerContext } from './messaging.cjs';
3
3
  import './trace-context-t5X1AP-e.cjs';
4
4
 
5
5
  /**
@@ -1,5 +1,5 @@
1
1
  import { AttributeValue, SpanContext } from '@opentelemetry/api';
2
- import { ProducerContext, ConsumerContext } from './messaging.js';
2
+ import { ConsumerContext, ProducerContext } from './messaging.js';
3
3
  import './trace-context-t5X1AP-e.js';
4
4
 
5
5
  /**
@@ -1,21 +1,21 @@
1
1
  'use strict';
2
2
 
3
- var chunkL627YSSP_cjs = require('./chunk-L627YSSP.cjs');
4
- require('./chunk-RWOVNF3V.cjs');
3
+ var chunkWOWTZ4EB_cjs = require('./chunk-WOWTZ4EB.cjs');
4
+ require('./chunk-RMGSBMQF.cjs');
5
5
  require('./chunk-W4EUTSB2.cjs');
6
6
  require('./chunk-GML3FBOT.cjs');
7
7
  require('./chunk-D5LMF53P.cjs');
8
8
  require('./chunk-XRKAL7WJ.cjs');
9
- require('./chunk-JVICEM6W.cjs');
10
- require('./chunk-6YIDHH2S.cjs');
11
- require('./chunk-GVLK7YUU.cjs');
9
+ require('./chunk-ITYASFHQ.cjs');
10
+ require('./chunk-OFPZULMQ.cjs');
11
+ require('./chunk-KZEC4CHV.cjs');
12
12
  require('./chunk-ZNMBW67B.cjs');
13
13
  require('./chunk-IOYFAFHJ.cjs');
14
14
  require('./chunk-ELW34S4C.cjs');
15
15
  require('./chunk-CU6IDACR.cjs');
16
16
  require('./chunk-6S5RUKU3.cjs');
17
17
  require('./chunk-YS6C2YJE.cjs');
18
- require('./chunk-BGVKKL2N.cjs');
18
+ require('./chunk-7FIGORWI.cjs');
19
19
  require('./chunk-AZ24DJAG.cjs');
20
20
  require('./chunk-ESLWRGAG.cjs');
21
21
  require('./chunk-YREV3LGG.cjs');
@@ -25,15 +25,15 @@ require('./chunk-JEQ2X3Z6.cjs');
25
25
 
26
26
  Object.defineProperty(exports, "clearOrderingState", {
27
27
  enumerable: true,
28
- get: function () { return chunkL627YSSP_cjs.clearOrderingState; }
28
+ get: function () { return chunkWOWTZ4EB_cjs.clearOrderingState; }
29
29
  });
30
30
  Object.defineProperty(exports, "traceConsumer", {
31
31
  enumerable: true,
32
- get: function () { return chunkL627YSSP_cjs.traceConsumer; }
32
+ get: function () { return chunkWOWTZ4EB_cjs.traceConsumer; }
33
33
  });
34
34
  Object.defineProperty(exports, "traceProducer", {
35
35
  enumerable: true,
36
- get: function () { return chunkL627YSSP_cjs.traceProducer; }
36
+ get: function () { return chunkWOWTZ4EB_cjs.traceProducer; }
37
37
  });
38
38
  //# sourceMappingURL=messaging.cjs.map
39
39
  //# sourceMappingURL=messaging.cjs.map
@@ -1,4 +1,4 @@
1
- import { Attributes, AttributeValue, SpanContext, Link } from '@opentelemetry/api';
1
+ import { Attributes, SpanContext, Link, AttributeValue } from '@opentelemetry/api';
2
2
  import { T as TraceContext } from './trace-context-t5X1AP-e.cjs';
3
3
 
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { Attributes, AttributeValue, SpanContext, Link } from '@opentelemetry/api';
1
+ import { Attributes, SpanContext, Link, AttributeValue } from '@opentelemetry/api';
2
2
  import { T as TraceContext } from './trace-context-t5X1AP-e.js';
3
3
 
4
4
  /**
package/dist/messaging.js CHANGED
@@ -1,19 +1,19 @@
1
- export { clearOrderingState, traceConsumer, traceProducer } from './chunk-77PLEJ54.js';
2
- import './chunk-IKRHEUS7.js';
1
+ export { clearOrderingState, traceConsumer, traceProducer } from './chunk-PKXD2RMI.js';
2
+ import './chunk-JM63D22M.js';
3
3
  import './chunk-SR35DG5A.js';
4
4
  import './chunk-B3ZHLLMP.js';
5
5
  import './chunk-WD4RP6IV.js';
6
6
  import './chunk-USSL3D6L.js';
7
- import './chunk-VXLEJWLY.js';
8
- import './chunk-YTGF4L2C.js';
9
- import './chunk-X4RMFFMR.js';
7
+ import './chunk-MNBAXRVG.js';
8
+ import './chunk-RUD7KS4R.js';
9
+ import './chunk-XDKK53OL.js';
10
10
  import './chunk-WGWSHJ2N.js';
11
11
  import './chunk-GYR5K654.js';
12
12
  import './chunk-SNINLBEE.js';
13
13
  import './chunk-6UQRVUN3.js';
14
14
  import './chunk-3QXBFGKP.js';
15
15
  import './chunk-33WTKH7X.js';
16
- import './chunk-XND7WBVX.js';
16
+ import './chunk-VYA6QDNA.js';
17
17
  import './chunk-B33XPEKY.js';
18
18
  import './chunk-J5QENANM.js';
19
19
  import './chunk-HA2WBOGQ.js';
@@ -1,4 +1,4 @@
1
- import { Meter, Counter, Histogram, UpDownCounter, ObservableGauge } from '@opentelemetry/api';
1
+ import { Meter, Counter, Histogram, ObservableGauge, UpDownCounter } from '@opentelemetry/api';
2
2
 
3
3
  declare function getMeter(): Meter;
4
4
  type CounterOptions = Parameters<Meter['createCounter']>[1];
@@ -1,4 +1,4 @@
1
- import { Meter, Counter, Histogram, UpDownCounter, ObservableGauge } from '@opentelemetry/api';
1
+ import { Meter, Counter, Histogram, ObservableGauge, UpDownCounter } from '@opentelemetry/api';
2
2
 
3
3
  declare function getMeter(): Meter;
4
4
  type CounterOptions = Parameters<Meter['createCounter']>[1];
package/dist/sampling.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkBGVKKL2N_cjs = require('./chunk-BGVKKL2N.cjs');
3
+ var chunk7FIGORWI_cjs = require('./chunk-7FIGORWI.cjs');
4
4
  require('./chunk-AZ24DJAG.cjs');
5
5
  require('./chunk-ESLWRGAG.cjs');
6
6
  require('./chunk-YREV3LGG.cjs');
@@ -8,41 +8,57 @@ require('./chunk-JEQ2X3Z6.cjs');
8
8
 
9
9
 
10
10
 
11
+ Object.defineProperty(exports, "AUTOTEL_SAMPLING_TAIL_EVALUATED", {
12
+ enumerable: true,
13
+ get: function () { return chunk7FIGORWI_cjs.AUTOTEL_SAMPLING_TAIL_EVALUATED; }
14
+ });
15
+ Object.defineProperty(exports, "AUTOTEL_SAMPLING_TAIL_KEEP", {
16
+ enumerable: true,
17
+ get: function () { return chunk7FIGORWI_cjs.AUTOTEL_SAMPLING_TAIL_KEEP; }
18
+ });
11
19
  Object.defineProperty(exports, "AdaptiveSampler", {
12
20
  enumerable: true,
13
- get: function () { return chunkBGVKKL2N_cjs.AdaptiveSampler; }
21
+ get: function () { return chunk7FIGORWI_cjs.AdaptiveSampler; }
14
22
  });
15
23
  Object.defineProperty(exports, "AlwaysSampler", {
16
24
  enumerable: true,
17
- get: function () { return chunkBGVKKL2N_cjs.AlwaysSampler; }
25
+ get: function () { return chunk7FIGORWI_cjs.AlwaysSampler; }
18
26
  });
19
27
  Object.defineProperty(exports, "CompositeSampler", {
20
28
  enumerable: true,
21
- get: function () { return chunkBGVKKL2N_cjs.CompositeSampler; }
29
+ get: function () { return chunk7FIGORWI_cjs.CompositeSampler; }
22
30
  });
23
31
  Object.defineProperty(exports, "FeatureFlagSampler", {
24
32
  enumerable: true,
25
- get: function () { return chunkBGVKKL2N_cjs.FeatureFlagSampler; }
33
+ get: function () { return chunk7FIGORWI_cjs.FeatureFlagSampler; }
26
34
  });
27
35
  Object.defineProperty(exports, "NeverSampler", {
28
36
  enumerable: true,
29
- get: function () { return chunkBGVKKL2N_cjs.NeverSampler; }
37
+ get: function () { return chunk7FIGORWI_cjs.NeverSampler; }
30
38
  });
31
39
  Object.defineProperty(exports, "RandomSampler", {
32
40
  enumerable: true,
33
- get: function () { return chunkBGVKKL2N_cjs.RandomSampler; }
41
+ get: function () { return chunk7FIGORWI_cjs.RandomSampler; }
34
42
  });
35
43
  Object.defineProperty(exports, "UserIdSampler", {
36
44
  enumerable: true,
37
- get: function () { return chunkBGVKKL2N_cjs.UserIdSampler; }
45
+ get: function () { return chunk7FIGORWI_cjs.UserIdSampler; }
38
46
  });
39
47
  Object.defineProperty(exports, "createLinkFromHeaders", {
40
48
  enumerable: true,
41
- get: function () { return chunkBGVKKL2N_cjs.createLinkFromHeaders; }
49
+ get: function () { return chunk7FIGORWI_cjs.createLinkFromHeaders; }
42
50
  });
43
51
  Object.defineProperty(exports, "extractLinksFromBatch", {
44
52
  enumerable: true,
45
- get: function () { return chunkBGVKKL2N_cjs.extractLinksFromBatch; }
53
+ get: function () { return chunk7FIGORWI_cjs.extractLinksFromBatch; }
54
+ });
55
+ Object.defineProperty(exports, "resolveSamplingPreset", {
56
+ enumerable: true,
57
+ get: function () { return chunk7FIGORWI_cjs.resolveSamplingPreset; }
58
+ });
59
+ Object.defineProperty(exports, "samplingPresets", {
60
+ enumerable: true,
61
+ get: function () { return chunk7FIGORWI_cjs.samplingPresets; }
46
62
  });
47
63
  //# sourceMappingURL=sampling.cjs.map
48
64
  //# sourceMappingURL=sampling.cjs.map
@@ -26,6 +26,11 @@ import 'pino';
26
26
  * ```
27
27
  */
28
28
 
29
+ /**
30
+ * Tail sampling attribute keys (autotel-internal, not OTel semconv)
31
+ */
32
+ declare const AUTOTEL_SAMPLING_TAIL_KEEP = "autotel.sampling.tail.keep";
33
+ declare const AUTOTEL_SAMPLING_TAIL_EVALUATED = "autotel.sampling.tail.evaluated";
29
34
  /**
30
35
  * Sampler interface - return true to trace, false to skip
31
36
  */
@@ -275,6 +280,49 @@ declare class FeatureFlagSampler implements Sampler {
275
280
  */
276
281
  removeAlwaysSampleFlags(...flags: string[]): void;
277
282
  }
283
+ /**
284
+ * Named sampling presets for common environments.
285
+ * Use with `init({ sampling: 'production' })` or directly via factories.
286
+ */
287
+ type SamplingPreset = 'development' | 'errors-only' | 'production' | 'off';
288
+ /**
289
+ * Sampling preset factories.
290
+ *
291
+ * For most users, the string shorthand on `init()` is simpler:
292
+ * ```typescript
293
+ * init({ service: 'my-app', sampling: 'production' })
294
+ * ```
295
+ *
296
+ * Use factories when you need to customize:
297
+ * ```typescript
298
+ * init({ service: 'my-app', sampler: samplingPresets.production({ baselineSampleRate: 0.05 }) })
299
+ * ```
300
+ */
301
+ declare const samplingPresets: {
302
+ /** Capture everything — best for local development and debugging */
303
+ development: () => AlwaysSampler;
304
+ /** Only bad outcomes — zero baseline, errors always kept */
305
+ errorsOnly: () => AdaptiveSampler;
306
+ /**
307
+ * Balanced production defaults — 10% baseline + errors + slow traces.
308
+ * Pass overrides to tune (uses the same option names as AdaptiveSampler).
309
+ */
310
+ production: (overrides?: {
311
+ baselineSampleRate?: number;
312
+ slowThresholdMs?: number;
313
+ alwaysSampleErrors?: boolean;
314
+ alwaysSampleSlow?: boolean;
315
+ }) => AdaptiveSampler;
316
+ /** Disable sampling entirely */
317
+ off: () => NeverSampler;
318
+ };
319
+ /**
320
+ * Resolve a preset string to a Sampler instance.
321
+ * Used internally by `init()` when `sampling` string is provided.
322
+ *
323
+ * @throws Error if preset is not recognized
324
+ */
325
+ declare function resolveSamplingPreset(preset: SamplingPreset): Sampler;
278
326
  /**
279
327
  * Create a Link from W3C trace context headers (e.g., from a message queue).
280
328
  *
@@ -328,4 +376,4 @@ declare function extractLinksFromBatch(messages: Array<{
328
376
  [key: string]: unknown;
329
377
  }>, headersKey?: string): Link[];
330
378
 
331
- export { AdaptiveSampler, AlwaysSampler, CompositeSampler, FeatureFlagSampler, NeverSampler, type OperationResult, RandomSampler, type Sampler, type SamplingContext, UserIdSampler, createLinkFromHeaders, extractLinksFromBatch };
379
+ export { AUTOTEL_SAMPLING_TAIL_EVALUATED, AUTOTEL_SAMPLING_TAIL_KEEP, AdaptiveSampler, AlwaysSampler, CompositeSampler, FeatureFlagSampler, NeverSampler, type OperationResult, RandomSampler, type Sampler, type SamplingContext, type SamplingPreset, UserIdSampler, createLinkFromHeaders, extractLinksFromBatch, resolveSamplingPreset, samplingPresets };
@@ -26,6 +26,11 @@ import 'pino';
26
26
  * ```
27
27
  */
28
28
 
29
+ /**
30
+ * Tail sampling attribute keys (autotel-internal, not OTel semconv)
31
+ */
32
+ declare const AUTOTEL_SAMPLING_TAIL_KEEP = "autotel.sampling.tail.keep";
33
+ declare const AUTOTEL_SAMPLING_TAIL_EVALUATED = "autotel.sampling.tail.evaluated";
29
34
  /**
30
35
  * Sampler interface - return true to trace, false to skip
31
36
  */
@@ -275,6 +280,49 @@ declare class FeatureFlagSampler implements Sampler {
275
280
  */
276
281
  removeAlwaysSampleFlags(...flags: string[]): void;
277
282
  }
283
+ /**
284
+ * Named sampling presets for common environments.
285
+ * Use with `init({ sampling: 'production' })` or directly via factories.
286
+ */
287
+ type SamplingPreset = 'development' | 'errors-only' | 'production' | 'off';
288
+ /**
289
+ * Sampling preset factories.
290
+ *
291
+ * For most users, the string shorthand on `init()` is simpler:
292
+ * ```typescript
293
+ * init({ service: 'my-app', sampling: 'production' })
294
+ * ```
295
+ *
296
+ * Use factories when you need to customize:
297
+ * ```typescript
298
+ * init({ service: 'my-app', sampler: samplingPresets.production({ baselineSampleRate: 0.05 }) })
299
+ * ```
300
+ */
301
+ declare const samplingPresets: {
302
+ /** Capture everything — best for local development and debugging */
303
+ development: () => AlwaysSampler;
304
+ /** Only bad outcomes — zero baseline, errors always kept */
305
+ errorsOnly: () => AdaptiveSampler;
306
+ /**
307
+ * Balanced production defaults — 10% baseline + errors + slow traces.
308
+ * Pass overrides to tune (uses the same option names as AdaptiveSampler).
309
+ */
310
+ production: (overrides?: {
311
+ baselineSampleRate?: number;
312
+ slowThresholdMs?: number;
313
+ alwaysSampleErrors?: boolean;
314
+ alwaysSampleSlow?: boolean;
315
+ }) => AdaptiveSampler;
316
+ /** Disable sampling entirely */
317
+ off: () => NeverSampler;
318
+ };
319
+ /**
320
+ * Resolve a preset string to a Sampler instance.
321
+ * Used internally by `init()` when `sampling` string is provided.
322
+ *
323
+ * @throws Error if preset is not recognized
324
+ */
325
+ declare function resolveSamplingPreset(preset: SamplingPreset): Sampler;
278
326
  /**
279
327
  * Create a Link from W3C trace context headers (e.g., from a message queue).
280
328
  *
@@ -328,4 +376,4 @@ declare function extractLinksFromBatch(messages: Array<{
328
376
  [key: string]: unknown;
329
377
  }>, headersKey?: string): Link[];
330
378
 
331
- export { AdaptiveSampler, AlwaysSampler, CompositeSampler, FeatureFlagSampler, NeverSampler, type OperationResult, RandomSampler, type Sampler, type SamplingContext, UserIdSampler, createLinkFromHeaders, extractLinksFromBatch };
379
+ export { AUTOTEL_SAMPLING_TAIL_EVALUATED, AUTOTEL_SAMPLING_TAIL_KEEP, AdaptiveSampler, AlwaysSampler, CompositeSampler, FeatureFlagSampler, NeverSampler, type OperationResult, RandomSampler, type Sampler, type SamplingContext, type SamplingPreset, UserIdSampler, createLinkFromHeaders, extractLinksFromBatch, resolveSamplingPreset, samplingPresets };
package/dist/sampling.js CHANGED
@@ -1,4 +1,4 @@
1
- export { AdaptiveSampler, AlwaysSampler, CompositeSampler, FeatureFlagSampler, NeverSampler, RandomSampler, UserIdSampler, createLinkFromHeaders, extractLinksFromBatch } from './chunk-XND7WBVX.js';
1
+ export { AUTOTEL_SAMPLING_TAIL_EVALUATED, AUTOTEL_SAMPLING_TAIL_KEEP, AdaptiveSampler, AlwaysSampler, CompositeSampler, FeatureFlagSampler, NeverSampler, RandomSampler, UserIdSampler, createLinkFromHeaders, extractLinksFromBatch, resolveSamplingPreset, samplingPresets } from './chunk-VYA6QDNA.js';
2
2
  import './chunk-B33XPEKY.js';
3
3
  import './chunk-J5QENANM.js';
4
4
  import './chunk-HA2WBOGQ.js';