autotel 2.26.3 → 3.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +50 -23
- package/dist/attribute-redacting-processor.cjs +8 -8
- package/dist/attribute-redacting-processor.d.cts +10 -1
- package/dist/attribute-redacting-processor.d.ts +10 -1
- package/dist/attribute-redacting-processor.js +1 -1
- package/dist/attributes.cjs +21 -21
- package/dist/attributes.d.cts +3 -3
- package/dist/attributes.d.ts +3 -3
- package/dist/attributes.js +2 -2
- package/dist/auto.cjs +3 -3
- package/dist/auto.js +2 -2
- package/dist/business-baggage.d.cts +1 -1
- package/dist/business-baggage.d.ts +1 -1
- package/dist/chunk-4P6ZOARG.cjs +33 -0
- package/dist/chunk-4P6ZOARG.cjs.map +1 -0
- package/dist/{chunk-U54FTVFH.js → chunk-52PUSFC2.js} +3 -3
- package/dist/{chunk-U54FTVFH.js.map → chunk-52PUSFC2.js.map} +1 -1
- package/dist/{chunk-YEVCD6DR.cjs → chunk-7SMNC4LS.cjs} +7 -7
- package/dist/{chunk-YEVCD6DR.cjs.map → chunk-7SMNC4LS.cjs.map} +1 -1
- package/dist/{chunk-563EL6O6.cjs → chunk-BPO2PQ3T.cjs} +12 -8
- package/dist/chunk-BPO2PQ3T.cjs.map +1 -0
- package/dist/{chunk-WZOKY3PW.cjs → chunk-DAZ7EGR4.cjs} +19 -19
- package/dist/{chunk-WZOKY3PW.cjs.map → chunk-DAZ7EGR4.cjs.map} +1 -1
- package/dist/{chunk-ER43K7ES.js → chunk-DDXIUZEG.js} +3 -3
- package/dist/{chunk-ER43K7ES.js.map → chunk-DDXIUZEG.js.map} +1 -1
- package/dist/{chunk-JKIMEPI2.cjs → chunk-DQ2SUROF.cjs} +4 -4
- package/dist/{chunk-JKIMEPI2.cjs.map → chunk-DQ2SUROF.cjs.map} +1 -1
- package/dist/{chunk-B3ZHLLMP.js → chunk-DSMSIVTG.js} +2 -2
- package/dist/chunk-DSMSIVTG.js.map +1 -0
- package/dist/{chunk-OBWXM4NN.cjs → chunk-HKZHUGGN.cjs} +15 -14
- package/dist/chunk-HKZHUGGN.cjs.map +1 -0
- package/dist/{chunk-TDNKIHKT.js → chunk-JVWJDHDB.js} +13 -4
- package/dist/chunk-JVWJDHDB.js.map +1 -0
- package/dist/{chunk-YN7USLHW.js → chunk-K7HSRLP5.js} +11 -10
- package/dist/chunk-K7HSRLP5.js.map +1 -0
- package/dist/chunk-KIL5CUN6.js +31 -0
- package/dist/chunk-KIL5CUN6.js.map +1 -0
- package/dist/chunk-KKGM42RQ.cjs +1207 -0
- package/dist/chunk-KKGM42RQ.cjs.map +1 -0
- package/dist/{chunk-6YGUN7IY.cjs → chunk-MOO75VE4.cjs} +18 -17
- package/dist/chunk-MOO75VE4.cjs.map +1 -0
- package/dist/{chunk-GML3FBOT.cjs → chunk-NCSMD3TK.cjs} +2 -2
- package/dist/chunk-NCSMD3TK.cjs.map +1 -0
- package/dist/{chunk-CMNGGTQL.cjs → chunk-NXLRY2CE.cjs} +13 -4
- package/dist/chunk-NXLRY2CE.cjs.map +1 -0
- package/dist/{chunk-BJ2XPN77.js → chunk-OM4OSBOP.js} +5 -5
- package/dist/{chunk-BJ2XPN77.js.map → chunk-OM4OSBOP.js.map} +1 -1
- package/dist/{chunk-HPUGKUMZ.js → chunk-PMRWMRXY.js} +13 -640
- package/dist/chunk-PMRWMRXY.js.map +1 -0
- package/dist/{chunk-UTZR7P7E.cjs → chunk-QPH5ZKP5.cjs} +43 -673
- package/dist/chunk-QPH5ZKP5.cjs.map +1 -0
- package/dist/chunk-SEO6NAQT.js +14 -0
- package/dist/chunk-SEO6NAQT.js.map +1 -0
- package/dist/{chunk-QC5MNKVF.js → chunk-TFRZOUTV.js} +13 -12
- package/dist/chunk-TFRZOUTV.js.map +1 -0
- package/dist/chunk-VQTCQKHQ.cjs +17 -0
- package/dist/chunk-VQTCQKHQ.cjs.map +1 -0
- package/dist/chunk-Z7VAOK5X.js +1183 -0
- package/dist/chunk-Z7VAOK5X.js.map +1 -0
- package/dist/{chunk-W35FVJBC.js → chunk-ZDPIWKWD.js} +9 -5
- package/dist/chunk-ZDPIWKWD.js.map +1 -0
- package/dist/correlation-id.cjs +22 -10
- package/dist/correlation-id.js +14 -2
- package/dist/decorators.cjs +7 -8
- package/dist/decorators.cjs.map +1 -1
- package/dist/decorators.d.cts +1 -1
- package/dist/decorators.d.ts +1 -1
- package/dist/decorators.js +6 -7
- package/dist/decorators.js.map +1 -1
- package/dist/event.cjs +8 -9
- package/dist/event.js +5 -6
- package/dist/functional.cjs +13 -14
- package/dist/functional.d.cts +1 -1
- package/dist/functional.d.ts +1 -1
- package/dist/functional.js +6 -7
- package/dist/http.cjs +13 -2
- package/dist/http.cjs.map +1 -1
- package/dist/http.js +12 -1
- package/dist/http.js.map +1 -1
- package/dist/index.cjs +305 -280
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +89 -10
- package/dist/index.d.ts +89 -10
- package/dist/index.js +180 -181
- package/dist/index.js.map +1 -1
- package/dist/instrumentation.cjs +9 -9
- package/dist/instrumentation.js +2 -2
- package/dist/messaging-adapters.d.cts +1 -1
- package/dist/messaging-adapters.d.ts +1 -1
- package/dist/messaging-testing.d.cts +1 -1
- package/dist/messaging-testing.d.ts +1 -1
- package/dist/messaging.cjs +11 -11
- package/dist/messaging.d.cts +1 -1
- package/dist/messaging.d.ts +1 -1
- package/dist/messaging.js +8 -8
- package/dist/semantic-helpers.cjs +11 -12
- package/dist/semantic-helpers.d.cts +1 -1
- package/dist/semantic-helpers.d.ts +1 -1
- package/dist/semantic-helpers.js +7 -8
- package/dist/{trace-context-t5X1AP-e.d.cts → trace-context-DbGKd1Rn.d.cts} +18 -5
- package/dist/{trace-context-t5X1AP-e.d.ts → trace-context-DbGKd1Rn.d.ts} +18 -5
- package/dist/trace-helpers.cjs +13 -13
- package/dist/trace-helpers.d.cts +2 -2
- package/dist/trace-helpers.d.ts +2 -2
- package/dist/trace-helpers.js +1 -1
- package/dist/{utils-CbUkl8r1.d.cts → utils-BahBCFtJ.d.cts} +1 -1
- package/dist/{utils-Buel3cj0.d.ts → utils-CLKwaUlG.d.ts} +1 -1
- package/dist/webhook.cjs +21 -12
- package/dist/webhook.cjs.map +1 -1
- package/dist/webhook.d.cts +1 -1
- package/dist/webhook.d.ts +1 -1
- package/dist/webhook.js +20 -11
- package/dist/webhook.js.map +1 -1
- package/dist/workflow-distributed.cjs +25 -21
- package/dist/workflow-distributed.cjs.map +1 -1
- package/dist/workflow-distributed.d.cts +1 -1
- package/dist/workflow-distributed.d.ts +1 -1
- package/dist/workflow-distributed.js +23 -19
- package/dist/workflow-distributed.js.map +1 -1
- package/dist/workflow.cjs +12 -12
- package/dist/workflow.d.cts +1 -1
- package/dist/workflow.d.ts +1 -1
- package/dist/workflow.js +8 -8
- package/package.json +43 -45
- package/skills/analyze-traces/SKILL.md +178 -0
- package/skills/autotel-core/SKILL.md +2 -7
- package/skills/autotel-events/SKILL.md +2 -6
- package/skills/autotel-frameworks/SKILL.md +2 -9
- package/skills/autotel-instrumentation/SKILL.md +2 -7
- package/skills/autotel-request-logging/SKILL.md +2 -8
- package/skills/autotel-structured-errors/SKILL.md +2 -7
- package/skills/build-audit-trails/SKILL.md +302 -0
- package/skills/debug-missing-spans/SKILL.md +248 -0
- package/skills/migrate-to-autotel/SKILL.md +268 -0
- package/skills/review-otel-patterns/SKILL.md +488 -0
- package/skills/review-otel-patterns/references/code-review.md +75 -0
- package/skills/review-otel-patterns/references/processor-pipeline.md +205 -0
- package/skills/review-otel-patterns/references/structured-errors.md +102 -0
- package/skills/review-otel-patterns/references/wide-spans.md +85 -0
- package/skills/tune-sampling/SKILL.md +210 -0
- package/src/attribute-redacting-processor.test.ts +6 -4
- package/src/attribute-redacting-processor.ts +11 -2
- package/src/correlated-events.test.ts +151 -0
- package/src/correlated-events.ts +47 -0
- package/src/drain-toolkit.test.ts +113 -0
- package/src/drain-toolkit.ts +129 -0
- package/src/enricher-toolkit.test.ts +67 -0
- package/src/enricher-toolkit.ts +79 -0
- package/src/functional.ts +2 -0
- package/src/gen-ai-events.ts +14 -5
- package/src/index.ts +39 -4
- package/src/messaging.ts +10 -9
- package/src/redact-values.test.ts +24 -10
- package/src/redact-values.ts +9 -2
- package/src/request-logger.test.ts +91 -0
- package/src/request-logger.ts +40 -5
- package/src/structured-error.test.ts +86 -1
- package/src/structured-error.ts +9 -2
- package/src/trace-context.ts +39 -11
- package/src/trace-helpers.ts +2 -2
- package/src/trace-hybrid.test.ts +42 -0
- package/src/trace-hybrid.ts +37 -0
- package/src/webhook.ts +16 -7
- package/src/workflow-distributed.ts +18 -13
- package/src/workflow.ts +7 -6
- package/bin/intent.js +0 -6
- package/dist/chunk-563EL6O6.cjs.map +0 -1
- package/dist/chunk-6YGUN7IY.cjs.map +0 -1
- package/dist/chunk-B3ZHLLMP.js.map +0 -1
- package/dist/chunk-BBBWDIYQ.js +0 -211
- package/dist/chunk-BBBWDIYQ.js.map +0 -1
- package/dist/chunk-CMNGGTQL.cjs.map +0 -1
- package/dist/chunk-D5LMF53P.cjs +0 -150
- package/dist/chunk-D5LMF53P.cjs.map +0 -1
- package/dist/chunk-GML3FBOT.cjs.map +0 -1
- package/dist/chunk-HPUGKUMZ.js.map +0 -1
- package/dist/chunk-HZ3FYBJG.cjs +0 -217
- package/dist/chunk-HZ3FYBJG.cjs.map +0 -1
- package/dist/chunk-JSNUWSBH.cjs +0 -62
- package/dist/chunk-JSNUWSBH.cjs.map +0 -1
- package/dist/chunk-OBWXM4NN.cjs.map +0 -1
- package/dist/chunk-QC5MNKVF.js.map +0 -1
- package/dist/chunk-S4OFEXLA.js +0 -53
- package/dist/chunk-S4OFEXLA.js.map +0 -1
- package/dist/chunk-TDNKIHKT.js.map +0 -1
- package/dist/chunk-UTZR7P7E.cjs.map +0 -1
- package/dist/chunk-W35FVJBC.js.map +0 -1
- package/dist/chunk-WD4RP6IV.js +0 -146
- package/dist/chunk-WD4RP6IV.js.map +0 -1
- package/dist/chunk-YN7USLHW.js.map +0 -1
- package/src/package-manifest.test.ts +0 -24
package/dist/correlation-id.cjs
CHANGED
|
@@ -1,42 +1,54 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
require('./chunk-
|
|
3
|
+
var chunkKKGM42RQ_cjs = require('./chunk-KKGM42RQ.cjs');
|
|
4
|
+
require('./chunk-BPO2PQ3T.cjs');
|
|
5
|
+
require('./chunk-OC6X2VIN.cjs');
|
|
6
|
+
require('./chunk-CEAQK2QY.cjs');
|
|
7
|
+
require('./chunk-ZNMBW67B.cjs');
|
|
8
|
+
require('./chunk-IOYFAFHJ.cjs');
|
|
9
|
+
require('./chunk-NXLRY2CE.cjs');
|
|
10
|
+
require('./chunk-CU6IDACR.cjs');
|
|
11
|
+
require('./chunk-6S5RUKU3.cjs');
|
|
12
|
+
require('./chunk-YS6C2YJE.cjs');
|
|
13
|
+
require('./chunk-VH77IPJN.cjs');
|
|
14
|
+
require('./chunk-FU6R566Y.cjs');
|
|
15
|
+
require('./chunk-ESLWRGAG.cjs');
|
|
16
|
+
require('./chunk-YREV3LGG.cjs');
|
|
5
17
|
require('./chunk-JEQ2X3Z6.cjs');
|
|
6
18
|
|
|
7
19
|
|
|
8
20
|
|
|
9
21
|
Object.defineProperty(exports, "CORRELATION_ID_BAGGAGE_KEY", {
|
|
10
22
|
enumerable: true,
|
|
11
|
-
get: function () { return
|
|
23
|
+
get: function () { return chunkKKGM42RQ_cjs.CORRELATION_ID_BAGGAGE_KEY; }
|
|
12
24
|
});
|
|
13
25
|
Object.defineProperty(exports, "generateCorrelationId", {
|
|
14
26
|
enumerable: true,
|
|
15
|
-
get: function () { return
|
|
27
|
+
get: function () { return chunkKKGM42RQ_cjs.generateCorrelationId; }
|
|
16
28
|
});
|
|
17
29
|
Object.defineProperty(exports, "getCorrelationId", {
|
|
18
30
|
enumerable: true,
|
|
19
|
-
get: function () { return
|
|
31
|
+
get: function () { return chunkKKGM42RQ_cjs.getCorrelationId; }
|
|
20
32
|
});
|
|
21
33
|
Object.defineProperty(exports, "getCorrelationStorage", {
|
|
22
34
|
enumerable: true,
|
|
23
|
-
get: function () { return
|
|
35
|
+
get: function () { return chunkKKGM42RQ_cjs.getCorrelationStorage; }
|
|
24
36
|
});
|
|
25
37
|
Object.defineProperty(exports, "getOrCreateCorrelationId", {
|
|
26
38
|
enumerable: true,
|
|
27
|
-
get: function () { return
|
|
39
|
+
get: function () { return chunkKKGM42RQ_cjs.getOrCreateCorrelationId; }
|
|
28
40
|
});
|
|
29
41
|
Object.defineProperty(exports, "runWithCorrelationId", {
|
|
30
42
|
enumerable: true,
|
|
31
|
-
get: function () { return
|
|
43
|
+
get: function () { return chunkKKGM42RQ_cjs.runWithCorrelationId; }
|
|
32
44
|
});
|
|
33
45
|
Object.defineProperty(exports, "setCorrelationId", {
|
|
34
46
|
enumerable: true,
|
|
35
|
-
get: function () { return
|
|
47
|
+
get: function () { return chunkKKGM42RQ_cjs.setCorrelationId; }
|
|
36
48
|
});
|
|
37
49
|
Object.defineProperty(exports, "setCorrelationIdInBaggage", {
|
|
38
50
|
enumerable: true,
|
|
39
|
-
get: function () { return
|
|
51
|
+
get: function () { return chunkKKGM42RQ_cjs.setCorrelationIdInBaggage; }
|
|
40
52
|
});
|
|
41
53
|
//# sourceMappingURL=correlation-id.cjs.map
|
|
42
54
|
//# sourceMappingURL=correlation-id.cjs.map
|
package/dist/correlation-id.js
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
|
-
export { CORRELATION_ID_BAGGAGE_KEY, generateCorrelationId, getCorrelationId, getCorrelationStorage, getOrCreateCorrelationId, runWithCorrelationId, setCorrelationId, setCorrelationIdInBaggage } from './chunk-
|
|
2
|
-
import './chunk-
|
|
1
|
+
export { CORRELATION_ID_BAGGAGE_KEY, generateCorrelationId, getCorrelationId, getCorrelationStorage, getOrCreateCorrelationId, runWithCorrelationId, setCorrelationId, setCorrelationIdInBaggage } from './chunk-Z7VAOK5X.js';
|
|
2
|
+
import './chunk-ZDPIWKWD.js';
|
|
3
|
+
import './chunk-3SDILILG.js';
|
|
4
|
+
import './chunk-A4E5AQFK.js';
|
|
5
|
+
import './chunk-WGWSHJ2N.js';
|
|
6
|
+
import './chunk-GYR5K654.js';
|
|
7
|
+
import './chunk-JVWJDHDB.js';
|
|
8
|
+
import './chunk-6UQRVUN3.js';
|
|
9
|
+
import './chunk-3QXBFGKP.js';
|
|
10
|
+
import './chunk-33WTKH7X.js';
|
|
11
|
+
import './chunk-DPSA4QLA.js';
|
|
12
|
+
import './chunk-55ER2KD5.js';
|
|
13
|
+
import './chunk-J5QENANM.js';
|
|
14
|
+
import './chunk-HA2WBOGQ.js';
|
|
3
15
|
import './chunk-DGUM43GV.js';
|
|
4
16
|
//# sourceMappingURL=correlation-id.js.map
|
|
5
17
|
//# sourceMappingURL=correlation-id.js.map
|
package/dist/decorators.cjs
CHANGED
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
require('./chunk-
|
|
4
|
-
require('./chunk-
|
|
5
|
-
require('./chunk-
|
|
6
|
-
require('./chunk-
|
|
7
|
-
|
|
8
|
-
require('./chunk-563EL6O6.cjs');
|
|
3
|
+
require('./chunk-QPH5ZKP5.cjs');
|
|
4
|
+
require('./chunk-NCSMD3TK.cjs');
|
|
5
|
+
require('./chunk-VQTCQKHQ.cjs');
|
|
6
|
+
var chunkKKGM42RQ_cjs = require('./chunk-KKGM42RQ.cjs');
|
|
7
|
+
require('./chunk-BPO2PQ3T.cjs');
|
|
9
8
|
require('./chunk-OC6X2VIN.cjs');
|
|
10
9
|
require('./chunk-CEAQK2QY.cjs');
|
|
11
10
|
require('./chunk-ZNMBW67B.cjs');
|
|
12
11
|
require('./chunk-IOYFAFHJ.cjs');
|
|
13
|
-
require('./chunk-
|
|
12
|
+
require('./chunk-NXLRY2CE.cjs');
|
|
14
13
|
require('./chunk-CU6IDACR.cjs');
|
|
15
14
|
require('./chunk-6S5RUKU3.cjs');
|
|
16
15
|
require('./chunk-YS6C2YJE.cjs');
|
|
@@ -37,7 +36,7 @@ function Trace(nameOrOptions, maybeOptions) {
|
|
|
37
36
|
const tracer = config.tracer;
|
|
38
37
|
return tracer.startActiveSpan(spanName, async (span) => {
|
|
39
38
|
try {
|
|
40
|
-
const ctx =
|
|
39
|
+
const ctx = chunkKKGM42RQ_cjs.createTraceContext(span);
|
|
41
40
|
const originalCtx = this.ctx;
|
|
42
41
|
try {
|
|
43
42
|
this.ctx = ctx;
|
package/dist/decorators.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/decorators.ts"],"names":["getConfig","createTraceContext","SpanStatusCode"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/decorators.ts"],"names":["getConfig","createTraceContext","SpanStatusCode"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAmGO,SAAS,KAAA,CACd,eACA,YAAA,EAIK;AAEL,EAAA,MAAM,IAAA,GACJ,OAAO,aAAA,KAAkB,QAAA,GAAW,gBAAgB,aAAA,EAAe,IAAA;AASrE,EAAA,OAAO,SACL,gBACA,OAAA,EACG;AACH,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA;AAKtC,IAAA,MAAM,SAAA,GAAY,cAAA,EAAgB,QAAA,EAAS,IAAK,EAAA;AAChD,IAAA,MAAM,UACJ,cAAA,KACC,cAAA,CAAe,aAAa,IAAA,KAAS,eAAA,IACpC,UAAU,IAAA,EAAK,CAAE,UAAA,CAAW,QAAQ,KACnC,SAAA,CAAU,QAAA,CAAS,eAAe,CAAA,IAAK,SAAA,CAAU,SAAS,OAAO,CAAA;AAAA,IAElE,UAAA,CAAW,KAAK,SAAS,CAAA,CAAA;AAE7B,IAAA,IAAI,CAAC,OAAA,EAAS;AAEZ,MAAA,OAAO,cAAA;AAAA,IACT;AAEA,IAAA,MAAM,WAAW,IAAA,IAAQ,UAAA;AAEzB,IAAA,OAAO,kBAEF,IAAA,EACe;AAClB,MAAA,MAAM,SAASA,2BAAA,EAAU;AACzB,MAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AAEtB,MAAA,OAAO,MAAA,CAAO,eAAA,CAAgB,QAAA,EAAU,OAAO,IAAA,KAAS;AACtD,QAAA,IAAI;AAEF,UAAA,MAAM,GAAA,GAAoBC,qCAAmB,IAAI,CAAA;AAEjD,UAAA,MAAM,cAAe,IAAA,CAAgC,GAAA;AACrD,UAAA,IAAI;AACF,YAAC,KAAgC,GAAA,GAAM,GAAA;AACvC,YAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,KAAA,CAAM,MAAM,IAAU,CAAA;AAC1D,YAAA,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAMC,kBAAA,CAAe,IAAI,CAAA;AAC1C,YAAA,OAAO,MAAA;AAAA,UACT,CAAA,SAAE;AAEA,YAAA,IAAI,gBAAgB,KAAA,CAAA,EAAW;AAC7B,cAAA,OAAQ,IAAA,CAAgC,GAAA;AAAA,YAC1C,CAAA,MAAO;AACL,cAAC,KAAgC,GAAA,GAAM,WAAA;AAAA,YACzC;AAAA,UACF;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,IAAA,CAAK,SAAA,CAAU;AAAA,YACb,MAAMA,kBAAA,CAAe,KAAA;AAAA,YACrB,OAAA,EAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,WACnD,CAAA;AACD,UAAA,IAAA,CAAK,eAAA;AAAA,YACH,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC;AAAA,WAC1D;AACA,UAAA,MAAM,KAAA;AAAA,QACR,CAAA,SAAE;AACA,UAAA,IAAA,CAAK,GAAA,EAAI;AAAA,QACX;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,EACF,CAAA;AACF","file":"decorators.cjs","sourcesContent":["/**\n * TypeScript 5+ Decorators for autotel\n *\n * Provides @Trace decorator for class-based code.\n *\n * **Requires TypeScript 5.0+**\n *\n * @example Method decorator\n * ```typescript\n * import { Trace } from 'autotel/decorators'\n *\n * class OrderService {\n * @Trace('order.create', { withMetrics: true })\n * async createOrder(data: OrderData) {\n * return await db.orders.create(data)\n * }\n *\n * @Trace() // Uses method name as span name\n * async processPayment(orderId: string) {\n * return await stripe.charge(orderId)\n * }\n * }\n * ```\n */\n\nimport type { TracingOptions, TraceContext } from './functional';\nimport { getConfig } from './config';\nimport { SpanStatusCode } from '@opentelemetry/api';\nimport { createTraceContext } from './trace-context';\n\n/**\n * Options for @Trace method decorator\n */\nexport interface TraceDecoratorOptions extends Omit<TracingOptions, 'name'> {\n /**\n * Custom span name. If not provided, uses the method name.\n */\n name?: string;\n}\n\n/**\n * @Trace - Method decorator for fine-grained tracing\n *\n * Wraps a class method with automatic tracing. Supports both patterns:\n * - Simple: method doesn't use ctx\n * - Advanced: method accesses ctx via this.ctx\n *\n * @example Simple usage (no ctx)\n * ```typescript\n * class OrderService {\n * @Trace()\n * async createOrder(data: OrderData) {\n * return await db.orders.create(data)\n * }\n * }\n * ```\n *\n * @example With custom name and options\n * ```typescript\n * class PaymentService {\n * @Trace('payment.charge', { withMetrics: true })\n * async chargeCard(amount: number) {\n * return await stripe.charges.create({ amount })\n * }\n * }\n * ```\n *\n * @example Accessing ctx\n * ```typescript\n * interface WithTraceContext {\n * ctx?: TraceContext\n * }\n *\n * class UserService {\n * @Trace()\n * async createUser(data: UserData) {\n * // Access ctx via this.ctx (available during execution)\n * const ctx = (this as unknown as WithTraceContext).ctx\n * if (ctx) {\n * ctx.setAttribute('user.id', data.id)\n * }\n * return await db.users.create(data)\n * }\n * }\n * ```\n */\nexport function Trace(\n options?: TraceDecoratorOptions,\n): <T extends (...args: unknown[]) => Promise<unknown>>(\n originalMethod: T,\n context: ClassMethodDecoratorContext,\n) => T;\nexport function Trace(\n name?: string,\n options?: TraceDecoratorOptions,\n): <T extends (...args: unknown[]) => Promise<unknown>>(\n originalMethod: T,\n context: ClassMethodDecoratorContext,\n) => T;\nexport function Trace(\n nameOrOptions?: string | TraceDecoratorOptions,\n maybeOptions?: TraceDecoratorOptions,\n): <T extends (...args: unknown[]) => Promise<unknown>>(\n originalMethod: T,\n context: ClassMethodDecoratorContext,\n) => T {\n // Parse arguments\n const name =\n typeof nameOrOptions === 'string' ? nameOrOptions : nameOrOptions?.name;\n // Options are used in the returned decorator function, not here\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const _options: TraceDecoratorOptions =\n typeof nameOrOptions === 'string'\n ? maybeOptions || {}\n : nameOrOptions || {};\n\n // TypeScript 5+ decorator signature\n return function <T extends (...args: unknown[]) => Promise<unknown>>(\n originalMethod: T,\n context: ClassMethodDecoratorContext,\n ): T {\n const methodName = String(context.name);\n\n // Skip if not an async function\n // Check multiple ways to detect async functions (for different transpilation environments)\n // TypeScript decorators run at class definition time, so we need robust detection\n const methodStr = originalMethod?.toString() || '';\n const isAsync =\n originalMethod &&\n (originalMethod.constructor?.name === 'AsyncFunction' ||\n methodStr.trim().startsWith('async ') ||\n (methodStr.includes('[native code]') && methodStr.includes('async')) ||\n // Fallback: if function has async in its string representation\n /async\\s+/.test(methodStr));\n\n if (!isAsync) {\n // Not an async function, return as-is\n return originalMethod;\n }\n\n const spanName = name || methodName;\n\n return async function <This>(\n this: This,\n ...args: unknown[]\n ): Promise<unknown> {\n const config = getConfig();\n const tracer = config.tracer;\n\n return tracer.startActiveSpan(spanName, async (span) => {\n try {\n // Make ctx available via this.ctx for methods that need it\n const ctx: TraceContext = createTraceContext(span);\n\n const originalCtx = (this as { ctx?: TraceContext }).ctx;\n try {\n (this as { ctx?: TraceContext }).ctx = ctx;\n const result = await originalMethod.apply(this, args as []);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } finally {\n // Restore original ctx\n if (originalCtx === undefined) {\n delete (this as { ctx?: TraceContext }).ctx;\n } else {\n (this as { ctx?: TraceContext }).ctx = originalCtx;\n }\n }\n } catch (error) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : 'Unknown error',\n });\n span.recordException(\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n } finally {\n span.end();\n }\n });\n } as T;\n };\n}\n\n// Re-export types for convenience\n\nexport { type TraceContext, type TracingOptions } from './functional';\n"]}
|
package/dist/decorators.d.cts
CHANGED
package/dist/decorators.d.ts
CHANGED
package/dist/decorators.js
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
import './chunk-
|
|
2
|
-
import './chunk-
|
|
3
|
-
import './chunk-
|
|
4
|
-
import './chunk-
|
|
5
|
-
import
|
|
6
|
-
import './chunk-W35FVJBC.js';
|
|
1
|
+
import './chunk-PMRWMRXY.js';
|
|
2
|
+
import './chunk-DSMSIVTG.js';
|
|
3
|
+
import './chunk-SEO6NAQT.js';
|
|
4
|
+
import { createTraceContext } from './chunk-Z7VAOK5X.js';
|
|
5
|
+
import './chunk-ZDPIWKWD.js';
|
|
7
6
|
import './chunk-3SDILILG.js';
|
|
8
7
|
import './chunk-A4E5AQFK.js';
|
|
9
8
|
import './chunk-WGWSHJ2N.js';
|
|
10
9
|
import './chunk-GYR5K654.js';
|
|
11
|
-
import './chunk-
|
|
10
|
+
import './chunk-JVWJDHDB.js';
|
|
12
11
|
import './chunk-6UQRVUN3.js';
|
|
13
12
|
import './chunk-3QXBFGKP.js';
|
|
14
13
|
import './chunk-33WTKH7X.js';
|
package/dist/decorators.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/decorators.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/decorators.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAmGO,SAAS,KAAA,CACd,eACA,YAAA,EAIK;AAEL,EAAA,MAAM,IAAA,GACJ,OAAO,aAAA,KAAkB,QAAA,GAAW,gBAAgB,aAAA,EAAe,IAAA;AASrE,EAAA,OAAO,SACL,gBACA,OAAA,EACG;AACH,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA;AAKtC,IAAA,MAAM,SAAA,GAAY,cAAA,EAAgB,QAAA,EAAS,IAAK,EAAA;AAChD,IAAA,MAAM,UACJ,cAAA,KACC,cAAA,CAAe,aAAa,IAAA,KAAS,eAAA,IACpC,UAAU,IAAA,EAAK,CAAE,UAAA,CAAW,QAAQ,KACnC,SAAA,CAAU,QAAA,CAAS,eAAe,CAAA,IAAK,SAAA,CAAU,SAAS,OAAO,CAAA;AAAA,IAElE,UAAA,CAAW,KAAK,SAAS,CAAA,CAAA;AAE7B,IAAA,IAAI,CAAC,OAAA,EAAS;AAEZ,MAAA,OAAO,cAAA;AAAA,IACT;AAEA,IAAA,MAAM,WAAW,IAAA,IAAQ,UAAA;AAEzB,IAAA,OAAO,kBAEF,IAAA,EACe;AAClB,MAAA,MAAM,SAAS,SAAA,EAAU;AACzB,MAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AAEtB,MAAA,OAAO,MAAA,CAAO,eAAA,CAAgB,QAAA,EAAU,OAAO,IAAA,KAAS;AACtD,QAAA,IAAI;AAEF,UAAA,MAAM,GAAA,GAAoB,mBAAmB,IAAI,CAAA;AAEjD,UAAA,MAAM,cAAe,IAAA,CAAgC,GAAA;AACrD,UAAA,IAAI;AACF,YAAC,KAAgC,GAAA,GAAM,GAAA;AACvC,YAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,KAAA,CAAM,MAAM,IAAU,CAAA;AAC1D,YAAA,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,cAAA,CAAe,IAAI,CAAA;AAC1C,YAAA,OAAO,MAAA;AAAA,UACT,CAAA,SAAE;AAEA,YAAA,IAAI,gBAAgB,KAAA,CAAA,EAAW;AAC7B,cAAA,OAAQ,IAAA,CAAgC,GAAA;AAAA,YAC1C,CAAA,MAAO;AACL,cAAC,KAAgC,GAAA,GAAM,WAAA;AAAA,YACzC;AAAA,UACF;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,IAAA,CAAK,SAAA,CAAU;AAAA,YACb,MAAM,cAAA,CAAe,KAAA;AAAA,YACrB,OAAA,EAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,WACnD,CAAA;AACD,UAAA,IAAA,CAAK,eAAA;AAAA,YACH,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC;AAAA,WAC1D;AACA,UAAA,MAAM,KAAA;AAAA,QACR,CAAA,SAAE;AACA,UAAA,IAAA,CAAK,GAAA,EAAI;AAAA,QACX;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,EACF,CAAA;AACF","file":"decorators.js","sourcesContent":["/**\n * TypeScript 5+ Decorators for autotel\n *\n * Provides @Trace decorator for class-based code.\n *\n * **Requires TypeScript 5.0+**\n *\n * @example Method decorator\n * ```typescript\n * import { Trace } from 'autotel/decorators'\n *\n * class OrderService {\n * @Trace('order.create', { withMetrics: true })\n * async createOrder(data: OrderData) {\n * return await db.orders.create(data)\n * }\n *\n * @Trace() // Uses method name as span name\n * async processPayment(orderId: string) {\n * return await stripe.charge(orderId)\n * }\n * }\n * ```\n */\n\nimport type { TracingOptions, TraceContext } from './functional';\nimport { getConfig } from './config';\nimport { SpanStatusCode } from '@opentelemetry/api';\nimport { createTraceContext } from './trace-context';\n\n/**\n * Options for @Trace method decorator\n */\nexport interface TraceDecoratorOptions extends Omit<TracingOptions, 'name'> {\n /**\n * Custom span name. If not provided, uses the method name.\n */\n name?: string;\n}\n\n/**\n * @Trace - Method decorator for fine-grained tracing\n *\n * Wraps a class method with automatic tracing. Supports both patterns:\n * - Simple: method doesn't use ctx\n * - Advanced: method accesses ctx via this.ctx\n *\n * @example Simple usage (no ctx)\n * ```typescript\n * class OrderService {\n * @Trace()\n * async createOrder(data: OrderData) {\n * return await db.orders.create(data)\n * }\n * }\n * ```\n *\n * @example With custom name and options\n * ```typescript\n * class PaymentService {\n * @Trace('payment.charge', { withMetrics: true })\n * async chargeCard(amount: number) {\n * return await stripe.charges.create({ amount })\n * }\n * }\n * ```\n *\n * @example Accessing ctx\n * ```typescript\n * interface WithTraceContext {\n * ctx?: TraceContext\n * }\n *\n * class UserService {\n * @Trace()\n * async createUser(data: UserData) {\n * // Access ctx via this.ctx (available during execution)\n * const ctx = (this as unknown as WithTraceContext).ctx\n * if (ctx) {\n * ctx.setAttribute('user.id', data.id)\n * }\n * return await db.users.create(data)\n * }\n * }\n * ```\n */\nexport function Trace(\n options?: TraceDecoratorOptions,\n): <T extends (...args: unknown[]) => Promise<unknown>>(\n originalMethod: T,\n context: ClassMethodDecoratorContext,\n) => T;\nexport function Trace(\n name?: string,\n options?: TraceDecoratorOptions,\n): <T extends (...args: unknown[]) => Promise<unknown>>(\n originalMethod: T,\n context: ClassMethodDecoratorContext,\n) => T;\nexport function Trace(\n nameOrOptions?: string | TraceDecoratorOptions,\n maybeOptions?: TraceDecoratorOptions,\n): <T extends (...args: unknown[]) => Promise<unknown>>(\n originalMethod: T,\n context: ClassMethodDecoratorContext,\n) => T {\n // Parse arguments\n const name =\n typeof nameOrOptions === 'string' ? nameOrOptions : nameOrOptions?.name;\n // Options are used in the returned decorator function, not here\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const _options: TraceDecoratorOptions =\n typeof nameOrOptions === 'string'\n ? maybeOptions || {}\n : nameOrOptions || {};\n\n // TypeScript 5+ decorator signature\n return function <T extends (...args: unknown[]) => Promise<unknown>>(\n originalMethod: T,\n context: ClassMethodDecoratorContext,\n ): T {\n const methodName = String(context.name);\n\n // Skip if not an async function\n // Check multiple ways to detect async functions (for different transpilation environments)\n // TypeScript decorators run at class definition time, so we need robust detection\n const methodStr = originalMethod?.toString() || '';\n const isAsync =\n originalMethod &&\n (originalMethod.constructor?.name === 'AsyncFunction' ||\n methodStr.trim().startsWith('async ') ||\n (methodStr.includes('[native code]') && methodStr.includes('async')) ||\n // Fallback: if function has async in its string representation\n /async\\s+/.test(methodStr));\n\n if (!isAsync) {\n // Not an async function, return as-is\n return originalMethod;\n }\n\n const spanName = name || methodName;\n\n return async function <This>(\n this: This,\n ...args: unknown[]\n ): Promise<unknown> {\n const config = getConfig();\n const tracer = config.tracer;\n\n return tracer.startActiveSpan(spanName, async (span) => {\n try {\n // Make ctx available via this.ctx for methods that need it\n const ctx: TraceContext = createTraceContext(span);\n\n const originalCtx = (this as { ctx?: TraceContext }).ctx;\n try {\n (this as { ctx?: TraceContext }).ctx = ctx;\n const result = await originalMethod.apply(this, args as []);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } finally {\n // Restore original ctx\n if (originalCtx === undefined) {\n delete (this as { ctx?: TraceContext }).ctx;\n } else {\n (this as { ctx?: TraceContext }).ctx = originalCtx;\n }\n }\n } catch (error) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : 'Unknown error',\n });\n span.recordException(\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n } finally {\n span.end();\n }\n });\n } as T;\n };\n}\n\n// Re-export types for convenience\n\nexport { type TraceContext, type TracingOptions } from './functional';\n"]}
|
package/dist/event.cjs
CHANGED
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkDAZ7EGR4_cjs = require('./chunk-DAZ7EGR4.cjs');
|
|
4
4
|
require('./chunk-NZ72VDNY.cjs');
|
|
5
5
|
require('./chunk-UY3UYPBZ.cjs');
|
|
6
|
-
require('./chunk-
|
|
7
|
-
require('./chunk-
|
|
8
|
-
require('./chunk-
|
|
9
|
-
require('./chunk-563EL6O6.cjs');
|
|
6
|
+
require('./chunk-VQTCQKHQ.cjs');
|
|
7
|
+
require('./chunk-KKGM42RQ.cjs');
|
|
8
|
+
require('./chunk-BPO2PQ3T.cjs');
|
|
10
9
|
require('./chunk-OC6X2VIN.cjs');
|
|
11
10
|
require('./chunk-CEAQK2QY.cjs');
|
|
12
11
|
require('./chunk-ZNMBW67B.cjs');
|
|
13
12
|
require('./chunk-IOYFAFHJ.cjs');
|
|
14
|
-
require('./chunk-
|
|
13
|
+
require('./chunk-NXLRY2CE.cjs');
|
|
15
14
|
require('./chunk-CU6IDACR.cjs');
|
|
16
15
|
require('./chunk-6S5RUKU3.cjs');
|
|
17
16
|
require('./chunk-YS6C2YJE.cjs');
|
|
@@ -25,15 +24,15 @@ require('./chunk-JEQ2X3Z6.cjs');
|
|
|
25
24
|
|
|
26
25
|
Object.defineProperty(exports, "Event", {
|
|
27
26
|
enumerable: true,
|
|
28
|
-
get: function () { return
|
|
27
|
+
get: function () { return chunkDAZ7EGR4_cjs.Event; }
|
|
29
28
|
});
|
|
30
29
|
Object.defineProperty(exports, "getEvents", {
|
|
31
30
|
enumerable: true,
|
|
32
|
-
get: function () { return
|
|
31
|
+
get: function () { return chunkDAZ7EGR4_cjs.getEvents; }
|
|
33
32
|
});
|
|
34
33
|
Object.defineProperty(exports, "resetEvents", {
|
|
35
34
|
enumerable: true,
|
|
36
|
-
get: function () { return
|
|
35
|
+
get: function () { return chunkDAZ7EGR4_cjs.resetEvents; }
|
|
37
36
|
});
|
|
38
37
|
//# sourceMappingURL=event.cjs.map
|
|
39
38
|
//# sourceMappingURL=event.cjs.map
|
package/dist/event.js
CHANGED
|
@@ -1,15 +1,14 @@
|
|
|
1
|
-
export { Event, getEvents, resetEvents } from './chunk-
|
|
1
|
+
export { Event, getEvents, resetEvents } from './chunk-OM4OSBOP.js';
|
|
2
2
|
import './chunk-LITNXTTT.js';
|
|
3
3
|
import './chunk-BZHG5IZ4.js';
|
|
4
|
-
import './chunk-
|
|
5
|
-
import './chunk-
|
|
6
|
-
import './chunk-
|
|
7
|
-
import './chunk-W35FVJBC.js';
|
|
4
|
+
import './chunk-SEO6NAQT.js';
|
|
5
|
+
import './chunk-Z7VAOK5X.js';
|
|
6
|
+
import './chunk-ZDPIWKWD.js';
|
|
8
7
|
import './chunk-3SDILILG.js';
|
|
9
8
|
import './chunk-A4E5AQFK.js';
|
|
10
9
|
import './chunk-WGWSHJ2N.js';
|
|
11
10
|
import './chunk-GYR5K654.js';
|
|
12
|
-
import './chunk-
|
|
11
|
+
import './chunk-JVWJDHDB.js';
|
|
13
12
|
import './chunk-6UQRVUN3.js';
|
|
14
13
|
import './chunk-3QXBFGKP.js';
|
|
15
14
|
import './chunk-33WTKH7X.js';
|
package/dist/functional.cjs
CHANGED
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
require('./chunk-
|
|
5
|
-
require('./chunk-
|
|
6
|
-
require('./chunk-
|
|
7
|
-
require('./chunk-
|
|
8
|
-
require('./chunk-563EL6O6.cjs');
|
|
3
|
+
var chunkQPH5ZKP5_cjs = require('./chunk-QPH5ZKP5.cjs');
|
|
4
|
+
require('./chunk-NCSMD3TK.cjs');
|
|
5
|
+
require('./chunk-VQTCQKHQ.cjs');
|
|
6
|
+
require('./chunk-KKGM42RQ.cjs');
|
|
7
|
+
require('./chunk-BPO2PQ3T.cjs');
|
|
9
8
|
require('./chunk-OC6X2VIN.cjs');
|
|
10
9
|
require('./chunk-CEAQK2QY.cjs');
|
|
11
10
|
require('./chunk-ZNMBW67B.cjs');
|
|
12
11
|
require('./chunk-IOYFAFHJ.cjs');
|
|
13
|
-
require('./chunk-
|
|
12
|
+
require('./chunk-NXLRY2CE.cjs');
|
|
14
13
|
require('./chunk-CU6IDACR.cjs');
|
|
15
14
|
require('./chunk-6S5RUKU3.cjs');
|
|
16
15
|
require('./chunk-YS6C2YJE.cjs');
|
|
@@ -24,31 +23,31 @@ require('./chunk-JEQ2X3Z6.cjs');
|
|
|
24
23
|
|
|
25
24
|
Object.defineProperty(exports, "ctx", {
|
|
26
25
|
enumerable: true,
|
|
27
|
-
get: function () { return
|
|
26
|
+
get: function () { return chunkQPH5ZKP5_cjs.ctx; }
|
|
28
27
|
});
|
|
29
28
|
Object.defineProperty(exports, "instrument", {
|
|
30
29
|
enumerable: true,
|
|
31
|
-
get: function () { return
|
|
30
|
+
get: function () { return chunkQPH5ZKP5_cjs.instrument; }
|
|
32
31
|
});
|
|
33
32
|
Object.defineProperty(exports, "span", {
|
|
34
33
|
enumerable: true,
|
|
35
|
-
get: function () { return
|
|
34
|
+
get: function () { return chunkQPH5ZKP5_cjs.span; }
|
|
36
35
|
});
|
|
37
36
|
Object.defineProperty(exports, "trace", {
|
|
38
37
|
enumerable: true,
|
|
39
|
-
get: function () { return
|
|
38
|
+
get: function () { return chunkQPH5ZKP5_cjs.trace; }
|
|
40
39
|
});
|
|
41
40
|
Object.defineProperty(exports, "withBaggage", {
|
|
42
41
|
enumerable: true,
|
|
43
|
-
get: function () { return
|
|
42
|
+
get: function () { return chunkQPH5ZKP5_cjs.withBaggage; }
|
|
44
43
|
});
|
|
45
44
|
Object.defineProperty(exports, "withNewContext", {
|
|
46
45
|
enumerable: true,
|
|
47
|
-
get: function () { return
|
|
46
|
+
get: function () { return chunkQPH5ZKP5_cjs.withNewContext; }
|
|
48
47
|
});
|
|
49
48
|
Object.defineProperty(exports, "withTracing", {
|
|
50
49
|
enumerable: true,
|
|
51
|
-
get: function () { return
|
|
50
|
+
get: function () { return chunkQPH5ZKP5_cjs.withTracing; }
|
|
52
51
|
});
|
|
53
52
|
//# sourceMappingURL=functional.cjs.map
|
|
54
53
|
//# sourceMappingURL=functional.cjs.map
|
package/dist/functional.d.cts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as _opentelemetry_api from '@opentelemetry/api';
|
|
2
2
|
import { Span } from '@opentelemetry/api';
|
|
3
3
|
import { Sampler } from './sampling.cjs';
|
|
4
|
-
import { T as TraceContext } from './trace-context-
|
|
4
|
+
import { T as TraceContext } from './trace-context-DbGKd1Rn.cjs';
|
|
5
5
|
import './logger.cjs';
|
|
6
6
|
import 'pino';
|
|
7
7
|
|
package/dist/functional.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as _opentelemetry_api from '@opentelemetry/api';
|
|
2
2
|
import { Span } from '@opentelemetry/api';
|
|
3
3
|
import { Sampler } from './sampling.js';
|
|
4
|
-
import { T as TraceContext } from './trace-context-
|
|
4
|
+
import { T as TraceContext } from './trace-context-DbGKd1Rn.js';
|
|
5
5
|
import './logger.js';
|
|
6
6
|
import 'pino';
|
|
7
7
|
|
package/dist/functional.js
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
export { ctx, instrument, span, trace, withBaggage, withNewContext, withTracing } from './chunk-
|
|
2
|
-
import './chunk-
|
|
3
|
-
import './chunk-
|
|
4
|
-
import './chunk-
|
|
5
|
-
import './chunk-
|
|
6
|
-
import './chunk-W35FVJBC.js';
|
|
1
|
+
export { ctx, instrument, span, trace, withBaggage, withNewContext, withTracing } from './chunk-PMRWMRXY.js';
|
|
2
|
+
import './chunk-DSMSIVTG.js';
|
|
3
|
+
import './chunk-SEO6NAQT.js';
|
|
4
|
+
import './chunk-Z7VAOK5X.js';
|
|
5
|
+
import './chunk-ZDPIWKWD.js';
|
|
7
6
|
import './chunk-3SDILILG.js';
|
|
8
7
|
import './chunk-A4E5AQFK.js';
|
|
9
8
|
import './chunk-WGWSHJ2N.js';
|
|
10
9
|
import './chunk-GYR5K654.js';
|
|
11
|
-
import './chunk-
|
|
10
|
+
import './chunk-JVWJDHDB.js';
|
|
12
11
|
import './chunk-6UQRVUN3.js';
|
|
13
12
|
import './chunk-3QXBFGKP.js';
|
|
14
13
|
import './chunk-33WTKH7X.js';
|
package/dist/http.cjs
CHANGED
|
@@ -1,6 +1,17 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkKKGM42RQ_cjs = require('./chunk-KKGM42RQ.cjs');
|
|
4
|
+
require('./chunk-BPO2PQ3T.cjs');
|
|
5
|
+
require('./chunk-OC6X2VIN.cjs');
|
|
6
|
+
require('./chunk-CEAQK2QY.cjs');
|
|
7
|
+
require('./chunk-ZNMBW67B.cjs');
|
|
8
|
+
require('./chunk-IOYFAFHJ.cjs');
|
|
9
|
+
require('./chunk-NXLRY2CE.cjs');
|
|
10
|
+
require('./chunk-CU6IDACR.cjs');
|
|
11
|
+
require('./chunk-6S5RUKU3.cjs');
|
|
12
|
+
require('./chunk-YS6C2YJE.cjs');
|
|
13
|
+
require('./chunk-VH77IPJN.cjs');
|
|
14
|
+
require('./chunk-FU6R566Y.cjs');
|
|
4
15
|
var chunkESLWRGAG_cjs = require('./chunk-ESLWRGAG.cjs');
|
|
5
16
|
require('./chunk-YREV3LGG.cjs');
|
|
6
17
|
require('./chunk-JEQ2X3Z6.cjs');
|
|
@@ -166,7 +177,7 @@ function extractStatusCode(result) {
|
|
|
166
177
|
return void 0;
|
|
167
178
|
}
|
|
168
179
|
function injectTraceContext(headers = {}) {
|
|
169
|
-
const currentContext =
|
|
180
|
+
const currentContext = chunkKKGM42RQ_cjs.getActiveContextWithBaggage();
|
|
170
181
|
api.propagation.inject(currentContext, headers);
|
|
171
182
|
return headers;
|
|
172
183
|
}
|
package/dist/http.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/http.ts"],"names":["args","getConfig","SpanStatusCode","getActiveContextWithBaggage","propagation","context"],"mappings":"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","file":"http.cjs","sourcesContent":["/**\n * HTTP Instrumentation Helpers\n *\n * Optional import: Not included in main bundle\n * Import from: 'autotel/http'\n *\n * Provides decorators and utilities for HTTP client instrumentation.\n * Works with fetch, axios, and other HTTP clients.\n *\n * @example\n * ```typescript\n * import { HttpInstrumented } from 'autotel/http'\n *\n * @HttpInstrumented()\n * class ApiClient {\n * async getUser(id: string) {\n * return fetch(`/api/users/${id}`)\n * }\n * }\n * ```\n */\n\nimport { SpanStatusCode, context, propagation } from '@opentelemetry/api';\nimport { getConfig } from './config';\nimport { getActiveContextWithBaggage } from './trace-context';\n\nexport interface HttpInstrumentedOptions {\n /** Service name for HTTP calls (default: 'http-client') */\n serviceName?: string;\n /** Extract URL from method arguments (default: first arg) */\n urlExtractor?: (args: unknown[]) => string | undefined;\n /** Extract HTTP method from method name or args */\n methodExtractor?: (methodName: string, args: unknown[]) => string;\n /** Add custom attributes to spans */\n attributesFromArgs?: (args: unknown[]) => Record<string, string | number>;\n /** Slow request threshold in milliseconds (adds warning attribute) - default: 3000ms */\n slowRequestThresholdMs?: number;\n}\n\n/**\n * Decorator for auto-instrumenting HTTP client methods\n *\n * @example Basic usage\n * ```typescript\n * @HttpInstrumented()\n * class ApiClient {\n * async fetchUser(userId: string) {\n * const res = await fetch(`https://api.example.com/users/${userId}`)\n * return res.json()\n * }\n *\n * async createOrder(order: Order) {\n * const res = await fetch('https://api.example.com/orders', {\n * method: 'POST',\n * body: JSON.stringify(order)\n * })\n * return res.json()\n * }\n * }\n * ```\n *\n * @example Advanced usage with custom extractors\n * ```typescript\n * @HttpInstrumented({\n * serviceName: 'payment-gateway',\n * urlExtractor: (args) => {\n * const config = args[0] as RequestConfig\n * return config.url\n * },\n * attributesFromArgs: (args) => ({\n * 'http.request_id': args[0]?.requestId,\n * 'http.retry_count': args[0]?.retryCount || 0\n * })\n * })\n * class PaymentClient {\n * async charge(config: RequestConfig) {\n * return axios(config)\n * }\n * }\n * ```\n */\nexport function HttpInstrumented(options: HttpInstrumentedOptions = {}) {\n const serviceName = options.serviceName || 'http-client';\n const slowRequestThresholdMs = options.slowRequestThresholdMs ?? 3000;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-empty-object-type\n return function <T extends { new (...args: any[]): {} }>(\n target: T,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _context: ClassDecoratorContext,\n ) {\n return class extends target {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n constructor(...args: any[]) {\n super(...args);\n\n const proto = target.prototype;\n const methodNames = Object.getOwnPropertyNames(proto).filter(\n (name) =>\n name !== 'constructor' &&\n typeof proto[name] === 'function' &&\n !name.startsWith('_'),\n );\n\n for (const methodName of methodNames) {\n const originalMethod = proto[methodName];\n\n if (\n originalMethod.constructor.name === 'AsyncFunction' ||\n originalMethod.toString().startsWith('async ')\n ) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wrappedMethod = async (...args: any[]) => {\n const config = getConfig();\n const tracer = config.tracer;\n\n const url = options.urlExtractor\n ? options.urlExtractor(args)\n : (args[0] as string | undefined);\n\n const method = options.methodExtractor\n ? options.methodExtractor(methodName, args)\n : inferHttpMethod(methodName);\n\n const spanName = url\n ? `HTTP ${method} ${extractPath(url)}`\n : `HTTP ${method}`;\n\n return tracer.startActiveSpan(spanName, async (span) => {\n const startTime = performance.now();\n\n try {\n span.setAttributes({\n 'http.method': method,\n 'http.url': url || 'unknown',\n 'service.name': serviceName,\n 'operation.name': `${serviceName}.${methodName}`,\n });\n\n if (url) {\n const urlObj = parseUrl(url);\n span.setAttributes({\n 'http.scheme': urlObj.protocol,\n 'http.host': urlObj.host,\n 'http.target': urlObj.path,\n });\n }\n\n if (options.attributesFromArgs) {\n span.setAttributes(options.attributesFromArgs(args));\n }\n\n const result = await originalMethod.apply(this, args);\n\n const duration = performance.now() - startTime;\n\n // Extract status code from response\n const statusCode = extractStatusCode(result);\n if (statusCode) {\n span.setAttribute('http.status_code', statusCode);\n\n if (statusCode >= 400) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: `HTTP ${statusCode}`,\n });\n } else {\n span.setStatus({ code: SpanStatusCode.OK });\n }\n } else {\n span.setStatus({ code: SpanStatusCode.OK });\n }\n\n span.setAttributes({\n 'http.duration_ms': duration,\n });\n\n // Mark slow requests for investigation\n if (duration > slowRequestThresholdMs) {\n span.setAttribute('http.slow_request', true);\n span.setAttribute(\n 'http.slow_request_threshold_ms',\n slowRequestThresholdMs,\n );\n }\n\n return result;\n } catch (error) {\n const duration = performance.now() - startTime;\n\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message:\n error instanceof Error ? error.message : 'Unknown error',\n });\n\n span.setAttributes({\n 'http.duration_ms': duration,\n 'error.type':\n error instanceof Error\n ? error.constructor.name\n : 'Unknown',\n 'error.message':\n error instanceof Error ? error.message : 'Unknown error',\n });\n\n throw error;\n } finally {\n span.end();\n }\n });\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this as any)[methodName] = wrappedMethod;\n }\n }\n }\n };\n };\n}\n\n/**\n * Helper: Trace a single HTTP request\n *\n * @example\n * ```typescript\n * import { traceHttpRequest } from 'autotel/http'\n *\n * const data = await traceHttpRequest(\n * 'GET /api/users',\n * () => fetch('https://api.example.com/users')\n * )\n * ```\n */\nexport async function traceHttpRequest<T>(\n spanName: string,\n fn: () => Promise<T>,\n attributes?: Record<string, string | number>,\n): Promise<T> {\n const config = getConfig();\n const tracer = config.tracer;\n\n return tracer.startActiveSpan(spanName, async (span) => {\n try {\n if (attributes) {\n span.setAttributes(attributes);\n }\n\n const result = await fn();\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n } finally {\n span.end();\n }\n });\n}\n\n// Helper functions\n\nfunction inferHttpMethod(methodName: string): string {\n const lower = methodName.toLowerCase();\n if (\n lower.includes('get') ||\n lower.includes('fetch') ||\n lower.includes('list')\n )\n return 'GET';\n if (lower.includes('post') || lower.includes('create')) return 'POST';\n if (lower.includes('put') || lower.includes('update')) return 'PUT';\n if (lower.includes('delete') || lower.includes('remove')) return 'DELETE';\n if (lower.includes('patch')) return 'PATCH';\n return 'GET'; // Default\n}\n\nfunction extractPath(url: string): string {\n try {\n const urlObj = new URL(url);\n return urlObj.pathname;\n } catch {\n // Relative URL or invalid\n return url.split('?')[0] || url;\n }\n}\n\nfunction parseUrl(url: string): {\n protocol: string;\n host: string;\n path: string;\n} {\n try {\n const urlObj = new URL(url);\n return {\n protocol: urlObj.protocol.replace(':', ''),\n host: urlObj.host,\n path: urlObj.pathname + urlObj.search,\n };\n } catch {\n return {\n protocol: 'http',\n host: 'unknown',\n path: url,\n };\n }\n}\n\nfunction extractStatusCode(result: unknown): number | undefined {\n if (result && typeof result === 'object') {\n // Check for Response.status (fetch API)\n if ('status' in result && typeof result.status === 'number') {\n return result.status;\n }\n // Check for statusCode (axios, node http)\n if ('statusCode' in result && typeof result.statusCode === 'number') {\n return result.statusCode;\n }\n }\n return undefined;\n}\n\n/**\n * Inject trace context into HTTP headers (for distributed tracing)\n *\n * This includes W3C Trace Context (traceparent, tracestate) and W3C Baggage headers.\n * Uses OpenTelemetry's propagation system for full compatibility.\n *\n * @example\n * ```typescript\n * import { injectTraceContext } from 'autotel/http'\n *\n * const headers = injectTraceContext({\n * 'Content-Type': 'application/json'\n * })\n *\n * fetch('/api/users', { headers })\n * ```\n *\n * @example With baggage\n * ```typescript\n * import { trace, withBaggage, injectTraceContext } from 'autotel'\n *\n * export const createOrder = trace((ctx) => async (order: Order) => {\n * return await withBaggage({\n * baggage: { 'tenant.id': order.tenantId },\n * fn: async () => {\n * const headers = injectTraceContext();\n * // Headers now include 'baggage' header with tenant.id\n * await fetch('/api/charge', { headers });\n * },\n * });\n * });\n * ```\n */\nexport function injectTraceContext(\n headers: Record<string, string> = {},\n): Record<string, string> {\n // Use getActiveContextWithBaggage to check stored context (from baggage setters)\n // This ensures ctx.setBaggage() changes are included in injected headers\n const currentContext = getActiveContextWithBaggage();\n\n // Use OpenTelemetry's propagation.inject for full W3C support\n // This includes traceparent, tracestate, and baggage headers\n propagation.inject(currentContext, headers);\n\n return headers;\n}\n\n/**\n * Extract trace context from HTTP headers (for distributed tracing)\n *\n * This extracts W3C Trace Context (traceparent, tracestate) and W3C Baggage headers.\n * Uses OpenTelemetry's propagation system for full compatibility.\n *\n * Returns a context that can be used with context.with() to run code\n * with the extracted trace context and baggage.\n *\n * @example\n * ```typescript\n * import { extractTraceContext, trace } from 'autotel'\n * import { context } from 'autotel'\n *\n * // In Express middleware\n * app.use((req, res, next) => {\n * const extractedContext = extractTraceContext(req.headers);\n * context.with(extractedContext, () => {\n * next();\n * });\n * });\n * ```\n *\n * @example In a traced function\n * ```typescript\n * export const handleWebhook = trace((ctx) => async (req: Request) => {\n * const extractedContext = extractTraceContext(req.headers);\n * return await context.with(extractedContext, async () => {\n * // Now ctx.getBaggage() will return baggage from the incoming request\n * const tenantId = ctx.getBaggage('tenant.id');\n * await processWebhook(req.body);\n * });\n * });\n * ```\n */\nexport function extractTraceContext(\n headers: Record<string, string | string[] | undefined>,\n): ReturnType<typeof context.active> {\n const carrier: Record<string, string> = {};\n\n // Convert headers to flat string format expected by propagation\n for (const [key, value] of Object.entries(headers)) {\n if (value !== undefined) {\n carrier[key] = Array.isArray(value) ? (value[0] ?? '') : value;\n }\n }\n\n // Extract context using OpenTelemetry's propagation system\n // Returns a Context that can be used with context.with()\n return propagation.extract(context.active(), carrier);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/http.ts"],"names":["args","getConfig","SpanStatusCode","getActiveContextWithBaggage","propagation","context"],"mappings":"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","file":"http.cjs","sourcesContent":["/**\n * HTTP Instrumentation Helpers\n *\n * Optional import: Not included in main bundle\n * Import from: 'autotel/http'\n *\n * Provides decorators and utilities for HTTP client instrumentation.\n * Works with fetch, axios, and other HTTP clients.\n *\n * @example\n * ```typescript\n * import { HttpInstrumented } from 'autotel/http'\n *\n * @HttpInstrumented()\n * class ApiClient {\n * async getUser(id: string) {\n * return fetch(`/api/users/${id}`)\n * }\n * }\n * ```\n */\n\nimport { SpanStatusCode, context, propagation } from '@opentelemetry/api';\nimport { getConfig } from './config';\nimport { getActiveContextWithBaggage } from './trace-context';\n\nexport interface HttpInstrumentedOptions {\n /** Service name for HTTP calls (default: 'http-client') */\n serviceName?: string;\n /** Extract URL from method arguments (default: first arg) */\n urlExtractor?: (args: unknown[]) => string | undefined;\n /** Extract HTTP method from method name or args */\n methodExtractor?: (methodName: string, args: unknown[]) => string;\n /** Add custom attributes to spans */\n attributesFromArgs?: (args: unknown[]) => Record<string, string | number>;\n /** Slow request threshold in milliseconds (adds warning attribute) - default: 3000ms */\n slowRequestThresholdMs?: number;\n}\n\n/**\n * Decorator for auto-instrumenting HTTP client methods\n *\n * @example Basic usage\n * ```typescript\n * @HttpInstrumented()\n * class ApiClient {\n * async fetchUser(userId: string) {\n * const res = await fetch(`https://api.example.com/users/${userId}`)\n * return res.json()\n * }\n *\n * async createOrder(order: Order) {\n * const res = await fetch('https://api.example.com/orders', {\n * method: 'POST',\n * body: JSON.stringify(order)\n * })\n * return res.json()\n * }\n * }\n * ```\n *\n * @example Advanced usage with custom extractors\n * ```typescript\n * @HttpInstrumented({\n * serviceName: 'payment-gateway',\n * urlExtractor: (args) => {\n * const config = args[0] as RequestConfig\n * return config.url\n * },\n * attributesFromArgs: (args) => ({\n * 'http.request_id': args[0]?.requestId,\n * 'http.retry_count': args[0]?.retryCount || 0\n * })\n * })\n * class PaymentClient {\n * async charge(config: RequestConfig) {\n * return axios(config)\n * }\n * }\n * ```\n */\nexport function HttpInstrumented(options: HttpInstrumentedOptions = {}) {\n const serviceName = options.serviceName || 'http-client';\n const slowRequestThresholdMs = options.slowRequestThresholdMs ?? 3000;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-empty-object-type\n return function <T extends { new (...args: any[]): {} }>(\n target: T,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _context: ClassDecoratorContext,\n ) {\n return class extends target {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n constructor(...args: any[]) {\n super(...args);\n\n const proto = target.prototype;\n const methodNames = Object.getOwnPropertyNames(proto).filter(\n (name) =>\n name !== 'constructor' &&\n typeof proto[name] === 'function' &&\n !name.startsWith('_'),\n );\n\n for (const methodName of methodNames) {\n const originalMethod = proto[methodName];\n\n if (\n originalMethod.constructor.name === 'AsyncFunction' ||\n originalMethod.toString().startsWith('async ')\n ) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wrappedMethod = async (...args: any[]) => {\n const config = getConfig();\n const tracer = config.tracer;\n\n const url = options.urlExtractor\n ? options.urlExtractor(args)\n : (args[0] as string | undefined);\n\n const method = options.methodExtractor\n ? options.methodExtractor(methodName, args)\n : inferHttpMethod(methodName);\n\n const spanName = url\n ? `HTTP ${method} ${extractPath(url)}`\n : `HTTP ${method}`;\n\n return tracer.startActiveSpan(spanName, async (span) => {\n const startTime = performance.now();\n\n try {\n span.setAttributes({\n 'http.method': method,\n 'http.url': url || 'unknown',\n 'service.name': serviceName,\n 'operation.name': `${serviceName}.${methodName}`,\n });\n\n if (url) {\n const urlObj = parseUrl(url);\n span.setAttributes({\n 'http.scheme': urlObj.protocol,\n 'http.host': urlObj.host,\n 'http.target': urlObj.path,\n });\n }\n\n if (options.attributesFromArgs) {\n span.setAttributes(options.attributesFromArgs(args));\n }\n\n const result = await originalMethod.apply(this, args);\n\n const duration = performance.now() - startTime;\n\n // Extract status code from response\n const statusCode = extractStatusCode(result);\n if (statusCode) {\n span.setAttribute('http.status_code', statusCode);\n\n if (statusCode >= 400) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: `HTTP ${statusCode}`,\n });\n } else {\n span.setStatus({ code: SpanStatusCode.OK });\n }\n } else {\n span.setStatus({ code: SpanStatusCode.OK });\n }\n\n span.setAttributes({\n 'http.duration_ms': duration,\n });\n\n // Mark slow requests for investigation\n if (duration > slowRequestThresholdMs) {\n span.setAttribute('http.slow_request', true);\n span.setAttribute(\n 'http.slow_request_threshold_ms',\n slowRequestThresholdMs,\n );\n }\n\n return result;\n } catch (error) {\n const duration = performance.now() - startTime;\n\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message:\n error instanceof Error ? error.message : 'Unknown error',\n });\n\n span.setAttributes({\n 'http.duration_ms': duration,\n 'error.type':\n error instanceof Error\n ? error.constructor.name\n : 'Unknown',\n 'error.message':\n error instanceof Error ? error.message : 'Unknown error',\n });\n\n throw error;\n } finally {\n span.end();\n }\n });\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this as any)[methodName] = wrappedMethod;\n }\n }\n }\n };\n };\n}\n\n/**\n * Helper: Trace a single HTTP request\n *\n * @example\n * ```typescript\n * import { traceHttpRequest } from 'autotel/http'\n *\n * const data = await traceHttpRequest(\n * 'GET /api/users',\n * () => fetch('https://api.example.com/users')\n * )\n * ```\n */\nexport async function traceHttpRequest<T>(\n spanName: string,\n fn: () => Promise<T>,\n attributes?: Record<string, string | number>,\n): Promise<T> {\n const config = getConfig();\n const tracer = config.tracer;\n\n return tracer.startActiveSpan(spanName, async (span) => {\n try {\n if (attributes) {\n span.setAttributes(attributes);\n }\n\n const result = await fn();\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n } finally {\n span.end();\n }\n });\n}\n\n// Helper functions\n\nfunction inferHttpMethod(methodName: string): string {\n const lower = methodName.toLowerCase();\n if (\n lower.includes('get') ||\n lower.includes('fetch') ||\n lower.includes('list')\n )\n return 'GET';\n if (lower.includes('post') || lower.includes('create')) return 'POST';\n if (lower.includes('put') || lower.includes('update')) return 'PUT';\n if (lower.includes('delete') || lower.includes('remove')) return 'DELETE';\n if (lower.includes('patch')) return 'PATCH';\n return 'GET'; // Default\n}\n\nfunction extractPath(url: string): string {\n try {\n const urlObj = new URL(url);\n return urlObj.pathname;\n } catch {\n // Relative URL or invalid\n return url.split('?')[0] || url;\n }\n}\n\nfunction parseUrl(url: string): {\n protocol: string;\n host: string;\n path: string;\n} {\n try {\n const urlObj = new URL(url);\n return {\n protocol: urlObj.protocol.replace(':', ''),\n host: urlObj.host,\n path: urlObj.pathname + urlObj.search,\n };\n } catch {\n return {\n protocol: 'http',\n host: 'unknown',\n path: url,\n };\n }\n}\n\nfunction extractStatusCode(result: unknown): number | undefined {\n if (result && typeof result === 'object') {\n // Check for Response.status (fetch API)\n if ('status' in result && typeof result.status === 'number') {\n return result.status;\n }\n // Check for statusCode (axios, node http)\n if ('statusCode' in result && typeof result.statusCode === 'number') {\n return result.statusCode;\n }\n }\n return undefined;\n}\n\n/**\n * Inject trace context into HTTP headers (for distributed tracing)\n *\n * This includes W3C Trace Context (traceparent, tracestate) and W3C Baggage headers.\n * Uses OpenTelemetry's propagation system for full compatibility.\n *\n * @example\n * ```typescript\n * import { injectTraceContext } from 'autotel/http'\n *\n * const headers = injectTraceContext({\n * 'Content-Type': 'application/json'\n * })\n *\n * fetch('/api/users', { headers })\n * ```\n *\n * @example With baggage\n * ```typescript\n * import { trace, withBaggage, injectTraceContext } from 'autotel'\n *\n * export const createOrder = trace((ctx) => async (order: Order) => {\n * return await withBaggage({\n * baggage: { 'tenant.id': order.tenantId },\n * fn: async () => {\n * const headers = injectTraceContext();\n * // Headers now include 'baggage' header with tenant.id\n * await fetch('/api/charge', { headers });\n * },\n * });\n * });\n * ```\n */\nexport function injectTraceContext(\n headers: Record<string, string> = {},\n): Record<string, string> {\n // Use getActiveContextWithBaggage to check stored context (from baggage setters)\n // This ensures ctx.setBaggage() changes are included in injected headers\n const currentContext = getActiveContextWithBaggage();\n\n // Use OpenTelemetry's propagation.inject for full W3C support\n // This includes traceparent, tracestate, and baggage headers\n propagation.inject(currentContext, headers);\n\n return headers;\n}\n\n/**\n * Extract trace context from HTTP headers (for distributed tracing)\n *\n * This extracts W3C Trace Context (traceparent, tracestate) and W3C Baggage headers.\n * Uses OpenTelemetry's propagation system for full compatibility.\n *\n * Returns a context that can be used with context.with() to run code\n * with the extracted trace context and baggage.\n *\n * @example\n * ```typescript\n * import { extractTraceContext, trace } from 'autotel'\n * import { context } from 'autotel'\n *\n * // In Express middleware\n * app.use((req, res, next) => {\n * const extractedContext = extractTraceContext(req.headers);\n * context.with(extractedContext, () => {\n * next();\n * });\n * });\n * ```\n *\n * @example In a traced function\n * ```typescript\n * export const handleWebhook = trace((ctx) => async (req: Request) => {\n * const extractedContext = extractTraceContext(req.headers);\n * return await context.with(extractedContext, async () => {\n * // Now ctx.getBaggage() will return baggage from the incoming request\n * const tenantId = ctx.getBaggage('tenant.id');\n * await processWebhook(req.body);\n * });\n * });\n * ```\n */\nexport function extractTraceContext(\n headers: Record<string, string | string[] | undefined>,\n): ReturnType<typeof context.active> {\n const carrier: Record<string, string> = {};\n\n // Convert headers to flat string format expected by propagation\n for (const [key, value] of Object.entries(headers)) {\n if (value !== undefined) {\n carrier[key] = Array.isArray(value) ? (value[0] ?? '') : value;\n }\n }\n\n // Extract context using OpenTelemetry's propagation system\n // Returns a Context that can be used with context.with()\n return propagation.extract(context.active(), carrier);\n}\n"]}
|
package/dist/http.js
CHANGED
|
@@ -1,4 +1,15 @@
|
|
|
1
|
-
import { getActiveContextWithBaggage } from './chunk-
|
|
1
|
+
import { getActiveContextWithBaggage } from './chunk-Z7VAOK5X.js';
|
|
2
|
+
import './chunk-ZDPIWKWD.js';
|
|
3
|
+
import './chunk-3SDILILG.js';
|
|
4
|
+
import './chunk-A4E5AQFK.js';
|
|
5
|
+
import './chunk-WGWSHJ2N.js';
|
|
6
|
+
import './chunk-GYR5K654.js';
|
|
7
|
+
import './chunk-JVWJDHDB.js';
|
|
8
|
+
import './chunk-6UQRVUN3.js';
|
|
9
|
+
import './chunk-3QXBFGKP.js';
|
|
10
|
+
import './chunk-33WTKH7X.js';
|
|
11
|
+
import './chunk-DPSA4QLA.js';
|
|
12
|
+
import './chunk-55ER2KD5.js';
|
|
2
13
|
import { getConfig } from './chunk-J5QENANM.js';
|
|
3
14
|
import './chunk-HA2WBOGQ.js';
|
|
4
15
|
import './chunk-DGUM43GV.js';
|