autotel 2.5.0 → 2.7.0

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 (170) hide show
  1. package/README.md +58 -27
  2. package/dist/auto.cjs +11 -10
  3. package/dist/auto.cjs.map +1 -1
  4. package/dist/auto.js +9 -8
  5. package/dist/auto.js.map +1 -1
  6. package/dist/{chunk-DPP5Y5XN.cjs → chunk-2EKAKQUG.cjs} +4 -4
  7. package/dist/{chunk-DPP5Y5XN.cjs.map → chunk-2EKAKQUG.cjs.map} +1 -1
  8. package/dist/chunk-33WTKH7X.js +21 -0
  9. package/dist/chunk-33WTKH7X.js.map +1 -0
  10. package/dist/{chunk-W7LHZVQF.js → chunk-4F5YVTKZ.js} +3 -3
  11. package/dist/{chunk-W7LHZVQF.js.map → chunk-4F5YVTKZ.js.map} +1 -1
  12. package/dist/{chunk-KVGNW3FC.js → chunk-4XKOSC37.js} +2 -2
  13. package/dist/{chunk-KVGNW3FC.js.map → chunk-4XKOSC37.js.map} +1 -1
  14. package/dist/{chunk-2EHB2KXS.cjs → chunk-5PZZHX4Y.cjs} +4 -5
  15. package/dist/chunk-5PZZHX4Y.cjs.map +1 -0
  16. package/dist/{chunk-CMWDPNRB.cjs → chunk-6T2EJMZG.cjs} +52 -6
  17. package/dist/chunk-6T2EJMZG.cjs.map +1 -0
  18. package/dist/{chunk-DAAQPYSZ.cjs → chunk-ATLM4S6S.cjs} +70 -70
  19. package/dist/chunk-ATLM4S6S.cjs.map +1 -0
  20. package/dist/{chunk-UZJWNPKT.js → chunk-B4Z26USW.js} +7 -7
  21. package/dist/chunk-B4Z26USW.js.map +1 -0
  22. package/dist/chunk-DGUM43GV.js +10 -0
  23. package/dist/{chunk-Z6ZWNWWR.js.map → chunk-DGUM43GV.js.map} +1 -1
  24. package/dist/{chunk-4UPIZO3A.cjs → chunk-ELIWLU7M.cjs} +90 -145
  25. package/dist/chunk-ELIWLU7M.cjs.map +1 -0
  26. package/dist/{chunk-4Y4HD36J.js → chunk-F4BQHYU2.js} +132 -3
  27. package/dist/chunk-F4BQHYU2.js.map +1 -0
  28. package/dist/{chunk-Y4Y2S7BM.cjs → chunk-HA4UB3LG.cjs} +2 -2
  29. package/dist/{chunk-Y4Y2S7BM.cjs.map → chunk-HA4UB3LG.cjs.map} +1 -1
  30. package/dist/{chunk-AXCCOSA3.js → chunk-HJPXNUZR.js} +4 -5
  31. package/dist/chunk-HJPXNUZR.js.map +1 -0
  32. package/dist/chunk-JEQ2X3Z6.cjs +12 -0
  33. package/dist/{chunk-G7VZBCD6.cjs.map → chunk-JEQ2X3Z6.cjs.map} +1 -1
  34. package/dist/{chunk-644YVKCS.js → chunk-KHPARJOH.js} +43 -43
  35. package/dist/chunk-KHPARJOH.js.map +1 -0
  36. package/dist/{chunk-2LNRY4QK.js → chunk-LBTNNJ7I.js} +3 -3
  37. package/dist/{chunk-2LNRY4QK.js.map → chunk-LBTNNJ7I.js.map} +1 -1
  38. package/dist/{chunk-NC52UBR2.cjs → chunk-LP2P3RP5.cjs} +4 -4
  39. package/dist/{chunk-NC52UBR2.cjs.map → chunk-LP2P3RP5.cjs.map} +1 -1
  40. package/dist/{chunk-NKD4E6ZV.cjs → chunk-MLXWX5OT.cjs} +138 -9
  41. package/dist/chunk-MLXWX5OT.cjs.map +1 -0
  42. package/dist/{chunk-W3253FGB.cjs → chunk-OAS5IIYE.cjs} +4 -4
  43. package/dist/{chunk-W3253FGB.cjs.map → chunk-OAS5IIYE.cjs.map} +1 -1
  44. package/dist/{chunk-EKU6O7WG.js → chunk-P3GQ2CGY.js} +52 -6
  45. package/dist/chunk-P3GQ2CGY.js.map +1 -0
  46. package/dist/{chunk-7PSUYBV3.cjs → chunk-QMYK3TWB.cjs} +11 -11
  47. package/dist/chunk-QMYK3TWB.cjs.map +1 -0
  48. package/dist/{chunk-YHW3MAS7.js → chunk-SR35DG5A.js} +4 -17
  49. package/dist/chunk-SR35DG5A.js.map +1 -0
  50. package/dist/{chunk-NGEG2JQ5.js → chunk-TQ3DJJ3N.js} +3 -3
  51. package/dist/{chunk-NGEG2JQ5.js.map → chunk-TQ3DJJ3N.js.map} +1 -1
  52. package/dist/{chunk-IW37CN6L.cjs → chunk-W4EUTSB2.cjs} +3 -18
  53. package/dist/chunk-W4EUTSB2.cjs.map +1 -0
  54. package/dist/{chunk-WDFFOBJA.js → chunk-YJBSLU3K.js} +89 -144
  55. package/dist/chunk-YJBSLU3K.js.map +1 -0
  56. package/dist/chunk-YS6C2YJE.cjs +25 -0
  57. package/dist/chunk-YS6C2YJE.cjs.map +1 -0
  58. package/dist/config.cjs +6 -6
  59. package/dist/config.d.cts +8 -5
  60. package/dist/config.d.ts +8 -5
  61. package/dist/config.js +2 -2
  62. package/dist/db.cjs +4 -4
  63. package/dist/db.js +2 -2
  64. package/dist/decorators.cjs +11 -12
  65. package/dist/decorators.cjs.map +1 -1
  66. package/dist/decorators.js +9 -10
  67. package/dist/decorators.js.map +1 -1
  68. package/dist/event-subscriber.d.cts +39 -1
  69. package/dist/event-subscriber.d.ts +39 -1
  70. package/dist/event-testing.cjs +1 -1
  71. package/dist/event-testing.js +1 -1
  72. package/dist/event.cjs +10 -9
  73. package/dist/event.d.cts +70 -2
  74. package/dist/event.d.ts +70 -2
  75. package/dist/event.js +7 -6
  76. package/dist/exporters.cjs +1 -1
  77. package/dist/exporters.js +1 -1
  78. package/dist/functional.cjs +16 -15
  79. package/dist/functional.d.cts +3 -3
  80. package/dist/functional.d.ts +3 -3
  81. package/dist/functional.js +9 -8
  82. package/dist/http.cjs +6 -7
  83. package/dist/http.cjs.map +1 -1
  84. package/dist/http.js +3 -4
  85. package/dist/http.js.map +1 -1
  86. package/dist/index.cjs +59 -61
  87. package/dist/index.cjs.map +1 -1
  88. package/dist/index.d.cts +1 -1
  89. package/dist/index.d.ts +1 -1
  90. package/dist/index.js +17 -20
  91. package/dist/index.js.map +1 -1
  92. package/dist/{init-C5wVWc6Y.d.cts → init-iPJE1d2N.d.cts} +110 -52
  93. package/dist/{init-DhU1oVys.d.ts → init-inG_x7Zr.d.ts} +110 -52
  94. package/dist/instrumentation.cjs +15 -14
  95. package/dist/instrumentation.cjs.map +1 -1
  96. package/dist/instrumentation.d.cts +2 -2
  97. package/dist/instrumentation.d.ts +2 -2
  98. package/dist/instrumentation.js +8 -7
  99. package/dist/instrumentation.js.map +1 -1
  100. package/dist/logger.cjs +10 -10
  101. package/dist/logger.js +3 -3
  102. package/dist/metric-helpers.cjs +8 -8
  103. package/dist/metric-helpers.js +3 -3
  104. package/dist/metric-testing.cjs +1 -1
  105. package/dist/metric-testing.js +1 -1
  106. package/dist/metric.cjs +7 -7
  107. package/dist/metric.js +4 -4
  108. package/dist/processors.cjs +1 -1
  109. package/dist/processors.js +1 -1
  110. package/dist/register.cjs +2 -6
  111. package/dist/register.cjs.map +1 -1
  112. package/dist/register.d.cts +1 -29
  113. package/dist/register.d.ts +1 -29
  114. package/dist/register.js +2 -6
  115. package/dist/register.js.map +1 -1
  116. package/dist/sampling.cjs +3 -3
  117. package/dist/sampling.js +3 -3
  118. package/dist/semantic-helpers.cjs +14 -13
  119. package/dist/semantic-helpers.d.cts +9 -9
  120. package/dist/semantic-helpers.d.ts +9 -9
  121. package/dist/semantic-helpers.js +10 -9
  122. package/dist/tail-sampling-processor.cjs +1 -1
  123. package/dist/tail-sampling-processor.js +1 -1
  124. package/dist/testing.cjs +4 -4
  125. package/dist/testing.js +3 -3
  126. package/dist/trace-helpers.cjs +14 -14
  127. package/dist/trace-helpers.js +3 -3
  128. package/dist/tracer-provider.cjs +1 -1
  129. package/dist/tracer-provider.js +1 -1
  130. package/dist/yaml-config.cjs +10 -5
  131. package/dist/yaml-config.d.cts +2 -2
  132. package/dist/yaml-config.d.ts +2 -2
  133. package/dist/yaml-config.js +7 -2
  134. package/package.json +11 -31
  135. package/src/auto.ts +14 -11
  136. package/src/baggage-span-processor.ts +4 -2
  137. package/src/config.ts +10 -7
  138. package/src/env-config.test.ts +2 -2
  139. package/src/env-config.ts +2 -2
  140. package/src/event-subscriber.ts +48 -0
  141. package/src/event.ts +154 -0
  142. package/src/functional.ts +42 -39
  143. package/src/init.customization.test.ts +1 -1
  144. package/src/init.integrations.test.ts +37 -23
  145. package/src/init.openllmetry.test.ts +1 -1
  146. package/src/init.ts +180 -287
  147. package/src/instrumentation.ts +8 -6
  148. package/src/node-require.ts +74 -0
  149. package/src/register.ts +15 -19
  150. package/src/semantic-helpers.test.ts +3 -3
  151. package/src/semantic-helpers.ts +13 -13
  152. package/src/trace-helpers.ts +4 -2
  153. package/src/yaml-config.test.ts +11 -11
  154. package/src/yaml-config.ts +64 -9
  155. package/dist/chunk-2EHB2KXS.cjs.map +0 -1
  156. package/dist/chunk-4UPIZO3A.cjs.map +0 -1
  157. package/dist/chunk-4Y4HD36J.js.map +0 -1
  158. package/dist/chunk-644YVKCS.js.map +0 -1
  159. package/dist/chunk-7PSUYBV3.cjs.map +0 -1
  160. package/dist/chunk-AXCCOSA3.js.map +0 -1
  161. package/dist/chunk-CMWDPNRB.cjs.map +0 -1
  162. package/dist/chunk-DAAQPYSZ.cjs.map +0 -1
  163. package/dist/chunk-EKU6O7WG.js.map +0 -1
  164. package/dist/chunk-G7VZBCD6.cjs +0 -35
  165. package/dist/chunk-IW37CN6L.cjs.map +0 -1
  166. package/dist/chunk-NKD4E6ZV.cjs.map +0 -1
  167. package/dist/chunk-UZJWNPKT.js.map +0 -1
  168. package/dist/chunk-WDFFOBJA.js.map +0 -1
  169. package/dist/chunk-YHW3MAS7.js.map +0 -1
  170. package/dist/chunk-Z6ZWNWWR.js +0 -30
package/README.md CHANGED
@@ -180,7 +180,7 @@ init({
180
180
  service: 'my-app',
181
181
  // Datadog (traces + metrics + logs via OTLP)
182
182
  endpoint: 'https://otlp.datadoghq.com',
183
- otlpHeaders: 'dd-api-key=...',
183
+ headers: 'dd-api-key=...',
184
184
  });
185
185
 
186
186
  init({
@@ -188,7 +188,7 @@ init({
188
188
  // Honeycomb (gRPC protocol)
189
189
  protocol: 'grpc',
190
190
  endpoint: 'api.honeycomb.io:443',
191
- otlpHeaders: {
191
+ headers: {
192
192
  'x-honeycomb-team': process.env.HONEYCOMB_API_KEY!,
193
193
  },
194
194
  });
@@ -572,7 +572,7 @@ const db = drizzle(pool);
572
572
 
573
573
  instrumentDatabase(db, {
574
574
  dbSystem: 'postgresql',
575
- dbName: 'myapp',
575
+ database: 'myapp',
576
576
  });
577
577
 
578
578
  await db.select().from(users); // queries emit spans automatically
@@ -750,11 +750,11 @@ init({
750
750
 
751
751
  ## Auto Instrumentation & Advanced Configuration
752
752
 
753
- - `integrations` – Enable OpenTelemetry auto-instrumentations (HTTP, Express, Fastify, Prisma, Pino…). Requires `@opentelemetry/auto-instrumentations-node`.
753
+ - `autoInstrumentations` – Enable OpenTelemetry auto-instrumentations (HTTP, Express, Fastify, Prisma, Pino…). Requires `@opentelemetry/auto-instrumentations-node`.
754
754
  - `instrumentations` – Provide manual instrumentation instances, e.g., `new HttpInstrumentation()`.
755
755
  - `resource` / `resourceAttributes` – Declare cluster/region/tenant metadata once and it flows everywhere.
756
756
  - `spanProcessor`, `metricReader`, `logRecordProcessors` – Plug in any OpenTelemetry exporter or your in-house pipeline.
757
- - `otlpHeaders` – Attach vendor auth headers when using the built-in OTLP HTTP exporters.
757
+ - `headers` – Attach vendor auth headers when using the built-in OTLP HTTP exporters.
758
758
  - `sdkFactory` – Receive the Autotel defaults and return a fully customized `NodeSDK` for the rare cases you need complete control.
759
759
 
760
760
  ```typescript
@@ -768,23 +768,23 @@ init({
768
768
  'cloud.region': 'us-east-1',
769
769
  'deployment.environment': 'production',
770
770
  },
771
- integrations: ['http', 'express', 'pino'],
771
+ autoInstrumentations: ['http', 'express', 'pino'],
772
772
  instrumentations: [new HttpInstrumentation()],
773
- otlpHeaders: 'Authorization=Basic ...',
773
+ headers: 'Authorization=Basic ...',
774
774
  subscribers: [new PostHogSubscriber({ apiKey: 'phc_xxx' })],
775
775
  });
776
776
  ```
777
777
 
778
- ### ⚠️ Integrations vs. Manual Instrumentations
778
+ ### ⚠️ autoInstrumentations vs. Manual Instrumentations
779
779
 
780
- When using both `integrations` and `instrumentations`, manual instrumentations always take precedence. If you need custom configs (like `requireParentSpan: false` for standalone scripts), use **one or the other**:
780
+ When using both `autoInstrumentations` and `instrumentations`, manual instrumentations always take precedence. If you need custom configs (like `requireParentSpan: false` for standalone scripts), use **one or the other**:
781
781
 
782
782
  #### Option A: Auto-instrumentations only (all defaults)
783
783
 
784
784
  ```typescript
785
785
  init({
786
786
  service: 'my-app',
787
- integrations: true, // All libraries with default configs
787
+ autoInstrumentations: true, // All libraries with default configs
788
788
  });
789
789
  ```
790
790
 
@@ -796,7 +796,7 @@ import { MongooseInstrumentation } from '@opentelemetry/instrumentation-mongoose
796
796
 
797
797
  init({
798
798
  service: 'my-app',
799
- integrations: false, // Must be false to avoid conflicts
799
+ autoInstrumentations: false, // Must be false to avoid conflicts
800
800
  instrumentations: [
801
801
  new MongoDBInstrumentation({
802
802
  requireParentSpan: false, // Custom config for scripts/cron jobs
@@ -815,7 +815,7 @@ import { MongoDBInstrumentation } from '@opentelemetry/instrumentation-mongodb';
815
815
 
816
816
  init({
817
817
  service: 'my-app',
818
- integrations: ['http', 'express'], // Auto for most libraries
818
+ autoInstrumentations: ['http', 'express'], // Auto for most libraries
819
819
  instrumentations: [
820
820
  // Manual config only for libraries that need custom settings
821
821
  new MongoDBInstrumentation({
@@ -831,7 +831,38 @@ init({
831
831
 
832
832
  OpenTelemetry's auto-instrumentation packages require special setup depending on your module system:
833
833
 
834
- **CommonJS (Simpler - Recommended)**
834
+ **ESM Setup (Recommended for Node 18.19+)**
835
+
836
+ Use `autotel/register` for clean ESM instrumentation without complex `NODE_OPTIONS`:
837
+
838
+ ```typescript
839
+ // instrumentation.mjs (or .ts)
840
+ import 'autotel/register'; // MUST be first import!
841
+ import { init } from 'autotel';
842
+ import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';
843
+
844
+ init({
845
+ service: 'my-app',
846
+ instrumentations: getNodeAutoInstrumentations({
847
+ '@opentelemetry/instrumentation-pino': { enabled: true },
848
+ }),
849
+ });
850
+ ```
851
+
852
+ ```bash
853
+ # Run with --import flag
854
+ tsx --import ./instrumentation.mjs src/server.ts
855
+ # or with Node
856
+ node --import ./instrumentation.mjs src/server.js
857
+ ```
858
+
859
+ **Requirements for ESM instrumentation:**
860
+
861
+ - Install `@opentelemetry/auto-instrumentations-node` as a **direct dependency** in your app
862
+ - Import `autotel/register` **before** any other imports
863
+ - Use `--import` flag (not `--require`)
864
+
865
+ **CommonJS Setup**
835
866
 
836
867
  No special flags required. Just use `--require`:
837
868
 
@@ -846,21 +877,21 @@ No special flags required. Just use `--require`:
846
877
  node --require ./instrumentation.js src/server.js
847
878
  ```
848
879
 
849
- **ESM (Requires Experimental Loader Hook)**
850
-
851
- If you need ESM, use the `--experimental-loader` flag:
880
+ **Zero-Config ESM (reads from env vars):**
852
881
 
853
882
  ```bash
854
- NODE_OPTIONS="--import ./instrumentation.mjs --experimental-loader=@opentelemetry/instrumentation/hook.mjs" node src/server.js
883
+ OTEL_SERVICE_NAME=my-app tsx --import autotel/auto src/index.ts
855
884
  ```
856
885
 
857
- For tsx users:
886
+ **Legacy ESM (Node 18.0-18.18)**
887
+
888
+ If you can't use `autotel/register`, use the `--experimental-loader` flag:
858
889
 
859
890
  ```bash
860
891
  NODE_OPTIONS="--experimental-loader=@opentelemetry/instrumentation/hook.mjs --import ./instrumentation.ts" tsx src/server.ts
861
892
  ```
862
893
 
863
- **Note:** The loader hook is an OpenTelemetry upstream requirement for ESM, not an autotel limitation. Autotel itself works identically in both ESM and CJS. See [OpenTelemetry ESM docs](https://opentelemetry.io/docs/languages/js/getting-started/nodejs/#esm-support) for details.
894
+ **Note:** The loader hook is an OpenTelemetry upstream requirement for ESM, not an autotel limitation. See [OpenTelemetry ESM docs](https://opentelemetry.io/docs/languages/js/getting-started/nodejs/#esm-support) for details.
864
895
 
865
896
  ## Operational Safety & Runtime Controls
866
897
 
@@ -868,7 +899,7 @@ NODE_OPTIONS="--experimental-loader=@opentelemetry/instrumentation/hook.mjs --im
868
899
  - **Rate limiting & circuit breakers** – Prevent telemetry storms when backends misbehave.
869
900
  - **Validation** – Configurable attribute/event name lengths, maximum counts, and nesting depth.
870
901
  - **Sensitive data redaction** – Passwords, tokens, API keys, and any custom regex you provide are automatically masked before export.
871
- - **Auto-flush** – Events buffers drain when root spans end (disable with `autoFlushEvents: false`).
902
+ - **Auto-flush** – Events buffers drain when root spans end (disable with `flushOnRootSpanEnd: false`).
872
903
  - **Runtime flags** – Toggle metrics or swap endpoints via env vars without code edits.
873
904
 
874
905
  ```bash
@@ -892,16 +923,16 @@ init({
892
923
  version?: string;
893
924
  environment?: string;
894
925
  baggage?: boolean | string; // Auto-copy baggage to span attributes
895
- autoFlushEvents?: boolean; // Auto-flush events (default: true)
896
- autoFlush?: boolean; // Auto-flush spans (default: false)
897
- integrations?: string[] | boolean | Record<string, { enabled?: boolean }>;
926
+ flushOnRootSpanEnd?: boolean; // Auto-flush events (default: true)
927
+ forceFlushOnShutdown?: boolean; // Force-flush spans on shutdown (default: false)
928
+ autoInstrumentations?: string[] | boolean | Record<string, { enabled?: boolean }>;
898
929
  instrumentations?: NodeSDKConfiguration['instrumentations'];
899
930
  spanProcessor?: SpanProcessor;
900
931
  metricReader?: MetricReader;
901
932
  logRecordProcessors?: LogRecordProcessor[];
902
933
  resource?: Resource;
903
934
  resourceAttributes?: Record<string, string>;
904
- otlpHeaders?: Record<string, string> | string;
935
+ headers?: Record<string, string> | string;
905
936
  sdkFactory?: (defaults: NodeSDK) => NodeSDK;
906
937
  validation?: Partial<ValidationConfig>;
907
938
  logger?: Logger; // created via createLogger() or bring your own
@@ -1337,8 +1368,8 @@ Enable automatic span flushing on root span completion:
1337
1368
  ```typescript
1338
1369
  init({
1339
1370
  service: 'my-lambda',
1340
- autoFlushEvents: true, // enabled by default (events only)
1341
- autoFlush: true, // flush spans on root completion
1371
+ flushOnRootSpanEnd: true, // enabled by default (events only)
1372
+ forceFlushOnShutdown: true, // flush spans on root completion
1342
1373
  });
1343
1374
 
1344
1375
  export const handler = trace(async (event) => {
@@ -1357,7 +1388,7 @@ export const handler = trace(async (event) => {
1357
1388
 
1358
1389
  **When to use:**
1359
1390
 
1360
- - Use `autoFlush: true` for serverless functions where latency is acceptable
1391
+ - Use `forceFlushOnShutdown: true` for serverless functions where latency is acceptable
1361
1392
  - Use manual `flush()` for more control over when flushing occurs
1362
1393
  - Use neither for long-running services (batch export is more efficient)
1363
1394
 
package/dist/auto.cjs CHANGED
@@ -1,26 +1,27 @@
1
1
  'use strict';
2
2
 
3
- var chunk4UPIZO3A_cjs = require('./chunk-4UPIZO3A.cjs');
4
- var chunkCMWDPNRB_cjs = require('./chunk-CMWDPNRB.cjs');
3
+ var chunkELIWLU7M_cjs = require('./chunk-ELIWLU7M.cjs');
4
+ var chunk6T2EJMZG_cjs = require('./chunk-6T2EJMZG.cjs');
5
5
  require('./chunk-GVLK7YUU.cjs');
6
+ require('./chunk-YS6C2YJE.cjs');
6
7
  require('./chunk-HE6T6FIX.cjs');
7
- require('./chunk-DPP5Y5XN.cjs');
8
- require('./chunk-Y4Y2S7BM.cjs');
8
+ require('./chunk-2EKAKQUG.cjs');
9
+ require('./chunk-HA4UB3LG.cjs');
9
10
  require('./chunk-URRW6M2C.cjs');
10
- require('./chunk-G7VZBCD6.cjs');
11
+ require('./chunk-JEQ2X3Z6.cjs');
11
12
  var module$1 = require('module');
12
13
  var importInTheMiddle = require('import-in-the-middle');
13
14
 
14
15
  var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
15
16
  var { registerOptions } = importInTheMiddle.createAddHookMessageChannel();
16
17
  module$1.register("import-in-the-middle/hook.mjs", (typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('auto.cjs', document.baseURI).href)), registerOptions);
17
- var yamlConfig = chunkCMWDPNRB_cjs.loadYamlConfig();
18
- var integrationsEnv = process.env.AUTOTEL_INTEGRATIONS;
19
- var integrations = integrationsEnv === "true" ? true : integrationsEnv ? integrationsEnv.split(",").map((s) => s.trim()) : yamlConfig?.integrations ?? ["http", "express"];
20
- chunk4UPIZO3A_cjs.init({
18
+ var yamlConfig = chunk6T2EJMZG_cjs.loadYamlConfig();
19
+ var autoInstrumentationsEnv = process.env.AUTOTEL_INTEGRATIONS;
20
+ var autoInstrumentations = autoInstrumentationsEnv === "true" ? true : autoInstrumentationsEnv ? autoInstrumentationsEnv.split(",").map((s) => s.trim()) : yamlConfig?.autoInstrumentations ?? ["http", "express"];
21
+ chunkELIWLU7M_cjs.init({
21
22
  service: yamlConfig?.service ?? process.env.OTEL_SERVICE_NAME ?? "unknown-service",
22
23
  debug: yamlConfig?.debug ?? process.env.AUTOTEL_DEBUG === "true",
23
- integrations
24
+ autoInstrumentations
24
25
  });
25
26
  //# sourceMappingURL=auto.cjs.map
26
27
  //# sourceMappingURL=auto.cjs.map
package/dist/auto.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/auto.ts"],"names":["createAddHookMessageChannel","register","loadYamlConfig","init"],"mappings":";;;;;;;;;;;;;;AAyCA,IAAM,EAAE,eAAA,EAAgB,GAAIA,6CAAA,EAA4B;AACxDC,iBAAA,CAAS,+BAAA,EAAiC,0PAAY,EAAK,eAAe,CAAA;AAG1E,IAAM,aAAaC,gCAAA,EAAe;AAGlC,IAAM,eAAA,GAAkB,QAAQ,GAAA,CAAI,oBAAA;AACpC,IAAM,YAAA,GACJ,oBAAoB,MAAA,GAChB,IAAA,GACA,kBACE,eAAA,CAAgB,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAA,GAC7C,YAAY,YAAA,IAAgB,CAAC,QAAQ,SAAS,CAAA;AAIvDC,sBAAA,CAAK;AAAA,EACH,OAAA,EACE,UAAA,EAAY,OAAA,IAAW,OAAA,CAAQ,IAAI,iBAAA,IAAqB,iBAAA;AAAA,EAC1D,KAAA,EAAO,UAAA,EAAY,KAAA,IAAS,OAAA,CAAQ,IAAI,aAAA,KAAkB,MAAA;AAAA,EAC1D;AACF,CAAC,CAAA","file":"auto.cjs","sourcesContent":["/**\n * Zero-config ESM instrumentation with auto-init from YAML/environment variables\n *\n * This module provides the simplest possible setup for OpenTelemetry instrumentation.\n * Just import it and everything is configured from autotel.yaml or environment variables.\n *\n * Usage with YAML config (recommended):\n * ```bash\n * # Create autotel.yaml in project root, then:\n * tsx --import autotel/auto src/index.ts\n * ```\n *\n * Usage with environment variables:\n * ```bash\n * OTEL_SERVICE_NAME=my-app tsx --import autotel/auto src/index.ts\n * ```\n *\n * No instrumentation.ts file needed!\n *\n * Configuration Priority (highest to lowest):\n * 1. YAML file (autotel.yaml or AUTOTEL_CONFIG_FILE)\n * 2. Environment variables (OTEL_*, AUTOTEL_*)\n * 3. Built-in defaults\n *\n * Environment Variables:\n * - OTEL_SERVICE_NAME: Service name (required for meaningful traces)\n * - OTEL_EXPORTER_OTLP_ENDPOINT: OTLP collector endpoint (e.g., http://localhost:4318)\n * - OTEL_EXPORTER_OTLP_HEADERS: Auth headers (e.g., x-honeycomb-team=YOUR_KEY)\n * - AUTOTEL_INTEGRATIONS: Comma-separated list or 'true' for all (default: http,express)\n * - AUTOTEL_DEBUG: Set to 'true' to enable console span output\n * - AUTOTEL_CONFIG_FILE: Path to YAML config file (overrides autotel.yaml discovery)\n *\n * @requires Node.js 20.6.0 or later\n */\n\nimport { register } from 'node:module';\nimport { createAddHookMessageChannel } from 'import-in-the-middle';\nimport { init } from './init.js';\nimport { loadYamlConfig } from './yaml-config.js';\n\n// Register ESM hooks first (must happen before any instrumented modules load)\nconst { registerOptions } = createAddHookMessageChannel();\nregister('import-in-the-middle/hook.mjs', import.meta.url, registerOptions);\n\n// Load YAML config if present (init.ts will also load it, but we need values here)\nconst yamlConfig = loadYamlConfig();\n\n// Parse integrations from environment variable (fallback if not in YAML)\nconst integrationsEnv = process.env.AUTOTEL_INTEGRATIONS;\nconst integrations: string[] | boolean | Record<string, { enabled?: boolean }> =\n integrationsEnv === 'true'\n ? true // Enable all integrations\n : integrationsEnv\n ? integrationsEnv.split(',').map((s) => s.trim())\n : (yamlConfig?.integrations ?? ['http', 'express']); // YAML > default\n\n// Auto-initialize with YAML config merged with env var defaults\n// init() will load YAML again and merge properly, but we pass overrides here\ninit({\n service:\n yamlConfig?.service ?? process.env.OTEL_SERVICE_NAME ?? 'unknown-service',\n debug: yamlConfig?.debug ?? process.env.AUTOTEL_DEBUG === 'true',\n integrations,\n});\n"]}
1
+ {"version":3,"sources":["../src/auto.ts"],"names":["createAddHookMessageChannel","register","loadYamlConfig","init"],"mappings":";;;;;;;;;;;;;;;AAyCA,IAAM,EAAE,eAAA,EAAgB,GAAIA,6CAAA,EAA4B;AACxDC,iBAAA,CAAS,+BAAA,EAAiC,0PAAY,EAAK,eAAe,CAAA;AAG1E,IAAM,aAAaC,gCAAA,EAAe;AAGlC,IAAM,uBAAA,GAA0B,QAAQ,GAAA,CAAI,oBAAA;AAC5C,IAAM,oBAAA,GAIJ,4BAA4B,MAAA,GACxB,IAAA,GACA,0BACE,uBAAA,CAAwB,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAA,GACrD,YAAY,oBAAA,IAAwB,CAAC,QAAQ,SAAS,CAAA;AAI/DC,sBAAA,CAAK;AAAA,EACH,OAAA,EACE,UAAA,EAAY,OAAA,IAAW,OAAA,CAAQ,IAAI,iBAAA,IAAqB,iBAAA;AAAA,EAC1D,KAAA,EAAO,UAAA,EAAY,KAAA,IAAS,OAAA,CAAQ,IAAI,aAAA,KAAkB,MAAA;AAAA,EAC1D;AACF,CAAC,CAAA","file":"auto.cjs","sourcesContent":["/**\n * Zero-config ESM instrumentation with auto-init from YAML/environment variables\n *\n * This module provides the simplest possible setup for OpenTelemetry instrumentation.\n * Just import it and everything is configured from autotel.yaml or environment variables.\n *\n * Usage with YAML config (recommended):\n * ```bash\n * # Create autotel.yaml in project root, then:\n * tsx --import autotel/auto src/index.ts\n * ```\n *\n * Usage with environment variables:\n * ```bash\n * OTEL_SERVICE_NAME=my-app tsx --import autotel/auto src/index.ts\n * ```\n *\n * No instrumentation.ts file needed!\n *\n * Configuration Priority (highest to lowest):\n * 1. YAML file (autotel.yaml or AUTOTEL_CONFIG_FILE)\n * 2. Environment variables (OTEL_*, AUTOTEL_*)\n * 3. Built-in defaults\n *\n * Environment Variables:\n * - OTEL_SERVICE_NAME: Service name (required for meaningful traces)\n * - OTEL_EXPORTER_OTLP_ENDPOINT: OTLP collector endpoint (e.g., http://localhost:4318)\n * - OTEL_EXPORTER_OTLP_HEADERS: Auth headers (e.g., x-honeycomb-team=YOUR_KEY)\n * - AUTOTEL_INTEGRATIONS: Comma-separated list or 'true' for all (default: http,express)\n * - AUTOTEL_DEBUG: Set to 'true' to enable console span output\n * - AUTOTEL_CONFIG_FILE: Path to YAML config file (overrides autotel.yaml discovery)\n *\n * @requires Node.js 20.6.0 or later\n */\n\nimport { register } from 'node:module';\nimport { createAddHookMessageChannel } from 'import-in-the-middle';\nimport { init } from './init';\nimport { loadYamlConfig } from './yaml-config';\n\n// Register ESM hooks first (must happen before any instrumented modules load)\nconst { registerOptions } = createAddHookMessageChannel();\nregister('import-in-the-middle/hook.mjs', import.meta.url, registerOptions);\n\n// Load YAML config if present (init.ts will also load it, but we need values here)\nconst yamlConfig = loadYamlConfig();\n\n// Parse auto-instrumentations from environment variable (fallback if not in YAML)\nconst autoInstrumentationsEnv = process.env.AUTOTEL_INTEGRATIONS;\nconst autoInstrumentations:\n | string[]\n | boolean\n | Record<string, { enabled?: boolean }> =\n autoInstrumentationsEnv === 'true'\n ? true // Enable all auto-instrumentations\n : autoInstrumentationsEnv\n ? autoInstrumentationsEnv.split(',').map((s) => s.trim())\n : (yamlConfig?.autoInstrumentations ?? ['http', 'express']); // YAML > default\n\n// Auto-initialize with YAML config merged with env var defaults\n// init() will load YAML again and merge properly, but we pass overrides here\ninit({\n service:\n yamlConfig?.service ?? process.env.OTEL_SERVICE_NAME ?? 'unknown-service',\n debug: yamlConfig?.debug ?? process.env.AUTOTEL_DEBUG === 'true',\n autoInstrumentations,\n});\n"]}
package/dist/auto.js CHANGED
@@ -1,23 +1,24 @@
1
- import { init } from './chunk-WDFFOBJA.js';
2
- import { loadYamlConfig } from './chunk-EKU6O7WG.js';
1
+ import { init } from './chunk-YJBSLU3K.js';
2
+ import { loadYamlConfig } from './chunk-P3GQ2CGY.js';
3
3
  import './chunk-X4RMFFMR.js';
4
+ import './chunk-33WTKH7X.js';
4
5
  import './chunk-5R2M36QB.js';
5
- import './chunk-NGEG2JQ5.js';
6
- import './chunk-KVGNW3FC.js';
6
+ import './chunk-TQ3DJJ3N.js';
7
+ import './chunk-4XKOSC37.js';
7
8
  import './chunk-P6JUDYNO.js';
8
- import './chunk-Z6ZWNWWR.js';
9
+ import './chunk-DGUM43GV.js';
9
10
  import { register } from 'module';
10
11
  import { createAddHookMessageChannel } from 'import-in-the-middle';
11
12
 
12
13
  var { registerOptions } = createAddHookMessageChannel();
13
14
  register("import-in-the-middle/hook.mjs", import.meta.url, registerOptions);
14
15
  var yamlConfig = loadYamlConfig();
15
- var integrationsEnv = process.env.AUTOTEL_INTEGRATIONS;
16
- var integrations = integrationsEnv === "true" ? true : integrationsEnv ? integrationsEnv.split(",").map((s) => s.trim()) : yamlConfig?.integrations ?? ["http", "express"];
16
+ var autoInstrumentationsEnv = process.env.AUTOTEL_INTEGRATIONS;
17
+ var autoInstrumentations = autoInstrumentationsEnv === "true" ? true : autoInstrumentationsEnv ? autoInstrumentationsEnv.split(",").map((s) => s.trim()) : yamlConfig?.autoInstrumentations ?? ["http", "express"];
17
18
  init({
18
19
  service: yamlConfig?.service ?? process.env.OTEL_SERVICE_NAME ?? "unknown-service",
19
20
  debug: yamlConfig?.debug ?? process.env.AUTOTEL_DEBUG === "true",
20
- integrations
21
+ autoInstrumentations
21
22
  });
22
23
  //# sourceMappingURL=auto.js.map
23
24
  //# sourceMappingURL=auto.js.map
package/dist/auto.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/auto.ts"],"names":[],"mappings":";;;;;;;;;;;AAyCA,IAAM,EAAE,eAAA,EAAgB,GAAI,2BAAA,EAA4B;AACxD,QAAA,CAAS,+BAAA,EAAiC,MAAA,CAAA,IAAA,CAAY,GAAA,EAAK,eAAe,CAAA;AAG1E,IAAM,aAAa,cAAA,EAAe;AAGlC,IAAM,eAAA,GAAkB,QAAQ,GAAA,CAAI,oBAAA;AACpC,IAAM,YAAA,GACJ,oBAAoB,MAAA,GAChB,IAAA,GACA,kBACE,eAAA,CAAgB,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAA,GAC7C,YAAY,YAAA,IAAgB,CAAC,QAAQ,SAAS,CAAA;AAIvD,IAAA,CAAK;AAAA,EACH,OAAA,EACE,UAAA,EAAY,OAAA,IAAW,OAAA,CAAQ,IAAI,iBAAA,IAAqB,iBAAA;AAAA,EAC1D,KAAA,EAAO,UAAA,EAAY,KAAA,IAAS,OAAA,CAAQ,IAAI,aAAA,KAAkB,MAAA;AAAA,EAC1D;AACF,CAAC,CAAA","file":"auto.js","sourcesContent":["/**\n * Zero-config ESM instrumentation with auto-init from YAML/environment variables\n *\n * This module provides the simplest possible setup for OpenTelemetry instrumentation.\n * Just import it and everything is configured from autotel.yaml or environment variables.\n *\n * Usage with YAML config (recommended):\n * ```bash\n * # Create autotel.yaml in project root, then:\n * tsx --import autotel/auto src/index.ts\n * ```\n *\n * Usage with environment variables:\n * ```bash\n * OTEL_SERVICE_NAME=my-app tsx --import autotel/auto src/index.ts\n * ```\n *\n * No instrumentation.ts file needed!\n *\n * Configuration Priority (highest to lowest):\n * 1. YAML file (autotel.yaml or AUTOTEL_CONFIG_FILE)\n * 2. Environment variables (OTEL_*, AUTOTEL_*)\n * 3. Built-in defaults\n *\n * Environment Variables:\n * - OTEL_SERVICE_NAME: Service name (required for meaningful traces)\n * - OTEL_EXPORTER_OTLP_ENDPOINT: OTLP collector endpoint (e.g., http://localhost:4318)\n * - OTEL_EXPORTER_OTLP_HEADERS: Auth headers (e.g., x-honeycomb-team=YOUR_KEY)\n * - AUTOTEL_INTEGRATIONS: Comma-separated list or 'true' for all (default: http,express)\n * - AUTOTEL_DEBUG: Set to 'true' to enable console span output\n * - AUTOTEL_CONFIG_FILE: Path to YAML config file (overrides autotel.yaml discovery)\n *\n * @requires Node.js 20.6.0 or later\n */\n\nimport { register } from 'node:module';\nimport { createAddHookMessageChannel } from 'import-in-the-middle';\nimport { init } from './init.js';\nimport { loadYamlConfig } from './yaml-config.js';\n\n// Register ESM hooks first (must happen before any instrumented modules load)\nconst { registerOptions } = createAddHookMessageChannel();\nregister('import-in-the-middle/hook.mjs', import.meta.url, registerOptions);\n\n// Load YAML config if present (init.ts will also load it, but we need values here)\nconst yamlConfig = loadYamlConfig();\n\n// Parse integrations from environment variable (fallback if not in YAML)\nconst integrationsEnv = process.env.AUTOTEL_INTEGRATIONS;\nconst integrations: string[] | boolean | Record<string, { enabled?: boolean }> =\n integrationsEnv === 'true'\n ? true // Enable all integrations\n : integrationsEnv\n ? integrationsEnv.split(',').map((s) => s.trim())\n : (yamlConfig?.integrations ?? ['http', 'express']); // YAML > default\n\n// Auto-initialize with YAML config merged with env var defaults\n// init() will load YAML again and merge properly, but we pass overrides here\ninit({\n service:\n yamlConfig?.service ?? process.env.OTEL_SERVICE_NAME ?? 'unknown-service',\n debug: yamlConfig?.debug ?? process.env.AUTOTEL_DEBUG === 'true',\n integrations,\n});\n"]}
1
+ {"version":3,"sources":["../src/auto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAyCA,IAAM,EAAE,eAAA,EAAgB,GAAI,2BAAA,EAA4B;AACxD,QAAA,CAAS,+BAAA,EAAiC,MAAA,CAAA,IAAA,CAAY,GAAA,EAAK,eAAe,CAAA;AAG1E,IAAM,aAAa,cAAA,EAAe;AAGlC,IAAM,uBAAA,GAA0B,QAAQ,GAAA,CAAI,oBAAA;AAC5C,IAAM,oBAAA,GAIJ,4BAA4B,MAAA,GACxB,IAAA,GACA,0BACE,uBAAA,CAAwB,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAA,GACrD,YAAY,oBAAA,IAAwB,CAAC,QAAQ,SAAS,CAAA;AAI/D,IAAA,CAAK;AAAA,EACH,OAAA,EACE,UAAA,EAAY,OAAA,IAAW,OAAA,CAAQ,IAAI,iBAAA,IAAqB,iBAAA;AAAA,EAC1D,KAAA,EAAO,UAAA,EAAY,KAAA,IAAS,OAAA,CAAQ,IAAI,aAAA,KAAkB,MAAA;AAAA,EAC1D;AACF,CAAC,CAAA","file":"auto.js","sourcesContent":["/**\n * Zero-config ESM instrumentation with auto-init from YAML/environment variables\n *\n * This module provides the simplest possible setup for OpenTelemetry instrumentation.\n * Just import it and everything is configured from autotel.yaml or environment variables.\n *\n * Usage with YAML config (recommended):\n * ```bash\n * # Create autotel.yaml in project root, then:\n * tsx --import autotel/auto src/index.ts\n * ```\n *\n * Usage with environment variables:\n * ```bash\n * OTEL_SERVICE_NAME=my-app tsx --import autotel/auto src/index.ts\n * ```\n *\n * No instrumentation.ts file needed!\n *\n * Configuration Priority (highest to lowest):\n * 1. YAML file (autotel.yaml or AUTOTEL_CONFIG_FILE)\n * 2. Environment variables (OTEL_*, AUTOTEL_*)\n * 3. Built-in defaults\n *\n * Environment Variables:\n * - OTEL_SERVICE_NAME: Service name (required for meaningful traces)\n * - OTEL_EXPORTER_OTLP_ENDPOINT: OTLP collector endpoint (e.g., http://localhost:4318)\n * - OTEL_EXPORTER_OTLP_HEADERS: Auth headers (e.g., x-honeycomb-team=YOUR_KEY)\n * - AUTOTEL_INTEGRATIONS: Comma-separated list or 'true' for all (default: http,express)\n * - AUTOTEL_DEBUG: Set to 'true' to enable console span output\n * - AUTOTEL_CONFIG_FILE: Path to YAML config file (overrides autotel.yaml discovery)\n *\n * @requires Node.js 20.6.0 or later\n */\n\nimport { register } from 'node:module';\nimport { createAddHookMessageChannel } from 'import-in-the-middle';\nimport { init } from './init';\nimport { loadYamlConfig } from './yaml-config';\n\n// Register ESM hooks first (must happen before any instrumented modules load)\nconst { registerOptions } = createAddHookMessageChannel();\nregister('import-in-the-middle/hook.mjs', import.meta.url, registerOptions);\n\n// Load YAML config if present (init.ts will also load it, but we need values here)\nconst yamlConfig = loadYamlConfig();\n\n// Parse auto-instrumentations from environment variable (fallback if not in YAML)\nconst autoInstrumentationsEnv = process.env.AUTOTEL_INTEGRATIONS;\nconst autoInstrumentations:\n | string[]\n | boolean\n | Record<string, { enabled?: boolean }> =\n autoInstrumentationsEnv === 'true'\n ? true // Enable all auto-instrumentations\n : autoInstrumentationsEnv\n ? autoInstrumentationsEnv.split(',').map((s) => s.trim())\n : (yamlConfig?.autoInstrumentations ?? ['http', 'express']); // YAML > default\n\n// Auto-initialize with YAML config merged with env var defaults\n// init() will load YAML again and merge properly, but we pass overrides here\ninit({\n service:\n yamlConfig?.service ?? process.env.OTEL_SERVICE_NAME ?? 'unknown-service',\n debug: yamlConfig?.debug ?? process.env.AUTOTEL_DEBUG === 'true',\n autoInstrumentations,\n});\n"]}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkY4Y2S7BM_cjs = require('./chunk-Y4Y2S7BM.cjs');
3
+ var chunkHA4UB3LG_cjs = require('./chunk-HA4UB3LG.cjs');
4
4
  var api = require('@opentelemetry/api');
5
5
 
6
6
  var LOG_LEVEL_KEY = api.createContextKey("autotel-log-level");
@@ -105,7 +105,7 @@ function LoggedOperation(operationNameOrOptions) {
105
105
  return async function(...args) {
106
106
  const log = this.deps?.log;
107
107
  const startTime = performance.now();
108
- const config = chunkY4Y2S7BM_cjs.getConfig();
108
+ const config = chunkHA4UB3LG_cjs.getConfig();
109
109
  const tracer = config.tracer;
110
110
  return tracer.startActiveSpan(operationName, async (span) => {
111
111
  try {
@@ -163,5 +163,5 @@ exports.createBuiltinLogger = createBuiltinLogger;
163
163
  exports.getActiveLogLevel = getActiveLogLevel;
164
164
  exports.getTraceContext = getTraceContext;
165
165
  exports.runWithLogLevel = runWithLogLevel;
166
- //# sourceMappingURL=chunk-DPP5Y5XN.cjs.map
167
- //# sourceMappingURL=chunk-DPP5Y5XN.cjs.map
166
+ //# sourceMappingURL=chunk-2EKAKQUG.cjs.map
167
+ //# sourceMappingURL=chunk-2EKAKQUG.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/autotel-logger.ts","../src/logger.ts"],"names":["createContextKey","api_context","trace","getConfig","SpanStatusCode"],"mappings":"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","file":"chunk-DPP5Y5XN.cjs","sourcesContent":["/**\n * Zero-dependency structured logger for autotel\n *\n * This logger provides:\n * - Structured JSON logging (production) or pretty print (development)\n * - Auto trace context injection (traceId, spanId, correlationId)\n * - Dynamic log level control (per-request via OTel context)\n * - Level support (debug, info, warn, error, none)\n * - Zero additional dependencies (uses @opentelemetry/api, already a dep)\n *\n * Used as the default fallback when users don't provide Pino/Winston.\n * Can also be used directly: import { createBuiltinLogger } from 'autotel/logger'\n *\n * @example\n * ```typescript\n * import { createBuiltinLogger, runWithLogLevel } from 'autotel/logger';\n *\n * const log = createBuiltinLogger('my-service');\n * log.info('User created', { userId: '123' });\n * // Output: {\"level\":\"info\",\"service\":\"my-service\",\"msg\":\"User created\",\"userId\":\"123\",\"traceId\":\"...\"}\n *\n * // Dynamic log level per-request\n * runWithLogLevel('debug', () => {\n * log.debug('This will log even if default level is \"info\"');\n * });\n * ```\n */\n\nimport {\n trace,\n context as api_context,\n createContextKey,\n} from '@opentelemetry/api';\nimport type { Logger } from './logger';\n\nexport type BuiltinLogLevel = 'debug' | 'info' | 'warn' | 'error' | 'none';\n\n/**\n * Context key for storing active log level (enables per-request log levels)\n */\nconst LOG_LEVEL_KEY = createContextKey('autotel-log-level');\n\n/**\n * Get the active log level from context (if set)\n * Falls back to undefined if no log level is set in context\n */\nexport function getActiveLogLevel(): BuiltinLogLevel | undefined {\n return api_context.active().getValue(LOG_LEVEL_KEY) as\n | BuiltinLogLevel\n | undefined;\n}\n\n/**\n * Run a function with a specific log level\n * The log level is stored in OpenTelemetry context and applies to all logger calls within the callback\n *\n * @example\n * ```typescript\n * // Enable debug logging for a specific request\n * runWithLogLevel('debug', () => {\n * log.debug('This will be logged');\n * processRequest();\n * });\n *\n * // Disable logging temporarily\n * runWithLogLevel('none', () => {\n * log.info('This will NOT be logged');\n * });\n * ```\n */\nexport function runWithLogLevel<T>(\n level: BuiltinLogLevel,\n callback: () => T,\n): T {\n const ctx = api_context.active().setValue(LOG_LEVEL_KEY, level);\n return api_context.with(ctx, callback);\n}\n\n/**\n * Get current trace context from active span\n * Returns null if no active span exists\n */\nfunction getTraceContextInternal(): {\n traceId: string;\n spanId: string;\n correlationId: string;\n} | null {\n const span = trace.getActiveSpan();\n if (!span) return null;\n\n const ctx = span.spanContext();\n return {\n traceId: ctx.traceId,\n spanId: ctx.spanId,\n correlationId: ctx.traceId.slice(0, 16), // First 16 chars for grouping\n };\n}\n\n/**\n * Helper to get trace context (useful for BYOL - Bring Your Own Logger)\n *\n * @example\n * ```typescript\n * import bunyan from 'bunyan';\n * import { getTraceContext } from 'autotel/logger';\n *\n * const bunyanLogger = bunyan.createLogger({ name: 'myapp' });\n * const ctx = getTraceContext();\n * bunyanLogger.info({ ...ctx, email: 'test@example.com' }, 'Creating user');\n * ```\n */\nexport function getTraceContext() {\n return getTraceContextInternal();\n}\n\nexport interface BuiltinLoggerOptions {\n /** Minimum log level. Default: 'info' */\n level?: BuiltinLogLevel;\n /** Pretty print for development. Default: false (JSON output) */\n pretty?: boolean;\n}\n\n/**\n * Create a lightweight structured logger\n *\n * @param service - Service name for logging\n * @param options - Optional configuration\n *\n * @example\n * ```typescript\n * const log = createBuiltinLogger('user-service');\n *\n * log.info('Creating user', { email: 'test@example.com' });\n * // Output: {\"level\":\"info\",\"service\":\"user-service\",\"msg\":\"Creating user\",\n * // \"email\":\"test@example.com\",\"traceId\":\"...\",\"spanId\":\"...\"}\n *\n * // Dynamic log level control per-request\n * runWithLogLevel('debug', () => {\n * log.debug('This will be logged even if logger was created with level: \"info\"');\n * });\n * ```\n */\nexport function createBuiltinLogger(\n service: string,\n options?: BuiltinLoggerOptions,\n): Logger {\n const defaultLevel = options?.level || 'info';\n const pretty = options?.pretty || false;\n\n const levelPriority: Record<BuiltinLogLevel, number> = {\n none: -1,\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n };\n\n const shouldLog = (level: BuiltinLogLevel): boolean => {\n // Priority: context level > options level > 'info' default\n const activeLevel = getActiveLogLevel() ?? defaultLevel;\n\n // 'none' means suppress all logging\n if (activeLevel === 'none') return false;\n\n return levelPriority[level] >= levelPriority[activeLevel];\n };\n\n const log = (\n level: 'info' | 'error' | 'warn' | 'debug',\n msg: string,\n attrs?: Record<string, unknown>,\n ) => {\n if (!shouldLog(level)) return;\n\n const ctx = getTraceContextInternal();\n const logEntry: Record<string, unknown> = {\n level,\n service,\n msg,\n ...attrs,\n ...ctx, // Auto-inject traceId, spanId, correlationId\n timestamp: new Date().toISOString(),\n };\n\n if (pretty) {\n // Pretty print for development\n const traceInfo = ctx\n ? ` [${ctx.traceId.slice(0, 8)}.../${ctx.spanId.slice(0, 8)}...]`\n : '';\n console.log(\n `[${level.toUpperCase()}]${traceInfo} ${service}: ${msg}`,\n attrs || '',\n );\n } else {\n // Structured JSON for production\n console.log(JSON.stringify(logEntry));\n }\n };\n\n return {\n info: (msg: string, attrs?: Record<string, unknown>) =>\n log('info', msg, attrs),\n\n error: (\n msg: string,\n error?: Error | unknown,\n attrs?: Record<string, unknown>,\n ) => {\n let errorAttrs: Record<string, unknown> | undefined;\n if (error instanceof Error) {\n errorAttrs = {\n error: error.message,\n stack: error.stack,\n name: error.name,\n ...attrs,\n };\n } else if (error === undefined) {\n errorAttrs = attrs;\n } else {\n errorAttrs = { error: String(error), ...attrs };\n }\n\n log('error', msg, errorAttrs);\n },\n\n warn: (msg: string, attrs?: Record<string, unknown>) =>\n log('warn', msg, attrs),\n\n debug: (msg: string, attrs?: Record<string, unknown>) =>\n log('debug', msg, attrs),\n };\n}\n\n/**\n * Pino-like factory function for creating an autotel logger\n *\n * @example\n * ```typescript\n * import { autotelLogger } from 'autotel/logger';\n *\n * const log = autotelLogger();\n * log.info('User created', { userId: '123' });\n *\n * // With options\n * const log = autotelLogger({ service: 'my-app', level: 'debug', pretty: true });\n * ```\n */\nexport function autotelLogger(options?: {\n service?: string;\n level?: BuiltinLogLevel;\n pretty?: boolean;\n}): Logger {\n return createBuiltinLogger(options?.service || 'app', {\n level: options?.level,\n pretty: options?.pretty,\n });\n}\n","/**\n * Logger types and utilities for autotel\n *\n * **Zero-Config Option:** Don't provide a logger to `init()` and autotel uses\n * a built-in structured JSON logger with automatic trace context injection.\n *\n * **BYOL (Bring Your Own Logger):** Pass Pino or Winston to `init()` for\n * automatic instrumentation with trace context and OTLP log export.\n *\n * @example Zero-config (uses built-in logger)\n * ```typescript\n * import { init } from 'autotel';\n *\n * init({ service: 'my-app' });\n * // Internal logs: {\"level\":\"info\",\"service\":\"my-app\",\"msg\":\"...\",\"traceId\":\"...\"}\n * ```\n *\n * @example Using built-in logger directly\n * ```typescript\n * import { createBuiltinLogger, runWithLogLevel } from 'autotel/logger';\n *\n * const log = createBuiltinLogger('my-service');\n * log.info('User created', { userId: '123' });\n * // Output: {\"level\":\"info\",\"service\":\"my-service\",\"msg\":\"User created\",...,\"traceId\":\"...\"}\n *\n * // Dynamic log level per-request\n * runWithLogLevel('debug', () => {\n * log.debug('Debug info for this request only');\n * });\n * ```\n *\n * @example Using Pino (recommended for production, auto-instrumented)\n * ```typescript\n * import pino from 'pino'; // npm install pino\n * import { init } from 'autotel';\n *\n * const logger = pino({ level: 'info' });\n * init({ service: 'my-app', logger });\n *\n * // Logs automatically include traceId/spanId and export via OTLP!\n * logger.info('User created', { userId: '123' });\n * ```\n *\n * @example Using Winston (auto-instrumented)\n * ```typescript\n * import winston from 'winston'; // npm install winston\n * import { init } from 'autotel';\n *\n * const logger = winston.createLogger({\n * level: 'info',\n * format: winston.format.json(),\n * transports: [new winston.transports.Console()]\n * });\n * init({ service: 'my-app', logger });\n * ```\n *\n * @example Using Bunyan (manual instrumentation)\n * ```typescript\n * import bunyan from 'bunyan'; // npm install bunyan @opentelemetry/instrumentation-bunyan\n * import { init } from 'autotel';\n * import { BunyanInstrumentation } from '@opentelemetry/instrumentation-bunyan';\n *\n * const logger = bunyan.createLogger({ name: 'my-app' });\n * init({\n * service: 'my-app',\n * logger,\n * instrumentations: [new BunyanInstrumentation()]\n * });\n * ```\n *\n * @example Custom logger (any logger with 4 methods)\n * ```typescript\n * const logger = {\n * info: (msg, extra) => console.log(msg, extra),\n * warn: (msg, extra) => console.warn(msg, extra),\n * error: (msg, err, extra) => console.error(msg, err, extra),\n * debug: (msg, extra) => console.debug(msg, extra),\n * };\n * init({ service: 'my-app', logger });\n * ```\n *\n * @example BYOL helper: inject trace context into any logger\n * ```typescript\n * import bunyan from 'bunyan';\n * import { getTraceContext } from 'autotel/logger';\n *\n * const bunyanLogger = bunyan.createLogger({ name: 'myapp' });\n * const ctx = getTraceContext();\n * bunyanLogger.info({ ...ctx, userId: '123' }, 'Creating user');\n * ```\n */\n\nimport { SpanStatusCode } from '@opentelemetry/api';\nimport { getConfig } from './config';\n\n// ============================================================================\n// Logger Types\n// ============================================================================\n\n/**\n * Log level constants\n */\nexport const LOG_LEVEL = {\n DEBUG: 'debug',\n INFO: 'info',\n WARN: 'warn',\n ERROR: 'error',\n} as const;\n\nexport type LogLevel = (typeof LOG_LEVEL)[keyof typeof LOG_LEVEL];\n\n/**\n * Logger configuration (for reference - not needed with BYOL approach)\n */\nexport interface LoggerConfig {\n service: string;\n level?: LogLevel;\n pretty?: boolean;\n redact?: string[] | false;\n}\n\n/**\n * Simple logger interface - minimal contract for any logger\n *\n * Bring your own Pino, Winston, or any logger with these 4 methods.\n * Autotel automatically instruments Pino and Winston loggers to:\n * - Inject trace context (traceId, spanId) into log records\n * - Record errors in the active span\n * - Bridge logs to OpenTelemetry Logs API for OTLP export\n *\n * @example Using Pino\n * ```typescript\n * import pino from 'pino';\n * const logger = pino({ level: 'info' });\n * init({ service: 'my-app', logger });\n * ```\n *\n * @example Using Winston\n * ```typescript\n * import winston from 'winston';\n * const logger = winston.createLogger({ level: 'info' });\n * init({ service: 'my-app', logger });\n * ```\n */\nexport interface Logger {\n info(message: string, extra?: Record<string, unknown>): void;\n warn(message: string, extra?: Record<string, unknown>): void;\n error(message: string, error?: Error, extra?: Record<string, unknown>): void;\n debug(message: string, extra?: Record<string, unknown>): void;\n}\n\n/**\n * Alias for Logger interface (backwards compatibility)\n * @deprecated Use Logger instead\n */\nexport type ILogger = Logger;\n\n/**\n * Pino logger type - re-exported for convenience\n *\n * Note: This is a type-only export. To use Pino, install it as a peer dependency:\n * `npm install pino`\n */\nexport type { Logger as PinoLogger } from 'pino';\n\n// ============================================================================\n// LoggedOperation Decorator\n// ============================================================================\n\nexport interface LoggedOperationOptions {\n /** Operation name for tracing (e.g., 'user.createUser') */\n operationName: string;\n}\n\n/**\n * TS5+ Standard Decorator for logging and tracing operations\n * Uses TC39 Stage 3 decorator syntax\n *\n * This is the traditional per-method decorator approach.\n * For zero-boilerplate solution, see @Instrumented class decorator.\n *\n * @example\n * // Simple usage\n * class OrderService {\n * constructor(private readonly deps: { log: Logger }) {}\n *\n * @LoggedOperation('order.create')\n * async createOrder(data: CreateOrderData) {\n * this.deps.logger.info('Creating order', data)\n * }\n * }\n *\n * // Advanced usage (future-proof for options)\n * @LoggedOperation({ operationName: 'order.create' })\n * async createOrder(data: CreateOrderData) { }\n */\nexport function LoggedOperation(\n operationNameOrOptions: string | LoggedOperationOptions,\n) {\n const operationName =\n typeof operationNameOrOptions === 'string'\n ? operationNameOrOptions\n : operationNameOrOptions.operationName;\n\n return function <This, Args extends unknown[], Return>(\n originalMethod: (this: This, ...args: Args) => Promise<Return>,\n context: ClassMethodDecoratorContext<\n This,\n (this: This, ...args: Args) => Promise<Return>\n >,\n ) {\n const methodName = String(context.name);\n\n return async function (this: This, ...args: Args): Promise<Return> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const log = (this as any).deps?.log;\n const startTime = performance.now();\n\n const config = getConfig();\n const tracer = config.tracer;\n\n return tracer.startActiveSpan(operationName, async (span) => {\n try {\n log?.info('Operation started', {\n operation: operationName,\n method: methodName,\n args,\n });\n\n const result = await originalMethod.apply(this, args);\n\n const duration = performance.now() - startTime;\n log?.info('Operation completed', {\n operation: operationName,\n method: methodName,\n duration,\n });\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.setAttributes({\n 'operation.name': operationName,\n 'operation.method': methodName,\n 'operation.duration': duration,\n 'operation.success': true,\n });\n\n return result;\n } catch (error) {\n const duration = performance.now() - startTime;\n log?.error(\n 'Operation failed',\n error instanceof Error ? error : undefined,\n { operation: operationName, method: methodName, duration },\n );\n\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : 'Unknown error',\n });\n span.setAttributes({\n 'operation.name': operationName,\n 'operation.method': methodName,\n 'operation.duration': duration,\n 'operation.success': false,\n 'error.type':\n error instanceof Error ? error.constructor.name : 'Unknown',\n });\n\n throw error;\n } finally {\n span.end();\n }\n });\n };\n };\n}\n\n// ============================================================================\n// Built-in Logger (re-exports)\n// ============================================================================\n\nexport {\n autotelLogger,\n createBuiltinLogger,\n runWithLogLevel,\n getTraceContext,\n getActiveLogLevel,\n type BuiltinLogLevel,\n type BuiltinLoggerOptions,\n} from './autotel-logger';\n"]}
1
+ {"version":3,"sources":["../src/autotel-logger.ts","../src/logger.ts"],"names":["createContextKey","api_context","trace","getConfig","SpanStatusCode"],"mappings":"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","file":"chunk-2EKAKQUG.cjs","sourcesContent":["/**\n * Zero-dependency structured logger for autotel\n *\n * This logger provides:\n * - Structured JSON logging (production) or pretty print (development)\n * - Auto trace context injection (traceId, spanId, correlationId)\n * - Dynamic log level control (per-request via OTel context)\n * - Level support (debug, info, warn, error, none)\n * - Zero additional dependencies (uses @opentelemetry/api, already a dep)\n *\n * Used as the default fallback when users don't provide Pino/Winston.\n * Can also be used directly: import { createBuiltinLogger } from 'autotel/logger'\n *\n * @example\n * ```typescript\n * import { createBuiltinLogger, runWithLogLevel } from 'autotel/logger';\n *\n * const log = createBuiltinLogger('my-service');\n * log.info('User created', { userId: '123' });\n * // Output: {\"level\":\"info\",\"service\":\"my-service\",\"msg\":\"User created\",\"userId\":\"123\",\"traceId\":\"...\"}\n *\n * // Dynamic log level per-request\n * runWithLogLevel('debug', () => {\n * log.debug('This will log even if default level is \"info\"');\n * });\n * ```\n */\n\nimport {\n trace,\n context as api_context,\n createContextKey,\n} from '@opentelemetry/api';\nimport type { Logger } from './logger';\n\nexport type BuiltinLogLevel = 'debug' | 'info' | 'warn' | 'error' | 'none';\n\n/**\n * Context key for storing active log level (enables per-request log levels)\n */\nconst LOG_LEVEL_KEY = createContextKey('autotel-log-level');\n\n/**\n * Get the active log level from context (if set)\n * Falls back to undefined if no log level is set in context\n */\nexport function getActiveLogLevel(): BuiltinLogLevel | undefined {\n return api_context.active().getValue(LOG_LEVEL_KEY) as\n | BuiltinLogLevel\n | undefined;\n}\n\n/**\n * Run a function with a specific log level\n * The log level is stored in OpenTelemetry context and applies to all logger calls within the callback\n *\n * @example\n * ```typescript\n * // Enable debug logging for a specific request\n * runWithLogLevel('debug', () => {\n * log.debug('This will be logged');\n * processRequest();\n * });\n *\n * // Disable logging temporarily\n * runWithLogLevel('none', () => {\n * log.info('This will NOT be logged');\n * });\n * ```\n */\nexport function runWithLogLevel<T>(\n level: BuiltinLogLevel,\n callback: () => T,\n): T {\n const ctx = api_context.active().setValue(LOG_LEVEL_KEY, level);\n return api_context.with(ctx, callback);\n}\n\n/**\n * Get current trace context from active span\n * Returns null if no active span exists\n */\nfunction getTraceContextInternal(): {\n traceId: string;\n spanId: string;\n correlationId: string;\n} | null {\n const span = trace.getActiveSpan();\n if (!span) return null;\n\n const ctx = span.spanContext();\n return {\n traceId: ctx.traceId,\n spanId: ctx.spanId,\n correlationId: ctx.traceId.slice(0, 16), // First 16 chars for grouping\n };\n}\n\n/**\n * Helper to get trace context (useful for BYOL - Bring Your Own Logger)\n *\n * @example\n * ```typescript\n * import bunyan from 'bunyan';\n * import { getTraceContext } from 'autotel/logger';\n *\n * const bunyanLogger = bunyan.createLogger({ name: 'myapp' });\n * const ctx = getTraceContext();\n * bunyanLogger.info({ ...ctx, email: 'test@example.com' }, 'Creating user');\n * ```\n */\nexport function getTraceContext() {\n return getTraceContextInternal();\n}\n\nexport interface BuiltinLoggerOptions {\n /** Minimum log level. Default: 'info' */\n level?: BuiltinLogLevel;\n /** Pretty print for development. Default: false (JSON output) */\n pretty?: boolean;\n}\n\n/**\n * Create a lightweight structured logger\n *\n * @param service - Service name for logging\n * @param options - Optional configuration\n *\n * @example\n * ```typescript\n * const log = createBuiltinLogger('user-service');\n *\n * log.info('Creating user', { email: 'test@example.com' });\n * // Output: {\"level\":\"info\",\"service\":\"user-service\",\"msg\":\"Creating user\",\n * // \"email\":\"test@example.com\",\"traceId\":\"...\",\"spanId\":\"...\"}\n *\n * // Dynamic log level control per-request\n * runWithLogLevel('debug', () => {\n * log.debug('This will be logged even if logger was created with level: \"info\"');\n * });\n * ```\n */\nexport function createBuiltinLogger(\n service: string,\n options?: BuiltinLoggerOptions,\n): Logger {\n const defaultLevel = options?.level || 'info';\n const pretty = options?.pretty || false;\n\n const levelPriority: Record<BuiltinLogLevel, number> = {\n none: -1,\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n };\n\n const shouldLog = (level: BuiltinLogLevel): boolean => {\n // Priority: context level > options level > 'info' default\n const activeLevel = getActiveLogLevel() ?? defaultLevel;\n\n // 'none' means suppress all logging\n if (activeLevel === 'none') return false;\n\n return levelPriority[level] >= levelPriority[activeLevel];\n };\n\n const log = (\n level: 'info' | 'error' | 'warn' | 'debug',\n msg: string,\n attrs?: Record<string, unknown>,\n ) => {\n if (!shouldLog(level)) return;\n\n const ctx = getTraceContextInternal();\n const logEntry: Record<string, unknown> = {\n level,\n service,\n msg,\n ...attrs,\n ...ctx, // Auto-inject traceId, spanId, correlationId\n timestamp: new Date().toISOString(),\n };\n\n if (pretty) {\n // Pretty print for development\n const traceInfo = ctx\n ? ` [${ctx.traceId.slice(0, 8)}.../${ctx.spanId.slice(0, 8)}...]`\n : '';\n console.log(\n `[${level.toUpperCase()}]${traceInfo} ${service}: ${msg}`,\n attrs || '',\n );\n } else {\n // Structured JSON for production\n console.log(JSON.stringify(logEntry));\n }\n };\n\n return {\n info: (msg: string, attrs?: Record<string, unknown>) =>\n log('info', msg, attrs),\n\n error: (\n msg: string,\n error?: Error | unknown,\n attrs?: Record<string, unknown>,\n ) => {\n let errorAttrs: Record<string, unknown> | undefined;\n if (error instanceof Error) {\n errorAttrs = {\n error: error.message,\n stack: error.stack,\n name: error.name,\n ...attrs,\n };\n } else if (error === undefined) {\n errorAttrs = attrs;\n } else {\n errorAttrs = { error: String(error), ...attrs };\n }\n\n log('error', msg, errorAttrs);\n },\n\n warn: (msg: string, attrs?: Record<string, unknown>) =>\n log('warn', msg, attrs),\n\n debug: (msg: string, attrs?: Record<string, unknown>) =>\n log('debug', msg, attrs),\n };\n}\n\n/**\n * Pino-like factory function for creating an autotel logger\n *\n * @example\n * ```typescript\n * import { autotelLogger } from 'autotel/logger';\n *\n * const log = autotelLogger();\n * log.info('User created', { userId: '123' });\n *\n * // With options\n * const log = autotelLogger({ service: 'my-app', level: 'debug', pretty: true });\n * ```\n */\nexport function autotelLogger(options?: {\n service?: string;\n level?: BuiltinLogLevel;\n pretty?: boolean;\n}): Logger {\n return createBuiltinLogger(options?.service || 'app', {\n level: options?.level,\n pretty: options?.pretty,\n });\n}\n","/**\n * Logger types and utilities for autotel\n *\n * **Zero-Config Option:** Don't provide a logger to `init()` and autotel uses\n * a built-in structured JSON logger with automatic trace context injection.\n *\n * **BYOL (Bring Your Own Logger):** Pass Pino or Winston to `init()` for\n * automatic instrumentation with trace context and OTLP log export.\n *\n * @example Zero-config (uses built-in logger)\n * ```typescript\n * import { init } from 'autotel';\n *\n * init({ service: 'my-app' });\n * // Internal logs: {\"level\":\"info\",\"service\":\"my-app\",\"msg\":\"...\",\"traceId\":\"...\"}\n * ```\n *\n * @example Using built-in logger directly\n * ```typescript\n * import { createBuiltinLogger, runWithLogLevel } from 'autotel/logger';\n *\n * const log = createBuiltinLogger('my-service');\n * log.info('User created', { userId: '123' });\n * // Output: {\"level\":\"info\",\"service\":\"my-service\",\"msg\":\"User created\",...,\"traceId\":\"...\"}\n *\n * // Dynamic log level per-request\n * runWithLogLevel('debug', () => {\n * log.debug('Debug info for this request only');\n * });\n * ```\n *\n * @example Using Pino (recommended for production, auto-instrumented)\n * ```typescript\n * import pino from 'pino'; // npm install pino\n * import { init } from 'autotel';\n *\n * const logger = pino({ level: 'info' });\n * init({ service: 'my-app', logger });\n *\n * // Logs automatically include traceId/spanId and export via OTLP!\n * logger.info('User created', { userId: '123' });\n * ```\n *\n * @example Using Winston (auto-instrumented)\n * ```typescript\n * import winston from 'winston'; // npm install winston\n * import { init } from 'autotel';\n *\n * const logger = winston.createLogger({\n * level: 'info',\n * format: winston.format.json(),\n * transports: [new winston.transports.Console()]\n * });\n * init({ service: 'my-app', logger });\n * ```\n *\n * @example Using Bunyan (manual instrumentation)\n * ```typescript\n * import bunyan from 'bunyan'; // npm install bunyan @opentelemetry/instrumentation-bunyan\n * import { init } from 'autotel';\n * import { BunyanInstrumentation } from '@opentelemetry/instrumentation-bunyan';\n *\n * const logger = bunyan.createLogger({ name: 'my-app' });\n * init({\n * service: 'my-app',\n * logger,\n * instrumentations: [new BunyanInstrumentation()]\n * });\n * ```\n *\n * @example Custom logger (any logger with 4 methods)\n * ```typescript\n * const logger = {\n * info: (msg, extra) => console.log(msg, extra),\n * warn: (msg, extra) => console.warn(msg, extra),\n * error: (msg, err, extra) => console.error(msg, err, extra),\n * debug: (msg, extra) => console.debug(msg, extra),\n * };\n * init({ service: 'my-app', logger });\n * ```\n *\n * @example BYOL helper: inject trace context into any logger\n * ```typescript\n * import bunyan from 'bunyan';\n * import { getTraceContext } from 'autotel/logger';\n *\n * const bunyanLogger = bunyan.createLogger({ name: 'myapp' });\n * const ctx = getTraceContext();\n * bunyanLogger.info({ ...ctx, userId: '123' }, 'Creating user');\n * ```\n */\n\nimport { SpanStatusCode } from '@opentelemetry/api';\nimport { getConfig } from './config';\n\n// ============================================================================\n// Logger Types\n// ============================================================================\n\n/**\n * Log level constants\n */\nexport const LOG_LEVEL = {\n DEBUG: 'debug',\n INFO: 'info',\n WARN: 'warn',\n ERROR: 'error',\n} as const;\n\nexport type LogLevel = (typeof LOG_LEVEL)[keyof typeof LOG_LEVEL];\n\n/**\n * Logger configuration (for reference - not needed with BYOL approach)\n */\nexport interface LoggerConfig {\n service: string;\n level?: LogLevel;\n pretty?: boolean;\n redact?: string[] | false;\n}\n\n/**\n * Simple logger interface - minimal contract for any logger\n *\n * Bring your own Pino, Winston, or any logger with these 4 methods.\n * Autotel automatically instruments Pino and Winston loggers to:\n * - Inject trace context (traceId, spanId) into log records\n * - Record errors in the active span\n * - Bridge logs to OpenTelemetry Logs API for OTLP export\n *\n * @example Using Pino\n * ```typescript\n * import pino from 'pino';\n * const logger = pino({ level: 'info' });\n * init({ service: 'my-app', logger });\n * ```\n *\n * @example Using Winston\n * ```typescript\n * import winston from 'winston';\n * const logger = winston.createLogger({ level: 'info' });\n * init({ service: 'my-app', logger });\n * ```\n */\nexport interface Logger {\n info(message: string, extra?: Record<string, unknown>): void;\n warn(message: string, extra?: Record<string, unknown>): void;\n error(message: string, error?: Error, extra?: Record<string, unknown>): void;\n debug(message: string, extra?: Record<string, unknown>): void;\n}\n\n/**\n * Alias for Logger interface (backwards compatibility)\n * @deprecated Use Logger instead\n */\nexport type ILogger = Logger;\n\n/**\n * Pino logger type - re-exported for convenience\n *\n * Note: This is a type-only export. To use Pino, install it as a peer dependency:\n * `npm install pino`\n */\nexport type { Logger as PinoLogger } from 'pino';\n\n// ============================================================================\n// LoggedOperation Decorator\n// ============================================================================\n\nexport interface LoggedOperationOptions {\n /** Operation name for tracing (e.g., 'user.createUser') */\n operationName: string;\n}\n\n/**\n * TS5+ Standard Decorator for logging and tracing operations\n * Uses TC39 Stage 3 decorator syntax\n *\n * This is the traditional per-method decorator approach.\n * For zero-boilerplate solution, see @Instrumented class decorator.\n *\n * @example\n * // Simple usage\n * class OrderService {\n * constructor(private readonly deps: { log: Logger }) {}\n *\n * @LoggedOperation('order.create')\n * async createOrder(data: CreateOrderData) {\n * this.deps.logger.info('Creating order', data)\n * }\n * }\n *\n * // Advanced usage (future-proof for options)\n * @LoggedOperation({ operationName: 'order.create' })\n * async createOrder(data: CreateOrderData) { }\n */\nexport function LoggedOperation(\n operationNameOrOptions: string | LoggedOperationOptions,\n) {\n const operationName =\n typeof operationNameOrOptions === 'string'\n ? operationNameOrOptions\n : operationNameOrOptions.operationName;\n\n return function <This, Args extends unknown[], Return>(\n originalMethod: (this: This, ...args: Args) => Promise<Return>,\n context: ClassMethodDecoratorContext<\n This,\n (this: This, ...args: Args) => Promise<Return>\n >,\n ) {\n const methodName = String(context.name);\n\n return async function (this: This, ...args: Args): Promise<Return> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const log = (this as any).deps?.log;\n const startTime = performance.now();\n\n const config = getConfig();\n const tracer = config.tracer;\n\n return tracer.startActiveSpan(operationName, async (span) => {\n try {\n log?.info('Operation started', {\n operation: operationName,\n method: methodName,\n args,\n });\n\n const result = await originalMethod.apply(this, args);\n\n const duration = performance.now() - startTime;\n log?.info('Operation completed', {\n operation: operationName,\n method: methodName,\n duration,\n });\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.setAttributes({\n 'operation.name': operationName,\n 'operation.method': methodName,\n 'operation.duration': duration,\n 'operation.success': true,\n });\n\n return result;\n } catch (error) {\n const duration = performance.now() - startTime;\n log?.error(\n 'Operation failed',\n error instanceof Error ? error : undefined,\n { operation: operationName, method: methodName, duration },\n );\n\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : 'Unknown error',\n });\n span.setAttributes({\n 'operation.name': operationName,\n 'operation.method': methodName,\n 'operation.duration': duration,\n 'operation.success': false,\n 'error.type':\n error instanceof Error ? error.constructor.name : 'Unknown',\n });\n\n throw error;\n } finally {\n span.end();\n }\n });\n };\n };\n}\n\n// ============================================================================\n// Built-in Logger (re-exports)\n// ============================================================================\n\nexport {\n autotelLogger,\n createBuiltinLogger,\n runWithLogLevel,\n getTraceContext,\n getActiveLogLevel,\n type BuiltinLogLevel,\n type BuiltinLoggerOptions,\n} from './autotel-logger';\n"]}
@@ -0,0 +1,21 @@
1
+ import { __require } from './chunk-DGUM43GV.js';
2
+ import { createRequire } from 'module';
3
+
4
+ var nodeRequire = typeof __require === "undefined" ? createRequire(import.meta.url) : __require;
5
+ function safeRequire(id) {
6
+ try {
7
+ return nodeRequire(id);
8
+ } catch (error) {
9
+ if (error && error.code === "MODULE_NOT_FOUND") {
10
+ return void 0;
11
+ }
12
+ throw error;
13
+ }
14
+ }
15
+ function requireModule(id) {
16
+ return nodeRequire(id);
17
+ }
18
+
19
+ export { requireModule, safeRequire };
20
+ //# sourceMappingURL=chunk-33WTKH7X.js.map
21
+ //# sourceMappingURL=chunk-33WTKH7X.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/node-require.ts"],"names":[],"mappings":";;;AAgBA,IAAM,cACJ,OAAO,SAAA,KAAY,cAAc,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA,GAAI,SAAA;AAmB7D,SAAS,YAAyB,EAAA,EAA2B;AAClE,EAAA,IAAI;AACF,IAAA,OAAO,YAAY,EAAE,CAAA;AAAA,EACvB,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,KAAA,IAAU,KAAA,CAAgC,IAAA,KAAS,kBAAA,EAAoB;AAEzE,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAmBO,SAAS,cAA2B,EAAA,EAAe;AACxD,EAAA,OAAO,YAAY,EAAE,CAAA;AACvB","file":"chunk-33WTKH7X.js","sourcesContent":["/**\n * Cross-format require() helper for CJS and ESM compatibility\n *\n * Provides a synchronous `require()` function that works in both:\n * - CJS builds: Uses native `require`\n * - ESM builds: Uses `createRequire(import.meta.url)`\n *\n * This allows optional peer dependencies and dynamic module loading\n * to work synchronously in both module formats.\n */\n\nimport { createRequire } from 'node:module';\n\n// Use native `require` in CJS, `createRequire` in ESM.\n// tsup will compile this appropriately for each format.\n// Type is ReturnType<typeof createRequire> which is a function that loads modules.\nconst nodeRequire =\n typeof require === 'undefined' ? createRequire(import.meta.url) : require;\n\n/**\n * Synchronously require a module (works in both CJS and ESM)\n *\n * @param id - Module ID to require\n * @returns The required module\n * @throws Error if module cannot be loaded\n *\n * @example\n * ```typescript\n * import { safeRequire } from './node-require';\n *\n * const traceloop = safeRequire('@traceloop/node-server-sdk');\n * if (traceloop) {\n * traceloop.initialize({ ... });\n * }\n * ```\n */\nexport function safeRequire<T = unknown>(id: string): T | undefined {\n try {\n return nodeRequire(id) as T;\n } catch (error) {\n if (error && (error as NodeJS.ErrnoException).code === 'MODULE_NOT_FOUND') {\n // Optional dependency missing – return undefined\n return undefined;\n }\n // Any other error is a real bug: rethrow\n throw error;\n }\n}\n\n/**\n * Synchronously require a module (throws if not found)\n *\n * Use this when the module is required (not optional).\n *\n * @param id - Module ID to require\n * @returns The required module\n * @throws Error if module cannot be loaded\n *\n * @example\n * ```typescript\n * import { requireModule } from './node-require';\n *\n * const fs = requireModule<typeof import('node:fs')>('node:fs');\n * const content = fs.readFileSync('file.txt', 'utf8');\n * ```\n */\nexport function requireModule<T = unknown>(id: string): T {\n return nodeRequire(id) as T;\n}\n\n/**\n * Direct access to the nodeRequire function (for advanced use cases)\n */\nexport { nodeRequire };\n"]}
@@ -1,4 +1,4 @@
1
- import { getConfig } from './chunk-KVGNW3FC.js';
1
+ import { getConfig } from './chunk-4XKOSC37.js';
2
2
 
3
3
  // src/metric-helpers.ts
4
4
  function getActiveMeter() {
@@ -22,5 +22,5 @@ function createObservableGauge(name, options) {
22
22
  }
23
23
 
24
24
  export { createCounter, createHistogram, createObservableGauge, createUpDownCounter, getMeter };
25
- //# sourceMappingURL=chunk-W7LHZVQF.js.map
26
- //# sourceMappingURL=chunk-W7LHZVQF.js.map
25
+ //# sourceMappingURL=chunk-4F5YVTKZ.js.map
26
+ //# sourceMappingURL=chunk-4F5YVTKZ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/metric-helpers.ts"],"names":[],"mappings":";;;AASA,SAAS,cAAA,GAAwB;AAC/B,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,OAAO,MAAA,CAAO,KAAA;AAChB;AAEO,SAAS,QAAA,GAAkB;AAChC,EAAA,OAAO,cAAA,EAAe;AACxB;AAOO,SAAS,aAAA,CAAc,MAAc,OAAA,EAAmC;AAC7E,EAAA,OAAO,cAAA,EAAe,CAAE,aAAA,CAAc,IAAA,EAAM,OAAO,CAAA;AACrD;AAEO,SAAS,eAAA,CACd,MACA,OAAA,EACW;AACX,EAAA,OAAO,cAAA,EAAe,CAAE,eAAA,CAAgB,IAAA,EAAM,OAAO,CAAA;AACvD;AAEO,SAAS,mBAAA,CACd,MACA,OAAA,EACe;AACf,EAAA,OAAO,cAAA,EAAe,CAAE,mBAAA,CAAoB,IAAA,EAAM,OAAO,CAAA;AAC3D;AAEO,SAAS,qBAAA,CACd,MACA,OAAA,EACiB;AACjB,EAAA,OAAO,cAAA,EAAe,CAAE,qBAAA,CAAsB,IAAA,EAAM,OAAO,CAAA;AAC7D","file":"chunk-W7LHZVQF.js","sourcesContent":["import type {\n Counter,\n Histogram,\n Meter,\n ObservableGauge,\n UpDownCounter,\n} from '@opentelemetry/api';\nimport { getConfig } from './config';\n\nfunction getActiveMeter(): Meter {\n const config = getConfig();\n return config.meter;\n}\n\nexport function getMeter(): Meter {\n return getActiveMeter();\n}\n\ntype CounterOptions = Parameters<Meter['createCounter']>[1];\ntype HistogramOptions = Parameters<Meter['createHistogram']>[1];\ntype UpDownCounterOptions = Parameters<Meter['createUpDownCounter']>[1];\ntype ObservableGaugeOptions = Parameters<Meter['createObservableGauge']>[1];\n\nexport function createCounter(name: string, options?: CounterOptions): Counter {\n return getActiveMeter().createCounter(name, options);\n}\n\nexport function createHistogram(\n name: string,\n options?: HistogramOptions,\n): Histogram {\n return getActiveMeter().createHistogram(name, options);\n}\n\nexport function createUpDownCounter(\n name: string,\n options?: UpDownCounterOptions,\n): UpDownCounter {\n return getActiveMeter().createUpDownCounter(name, options);\n}\n\nexport function createObservableGauge(\n name: string,\n options?: ObservableGaugeOptions,\n): ObservableGauge {\n return getActiveMeter().createObservableGauge(name, options);\n}\n"]}
1
+ {"version":3,"sources":["../src/metric-helpers.ts"],"names":[],"mappings":";;;AASA,SAAS,cAAA,GAAwB;AAC/B,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,OAAO,MAAA,CAAO,KAAA;AAChB;AAEO,SAAS,QAAA,GAAkB;AAChC,EAAA,OAAO,cAAA,EAAe;AACxB;AAOO,SAAS,aAAA,CAAc,MAAc,OAAA,EAAmC;AAC7E,EAAA,OAAO,cAAA,EAAe,CAAE,aAAA,CAAc,IAAA,EAAM,OAAO,CAAA;AACrD;AAEO,SAAS,eAAA,CACd,MACA,OAAA,EACW;AACX,EAAA,OAAO,cAAA,EAAe,CAAE,eAAA,CAAgB,IAAA,EAAM,OAAO,CAAA;AACvD;AAEO,SAAS,mBAAA,CACd,MACA,OAAA,EACe;AACf,EAAA,OAAO,cAAA,EAAe,CAAE,mBAAA,CAAoB,IAAA,EAAM,OAAO,CAAA;AAC3D;AAEO,SAAS,qBAAA,CACd,MACA,OAAA,EACiB;AACjB,EAAA,OAAO,cAAA,EAAe,CAAE,qBAAA,CAAsB,IAAA,EAAM,OAAO,CAAA;AAC7D","file":"chunk-4F5YVTKZ.js","sourcesContent":["import type {\n Counter,\n Histogram,\n Meter,\n ObservableGauge,\n UpDownCounter,\n} from '@opentelemetry/api';\nimport { getConfig } from './config';\n\nfunction getActiveMeter(): Meter {\n const config = getConfig();\n return config.meter;\n}\n\nexport function getMeter(): Meter {\n return getActiveMeter();\n}\n\ntype CounterOptions = Parameters<Meter['createCounter']>[1];\ntype HistogramOptions = Parameters<Meter['createHistogram']>[1];\ntype UpDownCounterOptions = Parameters<Meter['createUpDownCounter']>[1];\ntype ObservableGaugeOptions = Parameters<Meter['createObservableGauge']>[1];\n\nexport function createCounter(name: string, options?: CounterOptions): Counter {\n return getActiveMeter().createCounter(name, options);\n}\n\nexport function createHistogram(\n name: string,\n options?: HistogramOptions,\n): Histogram {\n return getActiveMeter().createHistogram(name, options);\n}\n\nexport function createUpDownCounter(\n name: string,\n options?: UpDownCounterOptions,\n): UpDownCounter {\n return getActiveMeter().createUpDownCounter(name, options);\n}\n\nexport function createObservableGauge(\n name: string,\n options?: ObservableGaugeOptions,\n): ObservableGauge {\n return getActiveMeter().createObservableGauge(name, options);\n}\n"]}
@@ -83,5 +83,5 @@ function resetConfig() {
83
83
  }
84
84
 
85
85
  export { FEATURE_FLAGS, configure, getConfig, resetConfig };
86
- //# sourceMappingURL=chunk-KVGNW3FC.js.map
87
- //# sourceMappingURL=chunk-KVGNW3FC.js.map
86
+ //# sourceMappingURL=chunk-4XKOSC37.js.map
87
+ //# sourceMappingURL=chunk-4XKOSC37.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/config.ts"],"names":[],"mappings":"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","file":"chunk-KVGNW3FC.js","sourcesContent":["/**\n * Global configuration for OpenTelemetry decorators\n *\n * Allows users to inject custom loggers, tracers, and meters\n * while maintaining sensible defaults.\n */\n\nimport { trace, metrics, type Tracer, type Meter } from '@opentelemetry/api';\nimport { getAutotelTracer } from './tracer-provider';\n\nexport type { ILogger } from './logger';\n\n/**\n * Environment-based feature flags for performance optimization\n *\n * Disables expensive features in development while maintaining\n * full observability in production.\n */\nconst IS_PRODUCTION = process.env.NODE_ENV === 'production';\nconst IS_DEV = process.env.NODE_ENV === 'development';\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst IS_TEST = process.env.NODE_ENV === 'test';\n\nexport const FEATURE_FLAGS = {\n /** Enable full auto-instrumentation (expensive, production only) */\n ENABLE_AUTO_INSTRUMENTATION:\n IS_PRODUCTION && process.env.autotel_AUTO_INSTRUMENT !== 'false',\n\n /** Enable verbose logging (development only) */\n ENABLE_VERBOSE_LOGGING: IS_DEV || process.env.autotel_VERBOSE === 'true',\n\n /** Enable metrics collection (production only) */\n ENABLE_METRICS_BY_DEFAULT:\n IS_PRODUCTION && process.env.autotel_METRICS !== 'false',\n\n /** Enable async resource detection (production only) */\n ENABLE_RESOURCE_DETECTION:\n IS_PRODUCTION && process.env.autotel_RESOURCE_DETECTION === 'true',\n\n /** Enable tracing in all environments (can be disabled via autotel_TRACING=false) */\n ENABLE_TRACING: process.env.autotel_TRACING !== 'false',\n\n /** Enable log redaction for sensitive fields (can be disabled via autotel_REDACTION=false) */\n ENABLE_REDACTION: process.env.autotel_REDACTION !== 'false',\n} as const;\n\n/**\n * Global configuration options\n */\nexport interface InstrumentationConfig {\n /**\n * Tracer name for OpenTelemetry\n * @default 'app'\n */\n tracerName?: string;\n\n /**\n * Meter name for OpenTelemetry metrics\n * @default 'app'\n */\n meterName?: string;\n\n /**\n * Custom tracer instance (for advanced use cases like Datadog direct)\n * @default trace.getTracer(tracerName)\n */\n tracer?: Tracer;\n\n /**\n * Custom meter instance\n * @default metrics.getMeter(meterName)\n */\n meter?: Meter;\n}\n\n/**\n * Internal configuration state\n */\nclass Config {\n private config: Required<InstrumentationConfig> = {\n tracerName: 'app',\n meterName: 'app',\n tracer: getAutotelTracer('app'),\n meter: metrics.getMeter('app'),\n };\n\n /**\n * Get feature flags\n */\n get featureFlags() {\n return FEATURE_FLAGS;\n }\n\n /**\n * Update global configuration\n */\n configure(options: InstrumentationConfig): void {\n if (options.tracerName) {\n this.config.tracerName = options.tracerName;\n this.config.tracer = getAutotelTracer(options.tracerName);\n }\n if (options.meterName) {\n this.config.meterName = options.meterName;\n this.config.meter = metrics.getMeter(options.meterName);\n }\n if (options.tracer) {\n this.config.tracer = options.tracer;\n }\n if (options.meter) {\n this.config.meter = options.meter;\n }\n }\n\n /**\n * Get current configuration\n */\n get(): Required<InstrumentationConfig> {\n return this.config;\n }\n\n /**\n * Reset to defaults (mainly for testing)\n */\n reset(): void {\n this.config = {\n tracerName: 'app',\n meterName: 'app',\n tracer: trace.getTracer('app'),\n meter: metrics.getMeter('app'),\n };\n }\n}\n\nconst globalConfig = new Config();\n\n/**\n * Configure global instrumentation behavior\n *\n * @example\n * ```typescript\n * import { configure } from 'autotel/config'\n *\n * configure({\n * tracerName: 'my-app'\n * })\n * ```\n */\nexport function configure(options: InstrumentationConfig): void {\n globalConfig.configure(options);\n}\n\n/**\n * Get current configuration (internal use)\n */\nexport function getConfig(): Required<InstrumentationConfig> & {\n featureFlags: typeof FEATURE_FLAGS;\n} {\n return {\n ...globalConfig.get(),\n featureFlags: FEATURE_FLAGS,\n };\n}\n\n/**\n * Reset configuration to defaults (internal use - mainly for testing)\n */\nexport function resetConfig(): void {\n globalConfig.reset();\n}\n"]}
1
+ {"version":3,"sources":["../src/config.ts"],"names":[],"mappings":"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","file":"chunk-4XKOSC37.js","sourcesContent":["/**\n * Global configuration for OpenTelemetry decorators\n *\n * Allows users to inject custom loggers, tracers, and meters\n * while maintaining sensible defaults.\n */\n\nimport { trace, metrics, type Tracer, type Meter } from '@opentelemetry/api';\nimport { getAutotelTracer } from './tracer-provider';\n\nexport type { ILogger } from './logger';\n\n/**\n * Environment-based feature flags for performance optimization\n *\n * Disables expensive features in development while maintaining\n * full observability in production.\n */\nconst IS_PRODUCTION = process.env.NODE_ENV === 'production';\nconst IS_DEV = process.env.NODE_ENV === 'development';\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst IS_TEST = process.env.NODE_ENV === 'test';\n\nexport const FEATURE_FLAGS = {\n /** Enable full auto-instrumentation (expensive, production only) */\n ENABLE_AUTO_INSTRUMENTATION:\n IS_PRODUCTION && process.env.autotel_AUTO_INSTRUMENT !== 'false',\n\n /** Enable verbose logging (development only) */\n ENABLE_VERBOSE_LOGGING: IS_DEV || process.env.autotel_VERBOSE === 'true',\n\n /** Enable metrics collection (production only) */\n ENABLE_METRICS_BY_DEFAULT:\n IS_PRODUCTION && process.env.autotel_METRICS !== 'false',\n\n /** Enable async resource detection (production only) */\n ENABLE_RESOURCE_DETECTION:\n IS_PRODUCTION && process.env.autotel_RESOURCE_DETECTION === 'true',\n\n /** Enable tracing in all environments (can be disabled via autotel_TRACING=false) */\n ENABLE_TRACING: process.env.autotel_TRACING !== 'false',\n\n /** Enable log redaction for sensitive fields (can be disabled via autotel_REDACTION=false) */\n ENABLE_REDACTION: process.env.autotel_REDACTION !== 'false',\n} as const;\n\n/**\n * Runtime configuration for OpenTelemetry instrumentation\n *\n * This configures the tracer and meter used by autotel's functional API.\n * Use `configure()` to set custom tracer/meter instances.\n */\nexport interface RuntimeConfig {\n /**\n * Tracer name for OpenTelemetry\n * @default 'app'\n */\n tracerName?: string;\n\n /**\n * Meter name for OpenTelemetry metrics\n * @default 'app'\n */\n meterName?: string;\n\n /**\n * Custom tracer instance (for advanced use cases like Datadog direct)\n * @default trace.getTracer(tracerName)\n */\n tracer?: Tracer;\n\n /**\n * Custom meter instance\n * @default metrics.getMeter(meterName)\n */\n meter?: Meter;\n}\n\n/**\n * Internal configuration state\n */\nclass Config {\n private config: Required<RuntimeConfig> = {\n tracerName: 'app',\n meterName: 'app',\n tracer: getAutotelTracer('app'),\n meter: metrics.getMeter('app'),\n };\n\n /**\n * Get feature flags\n */\n get featureFlags() {\n return FEATURE_FLAGS;\n }\n\n /**\n * Update global configuration\n */\n configure(options: RuntimeConfig): void {\n if (options.tracerName) {\n this.config.tracerName = options.tracerName;\n this.config.tracer = getAutotelTracer(options.tracerName);\n }\n if (options.meterName) {\n this.config.meterName = options.meterName;\n this.config.meter = metrics.getMeter(options.meterName);\n }\n if (options.tracer) {\n this.config.tracer = options.tracer;\n }\n if (options.meter) {\n this.config.meter = options.meter;\n }\n }\n\n /**\n * Get current configuration\n */\n get(): Required<RuntimeConfig> {\n return this.config;\n }\n\n /**\n * Reset to defaults (mainly for testing)\n */\n reset(): void {\n this.config = {\n tracerName: 'app',\n meterName: 'app',\n tracer: trace.getTracer('app'),\n meter: metrics.getMeter('app'),\n };\n }\n}\n\nconst globalConfig = new Config();\n\n/**\n * Configure global instrumentation behavior\n *\n * @example\n * ```typescript\n * import { configure } from 'autotel/config'\n *\n * configure({\n * tracerName: 'my-app'\n * })\n * ```\n */\nexport function configure(options: RuntimeConfig): void {\n globalConfig.configure(options);\n}\n\n/**\n * Get current configuration (internal use)\n */\nexport function getConfig(): Required<RuntimeConfig> & {\n featureFlags: typeof FEATURE_FLAGS;\n} {\n return {\n ...globalConfig.get(),\n featureFlags: FEATURE_FLAGS,\n };\n}\n\n/**\n * Reset configuration to defaults (internal use - mainly for testing)\n */\nexport function resetConfig(): void {\n globalConfig.reset();\n}\n"]}
@@ -1,7 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkIW37CN6L_cjs = require('./chunk-IW37CN6L.cjs');
4
- var chunkG7VZBCD6_cjs = require('./chunk-G7VZBCD6.cjs');
3
+ var chunkYS6C2YJE_cjs = require('./chunk-YS6C2YJE.cjs');
5
4
  var api = require('@opentelemetry/api');
6
5
 
7
6
  var spanNameMap = /* @__PURE__ */ new WeakMap();
@@ -46,7 +45,7 @@ function getActiveSpan() {
46
45
  }
47
46
  function getActiveContext() {
48
47
  try {
49
- const { getActiveContextWithBaggage } = (chunkIW37CN6L_cjs.init_trace_context(), chunkG7VZBCD6_cjs.__toCommonJS(chunkIW37CN6L_cjs.trace_context_exports));
48
+ const { getActiveContextWithBaggage } = chunkYS6C2YJE_cjs.requireModule("./trace-context");
50
49
  return getActiveContextWithBaggage();
51
50
  } catch {
52
51
  return api.context.active();
@@ -122,5 +121,5 @@ exports.getTracer = getTracer;
122
121
  exports.isTracing = isTracing;
123
122
  exports.runWithSpan = runWithSpan;
124
123
  exports.setSpanName = setSpanName;
125
- //# sourceMappingURL=chunk-2EHB2KXS.cjs.map
126
- //# sourceMappingURL=chunk-2EHB2KXS.cjs.map
124
+ //# sourceMappingURL=chunk-5PZZHX4Y.cjs.map
125
+ //# sourceMappingURL=chunk-5PZZHX4Y.cjs.map