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.
- package/README.md +58 -27
- package/dist/auto.cjs +11 -10
- package/dist/auto.cjs.map +1 -1
- package/dist/auto.js +9 -8
- package/dist/auto.js.map +1 -1
- package/dist/{chunk-DPP5Y5XN.cjs → chunk-2EKAKQUG.cjs} +4 -4
- package/dist/{chunk-DPP5Y5XN.cjs.map → chunk-2EKAKQUG.cjs.map} +1 -1
- package/dist/chunk-33WTKH7X.js +21 -0
- package/dist/chunk-33WTKH7X.js.map +1 -0
- package/dist/{chunk-W7LHZVQF.js → chunk-4F5YVTKZ.js} +3 -3
- package/dist/{chunk-W7LHZVQF.js.map → chunk-4F5YVTKZ.js.map} +1 -1
- package/dist/{chunk-KVGNW3FC.js → chunk-4XKOSC37.js} +2 -2
- package/dist/{chunk-KVGNW3FC.js.map → chunk-4XKOSC37.js.map} +1 -1
- package/dist/{chunk-2EHB2KXS.cjs → chunk-5PZZHX4Y.cjs} +4 -5
- package/dist/chunk-5PZZHX4Y.cjs.map +1 -0
- package/dist/{chunk-CMWDPNRB.cjs → chunk-6T2EJMZG.cjs} +52 -6
- package/dist/chunk-6T2EJMZG.cjs.map +1 -0
- package/dist/{chunk-DAAQPYSZ.cjs → chunk-ATLM4S6S.cjs} +70 -70
- package/dist/chunk-ATLM4S6S.cjs.map +1 -0
- package/dist/{chunk-UZJWNPKT.js → chunk-B4Z26USW.js} +7 -7
- package/dist/chunk-B4Z26USW.js.map +1 -0
- package/dist/chunk-DGUM43GV.js +10 -0
- package/dist/{chunk-Z6ZWNWWR.js.map → chunk-DGUM43GV.js.map} +1 -1
- package/dist/{chunk-4UPIZO3A.cjs → chunk-ELIWLU7M.cjs} +90 -145
- package/dist/chunk-ELIWLU7M.cjs.map +1 -0
- package/dist/{chunk-4Y4HD36J.js → chunk-F4BQHYU2.js} +132 -3
- package/dist/chunk-F4BQHYU2.js.map +1 -0
- package/dist/{chunk-Y4Y2S7BM.cjs → chunk-HA4UB3LG.cjs} +2 -2
- package/dist/{chunk-Y4Y2S7BM.cjs.map → chunk-HA4UB3LG.cjs.map} +1 -1
- package/dist/{chunk-AXCCOSA3.js → chunk-HJPXNUZR.js} +4 -5
- package/dist/chunk-HJPXNUZR.js.map +1 -0
- package/dist/chunk-JEQ2X3Z6.cjs +12 -0
- package/dist/{chunk-G7VZBCD6.cjs.map → chunk-JEQ2X3Z6.cjs.map} +1 -1
- package/dist/{chunk-644YVKCS.js → chunk-KHPARJOH.js} +43 -43
- package/dist/chunk-KHPARJOH.js.map +1 -0
- package/dist/{chunk-2LNRY4QK.js → chunk-LBTNNJ7I.js} +3 -3
- package/dist/{chunk-2LNRY4QK.js.map → chunk-LBTNNJ7I.js.map} +1 -1
- package/dist/{chunk-NC52UBR2.cjs → chunk-LP2P3RP5.cjs} +4 -4
- package/dist/{chunk-NC52UBR2.cjs.map → chunk-LP2P3RP5.cjs.map} +1 -1
- package/dist/{chunk-NKD4E6ZV.cjs → chunk-MLXWX5OT.cjs} +138 -9
- package/dist/chunk-MLXWX5OT.cjs.map +1 -0
- package/dist/{chunk-W3253FGB.cjs → chunk-OAS5IIYE.cjs} +4 -4
- package/dist/{chunk-W3253FGB.cjs.map → chunk-OAS5IIYE.cjs.map} +1 -1
- package/dist/{chunk-EKU6O7WG.js → chunk-P3GQ2CGY.js} +52 -6
- package/dist/chunk-P3GQ2CGY.js.map +1 -0
- package/dist/{chunk-7PSUYBV3.cjs → chunk-QMYK3TWB.cjs} +11 -11
- package/dist/chunk-QMYK3TWB.cjs.map +1 -0
- package/dist/{chunk-YHW3MAS7.js → chunk-SR35DG5A.js} +4 -17
- package/dist/chunk-SR35DG5A.js.map +1 -0
- package/dist/{chunk-NGEG2JQ5.js → chunk-TQ3DJJ3N.js} +3 -3
- package/dist/{chunk-NGEG2JQ5.js.map → chunk-TQ3DJJ3N.js.map} +1 -1
- package/dist/{chunk-IW37CN6L.cjs → chunk-W4EUTSB2.cjs} +3 -18
- package/dist/chunk-W4EUTSB2.cjs.map +1 -0
- package/dist/{chunk-WDFFOBJA.js → chunk-YJBSLU3K.js} +89 -144
- package/dist/chunk-YJBSLU3K.js.map +1 -0
- package/dist/chunk-YS6C2YJE.cjs +25 -0
- package/dist/chunk-YS6C2YJE.cjs.map +1 -0
- package/dist/config.cjs +6 -6
- package/dist/config.d.cts +8 -5
- package/dist/config.d.ts +8 -5
- package/dist/config.js +2 -2
- package/dist/db.cjs +4 -4
- package/dist/db.js +2 -2
- package/dist/decorators.cjs +11 -12
- package/dist/decorators.cjs.map +1 -1
- package/dist/decorators.js +9 -10
- package/dist/decorators.js.map +1 -1
- package/dist/event-subscriber.d.cts +39 -1
- package/dist/event-subscriber.d.ts +39 -1
- package/dist/event-testing.cjs +1 -1
- package/dist/event-testing.js +1 -1
- package/dist/event.cjs +10 -9
- package/dist/event.d.cts +70 -2
- package/dist/event.d.ts +70 -2
- package/dist/event.js +7 -6
- package/dist/exporters.cjs +1 -1
- package/dist/exporters.js +1 -1
- package/dist/functional.cjs +16 -15
- package/dist/functional.d.cts +3 -3
- package/dist/functional.d.ts +3 -3
- package/dist/functional.js +9 -8
- package/dist/http.cjs +6 -7
- package/dist/http.cjs.map +1 -1
- package/dist/http.js +3 -4
- package/dist/http.js.map +1 -1
- package/dist/index.cjs +59 -61
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +17 -20
- package/dist/index.js.map +1 -1
- package/dist/{init-C5wVWc6Y.d.cts → init-iPJE1d2N.d.cts} +110 -52
- package/dist/{init-DhU1oVys.d.ts → init-inG_x7Zr.d.ts} +110 -52
- package/dist/instrumentation.cjs +15 -14
- package/dist/instrumentation.cjs.map +1 -1
- package/dist/instrumentation.d.cts +2 -2
- package/dist/instrumentation.d.ts +2 -2
- package/dist/instrumentation.js +8 -7
- package/dist/instrumentation.js.map +1 -1
- package/dist/logger.cjs +10 -10
- package/dist/logger.js +3 -3
- package/dist/metric-helpers.cjs +8 -8
- package/dist/metric-helpers.js +3 -3
- package/dist/metric-testing.cjs +1 -1
- package/dist/metric-testing.js +1 -1
- package/dist/metric.cjs +7 -7
- package/dist/metric.js +4 -4
- package/dist/processors.cjs +1 -1
- package/dist/processors.js +1 -1
- package/dist/register.cjs +2 -6
- package/dist/register.cjs.map +1 -1
- package/dist/register.d.cts +1 -29
- package/dist/register.d.ts +1 -29
- package/dist/register.js +2 -6
- package/dist/register.js.map +1 -1
- package/dist/sampling.cjs +3 -3
- package/dist/sampling.js +3 -3
- package/dist/semantic-helpers.cjs +14 -13
- package/dist/semantic-helpers.d.cts +9 -9
- package/dist/semantic-helpers.d.ts +9 -9
- package/dist/semantic-helpers.js +10 -9
- package/dist/tail-sampling-processor.cjs +1 -1
- package/dist/tail-sampling-processor.js +1 -1
- package/dist/testing.cjs +4 -4
- package/dist/testing.js +3 -3
- package/dist/trace-helpers.cjs +14 -14
- package/dist/trace-helpers.js +3 -3
- package/dist/tracer-provider.cjs +1 -1
- package/dist/tracer-provider.js +1 -1
- package/dist/yaml-config.cjs +10 -5
- package/dist/yaml-config.d.cts +2 -2
- package/dist/yaml-config.d.ts +2 -2
- package/dist/yaml-config.js +7 -2
- package/package.json +11 -31
- package/src/auto.ts +14 -11
- package/src/baggage-span-processor.ts +4 -2
- package/src/config.ts +10 -7
- package/src/env-config.test.ts +2 -2
- package/src/env-config.ts +2 -2
- package/src/event-subscriber.ts +48 -0
- package/src/event.ts +154 -0
- package/src/functional.ts +42 -39
- package/src/init.customization.test.ts +1 -1
- package/src/init.integrations.test.ts +37 -23
- package/src/init.openllmetry.test.ts +1 -1
- package/src/init.ts +180 -287
- package/src/instrumentation.ts +8 -6
- package/src/node-require.ts +74 -0
- package/src/register.ts +15 -19
- package/src/semantic-helpers.test.ts +3 -3
- package/src/semantic-helpers.ts +13 -13
- package/src/trace-helpers.ts +4 -2
- package/src/yaml-config.test.ts +11 -11
- package/src/yaml-config.ts +64 -9
- package/dist/chunk-2EHB2KXS.cjs.map +0 -1
- package/dist/chunk-4UPIZO3A.cjs.map +0 -1
- package/dist/chunk-4Y4HD36J.js.map +0 -1
- package/dist/chunk-644YVKCS.js.map +0 -1
- package/dist/chunk-7PSUYBV3.cjs.map +0 -1
- package/dist/chunk-AXCCOSA3.js.map +0 -1
- package/dist/chunk-CMWDPNRB.cjs.map +0 -1
- package/dist/chunk-DAAQPYSZ.cjs.map +0 -1
- package/dist/chunk-EKU6O7WG.js.map +0 -1
- package/dist/chunk-G7VZBCD6.cjs +0 -35
- package/dist/chunk-IW37CN6L.cjs.map +0 -1
- package/dist/chunk-NKD4E6ZV.cjs.map +0 -1
- package/dist/chunk-UZJWNPKT.js.map +0 -1
- package/dist/chunk-WDFFOBJA.js.map +0 -1
- package/dist/chunk-YHW3MAS7.js.map +0 -1
- 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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
- `
|
|
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
|
-
- `
|
|
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
|
-
|
|
771
|
+
autoInstrumentations: ['http', 'express', 'pino'],
|
|
772
772
|
instrumentations: [new HttpInstrumentation()],
|
|
773
|
-
|
|
773
|
+
headers: 'Authorization=Basic ...',
|
|
774
774
|
subscribers: [new PostHogSubscriber({ apiKey: 'phc_xxx' })],
|
|
775
775
|
});
|
|
776
776
|
```
|
|
777
777
|
|
|
778
|
-
### ⚠️
|
|
778
|
+
### ⚠️ autoInstrumentations vs. Manual Instrumentations
|
|
779
779
|
|
|
780
|
-
When using both `
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
**
|
|
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 (
|
|
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
|
-
|
|
883
|
+
OTEL_SERVICE_NAME=my-app tsx --import autotel/auto src/index.ts
|
|
855
884
|
```
|
|
856
885
|
|
|
857
|
-
|
|
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.
|
|
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 `
|
|
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
|
-
|
|
896
|
-
|
|
897
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1341
|
-
|
|
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 `
|
|
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
|
|
4
|
-
var
|
|
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-
|
|
8
|
-
require('./chunk-
|
|
8
|
+
require('./chunk-2EKAKQUG.cjs');
|
|
9
|
+
require('./chunk-HA4UB3LG.cjs');
|
|
9
10
|
require('./chunk-URRW6M2C.cjs');
|
|
10
|
-
require('./chunk-
|
|
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 =
|
|
18
|
-
var
|
|
19
|
-
var
|
|
20
|
-
|
|
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
|
-
|
|
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":"
|
|
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-
|
|
2
|
-
import { loadYamlConfig } from './chunk-
|
|
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-
|
|
6
|
-
import './chunk-
|
|
6
|
+
import './chunk-TQ3DJJ3N.js';
|
|
7
|
+
import './chunk-4XKOSC37.js';
|
|
7
8
|
import './chunk-P6JUDYNO.js';
|
|
8
|
-
import './chunk-
|
|
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
|
|
16
|
-
var
|
|
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
|
-
|
|
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":"
|
|
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
|
|
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 =
|
|
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-
|
|
167
|
-
//# sourceMappingURL=chunk-
|
|
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-
|
|
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-
|
|
26
|
-
//# sourceMappingURL=chunk-
|
|
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-
|
|
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-
|
|
87
|
-
//# sourceMappingURL=chunk-
|
|
86
|
+
//# sourceMappingURL=chunk-4XKOSC37.js.map
|
|
87
|
+
//# sourceMappingURL=chunk-4XKOSC37.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config.ts"],"names":[],"mappings":";;;AAkBA,IAAM,aAAA,GAAgB,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,YAAA;AAC/C,IAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,aAAA;AAExB,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa;AAElC,IAAM,aAAA,GAAgB;AAAA;AAAA,EAE3B,2BAAA,EACE,aAAA,IAAiB,OAAA,CAAQ,GAAA,CAAI,uBAAA,KAA4B,OAAA;AAAA;AAAA,EAG3D,sBAAA,EAAwB,MAAA,IAAU,OAAA,CAAQ,GAAA,CAAI,eAAA,KAAoB,MAAA;AAAA;AAAA,EAGlE,yBAAA,EACE,aAAA,IAAiB,OAAA,CAAQ,GAAA,CAAI,eAAA,KAAoB,OAAA;AAAA;AAAA,EAGnD,yBAAA,EACE,aAAA,IAAiB,OAAA,CAAQ,GAAA,CAAI,0BAAA,KAA+B,MAAA;AAAA;AAAA,EAG9D,cAAA,EAAgB,OAAA,CAAQ,GAAA,CAAI,eAAA,KAAoB,OAAA;AAAA;AAAA,EAGhD,gBAAA,EAAkB,OAAA,CAAQ,GAAA,CAAI,iBAAA,KAAsB;AACtD;
|
|
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
|
|
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 } =
|
|
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-
|
|
126
|
-
//# sourceMappingURL=chunk-
|
|
124
|
+
//# sourceMappingURL=chunk-5PZZHX4Y.cjs.map
|
|
125
|
+
//# sourceMappingURL=chunk-5PZZHX4Y.cjs.map
|