@ddd-ts-kit/tracing 0.0.0-stage → 0.1.1
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 +400 -2
- package/dist/application/trace-application.d.ts +39 -0
- package/dist/application/trace-application.d.ts.map +1 -0
- package/dist/application/trace-application.js +31 -0
- package/dist/application/trace-application.js.map +1 -0
- package/dist/configuration/configure-tracing.d.ts +9 -0
- package/dist/configuration/configure-tracing.d.ts.map +1 -0
- package/dist/configuration/configure-tracing.js +21 -0
- package/dist/configuration/configure-tracing.js.map +1 -0
- package/dist/configuration/default-lifecycle-hooks.d.ts +2 -0
- package/dist/configuration/default-lifecycle-hooks.d.ts.map +1 -0
- package/dist/configuration/default-lifecycle-hooks.js +8 -0
- package/dist/configuration/default-lifecycle-hooks.js.map +1 -0
- package/dist/configuration/tracing-configuration.d.ts +16 -0
- package/dist/configuration/tracing-configuration.d.ts.map +1 -0
- package/dist/configuration/tracing-configuration.js +2 -0
- package/dist/configuration/tracing-configuration.js.map +1 -0
- package/dist/correlation/correlation-id-from-active-span.d.ts +6 -0
- package/dist/correlation/correlation-id-from-active-span.d.ts.map +1 -0
- package/dist/correlation/correlation-id-from-active-span.js +10 -0
- package/dist/correlation/correlation-id-from-active-span.js.map +1 -0
- package/dist/correlation/trace-log-fields.d.ts +13 -0
- package/dist/correlation/trace-log-fields.d.ts.map +1 -0
- package/dist/correlation/trace-log-fields.js +20 -0
- package/dist/correlation/trace-log-fields.js.map +1 -0
- package/dist/correlation/traced-error-reporter.d.ts +9 -0
- package/dist/correlation/traced-error-reporter.d.ts.map +1 -0
- package/dist/correlation/traced-error-reporter.js +23 -0
- package/dist/correlation/traced-error-reporter.js.map +1 -0
- package/dist/dependency/method.d.ts +2 -0
- package/dist/dependency/method.d.ts.map +1 -0
- package/dist/dependency/method.js +2 -0
- package/dist/dependency/method.js.map +1 -0
- package/dist/dependency/proxied.d.ts +8 -0
- package/dist/dependency/proxied.d.ts.map +1 -0
- package/dist/dependency/proxied.js +21 -0
- package/dist/dependency/proxied.js.map +1 -0
- package/dist/dependency/shadowed.d.ts +4 -0
- package/dist/dependency/shadowed.d.ts.map +1 -0
- package/dist/dependency/shadowed.js +14 -0
- package/dist/dependency/shadowed.js.map +1 -0
- package/dist/dependency/trace-bindings.d.ts +25 -0
- package/dist/dependency/trace-bindings.d.ts.map +1 -0
- package/dist/dependency/trace-bindings.js +35 -0
- package/dist/dependency/trace-bindings.js.map +1 -0
- package/dist/dependency/trace-dependency.d.ts +26 -0
- package/dist/dependency/trace-dependency.d.ts.map +1 -0
- package/dist/dependency/trace-dependency.js +56 -0
- package/dist/dependency/trace-dependency.js.map +1 -0
- package/dist/dependency/traceable-methods.d.ts +4 -0
- package/dist/dependency/traceable-methods.d.ts.map +1 -0
- package/dist/dependency/traceable-methods.js +46 -0
- package/dist/dependency/traceable-methods.js.map +1 -0
- package/dist/dependency/traced.d.ts +5 -0
- package/dist/dependency/traced.d.ts.map +1 -0
- package/dist/dependency/traced.js +56 -0
- package/dist/dependency/traced.js.map +1 -0
- package/dist/domain-events/traced-domain-events.d.ts +14 -0
- package/dist/domain-events/traced-domain-events.d.ts.map +1 -0
- package/dist/domain-events/traced-domain-events.js +49 -0
- package/dist/domain-events/traced-domain-events.js.map +1 -0
- package/dist/events/consumer-trace.d.ts +8 -0
- package/dist/events/consumer-trace.d.ts.map +1 -0
- package/dist/events/consumer-trace.js +2 -0
- package/dist/events/consumer-trace.js.map +1 -0
- package/dist/events/messaging-attributes.d.ts +12 -0
- package/dist/events/messaging-attributes.d.ts.map +1 -0
- package/dist/events/messaging-attributes.js +11 -0
- package/dist/events/messaging-attributes.js.map +1 -0
- package/dist/events/traced-consumer.d.ts +22 -0
- package/dist/events/traced-consumer.d.ts.map +1 -0
- package/dist/events/traced-consumer.js +65 -0
- package/dist/events/traced-consumer.js.map +1 -0
- package/dist/events/traced-publisher.d.ts +19 -0
- package/dist/events/traced-publisher.d.ts.map +1 -0
- package/dist/events/traced-publisher.js +69 -0
- package/dist/events/traced-publisher.js.map +1 -0
- package/dist/events/traced-subscriber.d.ts +15 -0
- package/dist/events/traced-subscriber.d.ts.map +1 -0
- package/dist/events/traced-subscriber.js +19 -0
- package/dist/events/traced-subscriber.js.map +1 -0
- package/dist/http/is-noise-path.d.ts +3 -0
- package/dist/http/is-noise-path.d.ts.map +1 -0
- package/dist/http/is-noise-path.js +7 -0
- package/dist/http/is-noise-path.js.map +1 -0
- package/dist/http/is-noise-route.d.ts +6 -0
- package/dist/http/is-noise-route.d.ts.map +1 -0
- package/dist/http/is-noise-route.js +7 -0
- package/dist/http/is-noise-route.js.map +1 -0
- package/dist/http/noise-paths.d.ts +3 -0
- package/dist/http/noise-paths.d.ts.map +1 -0
- package/dist/http/noise-paths.js +15 -0
- package/dist/http/noise-paths.js.map +1 -0
- package/dist/http/traced-routes.d.ts +28 -0
- package/dist/http/traced-routes.d.ts.map +1 -0
- package/dist/http/traced-routes.js +76 -0
- package/dist/http/traced-routes.js.map +1 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/jobs/traced-job.d.ts +16 -0
- package/dist/jobs/traced-job.d.ts.map +1 -0
- package/dist/jobs/traced-job.js +25 -0
- package/dist/jobs/traced-job.js.map +1 -0
- package/dist/local-root/admit-dependency-span.d.ts +7 -0
- package/dist/local-root/admit-dependency-span.d.ts.map +1 -0
- package/dist/local-root/admit-dependency-span.js +30 -0
- package/dist/local-root/admit-dependency-span.js.map +1 -0
- package/dist/local-root/correlate.d.ts +9 -0
- package/dist/local-root/correlate.d.ts.map +1 -0
- package/dist/local-root/correlate.js +23 -0
- package/dist/local-root/correlate.js.map +1 -0
- package/dist/local-root/local-root-tracker.d.ts +18 -0
- package/dist/local-root/local-root-tracker.d.ts.map +1 -0
- package/dist/local-root/local-root-tracker.js +26 -0
- package/dist/local-root/local-root-tracker.js.map +1 -0
- package/dist/local-root/local-root.d.ts +11 -0
- package/dist/local-root/local-root.d.ts.map +1 -0
- package/dist/local-root/local-root.js +2 -0
- package/dist/local-root/local-root.js.map +1 -0
- package/dist/local-root/local-roots.d.ts +4 -0
- package/dist/local-root/local-roots.d.ts.map +1 -0
- package/dist/local-root/local-roots.js +4 -0
- package/dist/local-root/local-roots.js.map +1 -0
- package/dist/local-root/work-attributes.d.ts +4 -0
- package/dist/local-root/work-attributes.d.ts.map +1 -0
- package/dist/local-root/work-attributes.js +11 -0
- package/dist/local-root/work-attributes.js.map +1 -0
- package/dist/node/default-instrumentations.d.ts +20 -0
- package/dist/node/default-instrumentations.d.ts.map +1 -0
- package/dist/node/default-instrumentations.js +55 -0
- package/dist/node/default-instrumentations.js.map +1 -0
- package/dist/node/init-tracing.d.ts +41 -0
- package/dist/node/init-tracing.d.ts.map +1 -0
- package/dist/node/init-tracing.js +71 -0
- package/dist/node/init-tracing.js.map +1 -0
- package/dist/node/instrumentations-off.d.ts +6 -0
- package/dist/node/instrumentations-off.d.ts.map +1 -0
- package/dist/node/instrumentations-off.js +39 -0
- package/dist/node/instrumentations-off.js.map +1 -0
- package/dist/node.d.ts +3 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +3 -0
- package/dist/node.js.map +1 -0
- package/dist/processors/attribute-allow-list.d.ts +25 -0
- package/dist/processors/attribute-allow-list.d.ts.map +1 -0
- package/dist/processors/attribute-allow-list.js +38 -0
- package/dist/processors/attribute-allow-list.js.map +1 -0
- package/dist/processors/default-allowed-attributes.d.ts +8 -0
- package/dist/processors/default-allowed-attributes.d.ts.map +1 -0
- package/dist/processors/default-allowed-attributes.js +48 -0
- package/dist/processors/default-allowed-attributes.js.map +1 -0
- package/dist/processors/ended-span.d.ts +19 -0
- package/dist/processors/ended-span.d.ts.map +1 -0
- package/dist/processors/ended-span.js +2 -0
- package/dist/processors/ended-span.js.map +1 -0
- package/dist/processors/error-message-scrubber.d.ts +13 -0
- package/dist/processors/error-message-scrubber.d.ts.map +1 -0
- package/dist/processors/error-message-scrubber.js +21 -0
- package/dist/processors/error-message-scrubber.js.map +1 -0
- package/dist/processors/url-secret-span-processor.d.ts +12 -0
- package/dist/processors/url-secret-span-processor.d.ts.map +1 -0
- package/dist/processors/url-secret-span-processor.js +47 -0
- package/dist/processors/url-secret-span-processor.js.map +1 -0
- package/dist/propagation/capture-traceparent.d.ts +3 -0
- package/dist/propagation/capture-traceparent.d.ts.map +1 -0
- package/dist/propagation/capture-traceparent.js +7 -0
- package/dist/propagation/capture-traceparent.js.map +1 -0
- package/dist/propagation/context-with-traceparent.d.ts +4 -0
- package/dist/propagation/context-with-traceparent.d.ts.map +1 -0
- package/dist/propagation/context-with-traceparent.js +8 -0
- package/dist/propagation/context-with-traceparent.js.map +1 -0
- package/dist/propagation/run-with-traceparent.d.ts +6 -0
- package/dist/propagation/run-with-traceparent.d.ts.map +1 -0
- package/dist/propagation/run-with-traceparent.js +10 -0
- package/dist/propagation/run-with-traceparent.js.map +1 -0
- package/dist/propagation/span-context-from-traceparent.d.ts +4 -0
- package/dist/propagation/span-context-from-traceparent.d.ts.map +1 -0
- package/dist/propagation/span-context-from-traceparent.js +23 -0
- package/dist/propagation/span-context-from-traceparent.js.map +1 -0
- package/dist/propagation/traceparent-from-context.d.ts +4 -0
- package/dist/propagation/traceparent-from-context.d.ts.map +1 -0
- package/dist/propagation/traceparent-from-context.js +11 -0
- package/dist/propagation/traceparent-from-context.js.map +1 -0
- package/dist/span/constructor-name.d.ts +3 -0
- package/dist/span/constructor-name.d.ts.map +1 -0
- package/dist/span/constructor-name.js +9 -0
- package/dist/span/constructor-name.js.map +1 -0
- package/dist/span/failed-traces.d.ts +2 -0
- package/dist/span/failed-traces.d.ts.map +1 -0
- package/dist/span/failed-traces.js +3 -0
- package/dist/span/failed-traces.js.map +1 -0
- package/dist/span/in-span.d.ts +12 -0
- package/dist/span/in-span.d.ts.map +1 -0
- package/dist/span/in-span.js +19 -0
- package/dist/span/in-span.js.map +1 -0
- package/dist/span/is-thenable.d.ts +2 -0
- package/dist/span/is-thenable.d.ts.map +1 -0
- package/dist/span/is-thenable.js +7 -0
- package/dist/span/is-thenable.js.map +1 -0
- package/dist/span/mark-span-failed.d.ts +4 -0
- package/dist/span/mark-span-failed.d.ts.map +1 -0
- package/dist/span/mark-span-failed.js +36 -0
- package/dist/span/mark-span-failed.js.map +1 -0
- package/dist/span/outcome-attribute.d.ts +3 -0
- package/dist/span/outcome-attribute.d.ts.map +1 -0
- package/dist/span/outcome-attribute.js +3 -0
- package/dist/span/outcome-attribute.js.map +1 -0
- package/dist/span/refusal-code.d.ts +4 -0
- package/dist/span/refusal-code.d.ts.map +1 -0
- package/dist/span/refusal-code.js +10 -0
- package/dist/span/refusal-code.js.map +1 -0
- package/dist/span/tracer.d.ts +4 -0
- package/dist/span/tracer.d.ts.map +1 -0
- package/dist/span/tracer.js +7 -0
- package/dist/span/tracer.js.map +1 -0
- package/dist/span/with-span.d.ts +9 -0
- package/dist/span/with-span.d.ts.map +1 -0
- package/dist/span/with-span.js +36 -0
- package/dist/span/with-span.js.map +1 -0
- package/dist/testing/expect-span-tree.d.ts +10 -0
- package/dist/testing/expect-span-tree.d.ts.map +1 -0
- package/dist/testing/expect-span-tree.js +29 -0
- package/dist/testing/expect-span-tree.js.map +1 -0
- package/dist/testing/expected-span.d.ts +17 -0
- package/dist/testing/expected-span.d.ts.map +1 -0
- package/dist/testing/expected-span.js +2 -0
- package/dist/testing/expected-span.js.map +1 -0
- package/dist/testing/install-test-tracing.d.ts +23 -0
- package/dist/testing/install-test-tracing.d.ts.map +1 -0
- package/dist/testing/install-test-tracing.js +48 -0
- package/dist/testing/install-test-tracing.js.map +1 -0
- package/dist/testing/render-span-tree.d.ts +8 -0
- package/dist/testing/render-span-tree.d.ts.map +1 -0
- package/dist/testing/render-span-tree.js +23 -0
- package/dist/testing/render-span-tree.js.map +1 -0
- package/dist/testing/span-mismatches.d.ts +5 -0
- package/dist/testing/span-mismatches.d.ts.map +1 -0
- package/dist/testing/span-mismatches.js +34 -0
- package/dist/testing/span-mismatches.js.map +1 -0
- package/dist/testing/span-node.d.ts +13 -0
- package/dist/testing/span-node.d.ts.map +1 -0
- package/dist/testing/span-node.js +2 -0
- package/dist/testing/span-node.js.map +1 -0
- package/dist/testing/span-tree-of.d.ts +8 -0
- package/dist/testing/span-tree-of.d.ts.map +1 -0
- package/dist/testing/span-tree-of.js +34 -0
- package/dist/testing/span-tree-of.js.map +1 -0
- package/dist/testing/start-order.d.ts +12 -0
- package/dist/testing/start-order.d.ts.map +1 -0
- package/dist/testing/start-order.js +17 -0
- package/dist/testing/start-order.js.map +1 -0
- package/dist/testing.d.ts +6 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +4 -0
- package/dist/testing.js.map +1 -0
- package/dist/use-case/trace-use-cases.d.ts +10 -0
- package/dist/use-case/trace-use-cases.d.ts.map +1 -0
- package/dist/use-case/trace-use-cases.js +41 -0
- package/dist/use-case/trace-use-cases.js.map +1 -0
- package/package.json +75 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ended-span.js","sourceRoot":"","sources":["../../src/processors/ended-span.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { EndedSpan } from './ended-span.js';
|
|
2
|
+
/**
|
|
3
|
+
* Removes what `recordException` and instrumentations copy from an error: the
|
|
4
|
+
* `exception.message` and `exception.stacktrace` event attributes and the status
|
|
5
|
+
* message. `exception.type` stays.
|
|
6
|
+
*/
|
|
7
|
+
export declare class ErrorMessageScrubber {
|
|
8
|
+
onStart(): void;
|
|
9
|
+
onEnd(span: EndedSpan): void;
|
|
10
|
+
forceFlush(): Promise<void>;
|
|
11
|
+
shutdown(): Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=error-message-scrubber.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-message-scrubber.d.ts","sourceRoot":"","sources":["../../src/processors/error-message-scrubber.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD;;;;GAIG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,IAAI,IAAI,CAAG;IAElB,KAAK,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAW3B;IAEK,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAG;IAE9B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAG;CACnC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Removes what `recordException` and instrumentations copy from an error: the
|
|
3
|
+
* `exception.message` and `exception.stacktrace` event attributes and the status
|
|
4
|
+
* message. `exception.type` stays.
|
|
5
|
+
*/
|
|
6
|
+
export class ErrorMessageScrubber {
|
|
7
|
+
onStart() { }
|
|
8
|
+
onEnd(span) {
|
|
9
|
+
for (const event of span.events) {
|
|
10
|
+
if (event.attributes === undefined) {
|
|
11
|
+
continue;
|
|
12
|
+
}
|
|
13
|
+
delete event.attributes['exception.message'];
|
|
14
|
+
delete event.attributes['exception.stacktrace'];
|
|
15
|
+
}
|
|
16
|
+
delete span.status.message;
|
|
17
|
+
}
|
|
18
|
+
async forceFlush() { }
|
|
19
|
+
async shutdown() { }
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=error-message-scrubber.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-message-scrubber.js","sourceRoot":"","sources":["../../src/processors/error-message-scrubber.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,OAAO,oBAAoB;IAC/B,OAAO,KAAU,CAAC;IAElB,KAAK,CAAC,IAAe;QACnB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChC,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;gBACnC,SAAS;YACX,CAAC;YAED,OAAO,KAAK,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC;YAC7C,OAAO,KAAK,CAAC,UAAU,CAAC,sBAAsB,CAAC,CAAC;QAClD,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,UAAU,KAAmB,CAAC;IAEpC,KAAK,CAAC,QAAQ,KAAmB,CAAC;CACnC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { EndedSpan } from './ended-span.js';
|
|
2
|
+
/**
|
|
3
|
+
* Redacts credentials from URLs recorded by HTTP instrumentations: query string values
|
|
4
|
+
* (names are kept) and userinfo, in `url.full`, `http.url` and `url.query`.
|
|
5
|
+
*/
|
|
6
|
+
export declare class UrlSecretSpanProcessor {
|
|
7
|
+
onStart(): void;
|
|
8
|
+
onEnd(span: EndedSpan): void;
|
|
9
|
+
forceFlush(): Promise<void>;
|
|
10
|
+
shutdown(): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=url-secret-span-processor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url-secret-span-processor.d.ts","sourceRoot":"","sources":["../../src/processors/url-secret-span-processor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAOjD;;;GAGG;AACH,qBAAa,sBAAsB;IACjC,OAAO,IAAI,IAAI,CAAG;IAElB,KAAK,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAgB3B;IAEK,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAG;IAE9B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAG;CACnC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
const REDACTED = 'REDACTED';
|
|
2
|
+
const URL_ATTRIBUTES = ['url.full', 'http.url'];
|
|
3
|
+
const QUERY_ATTRIBUTE = 'url.query';
|
|
4
|
+
const USERINFO = /^([A-Za-z][A-Za-z0-9+.-]*:\/\/)[^/?#@]*@/;
|
|
5
|
+
/**
|
|
6
|
+
* Redacts credentials from URLs recorded by HTTP instrumentations: query string values
|
|
7
|
+
* (names are kept) and userinfo, in `url.full`, `http.url` and `url.query`.
|
|
8
|
+
*/
|
|
9
|
+
export class UrlSecretSpanProcessor {
|
|
10
|
+
onStart() { }
|
|
11
|
+
onEnd(span) {
|
|
12
|
+
for (const key of URL_ATTRIBUTES) {
|
|
13
|
+
const value = span.attributes[key];
|
|
14
|
+
if (typeof value === 'string') {
|
|
15
|
+
span.attributes[key] = redactUrl(value);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
const query = span.attributes[QUERY_ATTRIBUTE];
|
|
19
|
+
if (typeof query === 'string') {
|
|
20
|
+
const body = query.startsWith('?') ? query.slice(1) : query;
|
|
21
|
+
span.attributes[QUERY_ATTRIBUTE] = `${query.startsWith('?') ? '?' : ''}${redactQuery(body)}`;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
async forceFlush() { }
|
|
25
|
+
async shutdown() { }
|
|
26
|
+
}
|
|
27
|
+
// Plain string surgery instead of `new URL`: the attribute may hold a relative or
|
|
28
|
+
// malformed URL, and it must be redacted all the same.
|
|
29
|
+
function redactUrl(url) {
|
|
30
|
+
const hashAt = url.indexOf('#');
|
|
31
|
+
const fragment = hashAt === -1 ? '' : url.slice(hashAt);
|
|
32
|
+
const withoutFragment = hashAt === -1 ? url : url.slice(0, hashAt);
|
|
33
|
+
const queryAt = withoutFragment.indexOf('?');
|
|
34
|
+
const base = queryAt === -1 ? withoutFragment : withoutFragment.slice(0, queryAt);
|
|
35
|
+
const query = queryAt === -1 ? '' : `?${redactQuery(withoutFragment.slice(queryAt + 1))}`;
|
|
36
|
+
return `${base.replace(USERINFO, `$1${REDACTED}:${REDACTED}@`)}${query}${fragment}`;
|
|
37
|
+
}
|
|
38
|
+
function redactQuery(query) {
|
|
39
|
+
return query
|
|
40
|
+
.split('&')
|
|
41
|
+
.map((pair) => {
|
|
42
|
+
const equals = pair.indexOf('=');
|
|
43
|
+
return equals === -1 ? pair : `${pair.slice(0, equals)}=${REDACTED}`;
|
|
44
|
+
})
|
|
45
|
+
.join('&');
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=url-secret-span-processor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url-secret-span-processor.js","sourceRoot":"","sources":["../../src/processors/url-secret-span-processor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture-traceparent.d.ts","sourceRoot":"","sources":["../../src/propagation/capture-traceparent.ts"],"names":[],"mappings":"AAGA,6EAA6E;AAC7E,wBAAgB,kBAAkB,IAAI,MAAM,GAAG,SAAS,CAEvD"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { context } from '@opentelemetry/api';
|
|
2
|
+
import { traceparentFromContext } from './traceparent-from-context.js';
|
|
3
|
+
/** W3C `traceparent` of the active span, to store on an outgoing message. */
|
|
4
|
+
export function captureTraceparent() {
|
|
5
|
+
return traceparentFromContext(context.active());
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=capture-traceparent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture-traceparent.js","sourceRoot":"","sources":["../../src/propagation/capture-traceparent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAEvE,6EAA6E;AAC7E,MAAM,UAAU,kBAAkB;IAChC,OAAO,sBAAsB,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type Context } from '@opentelemetry/api';
|
|
2
|
+
/** `base` with the remote span as parent, or `base` itself when there is none. */
|
|
3
|
+
export declare function contextWithTraceparent(base: Context, traceparent: string | undefined): Context;
|
|
4
|
+
//# sourceMappingURL=context-with-traceparent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-with-traceparent.d.ts","sourceRoot":"","sources":["../../src/propagation/context-with-traceparent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAGzD,kFAAkF;AAClF,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAI9F"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { trace } from '@opentelemetry/api';
|
|
2
|
+
import { spanContextFromTraceparent } from './span-context-from-traceparent.js';
|
|
3
|
+
/** `base` with the remote span as parent, or `base` itself when there is none. */
|
|
4
|
+
export function contextWithTraceparent(base, traceparent) {
|
|
5
|
+
const remote = traceparent === undefined ? undefined : spanContextFromTraceparent(traceparent);
|
|
6
|
+
return remote === undefined ? base : trace.setSpanContext(base, remote);
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=context-with-traceparent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-with-traceparent.js","sourceRoot":"","sources":["../../src/propagation/context-with-traceparent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAgB,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAEhF,kFAAkF;AAClF,MAAM,UAAU,sBAAsB,CAAC,IAAa,EAAE,WAA+B;IACnF,MAAM,MAAM,GAAG,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,0BAA0B,CAAC,WAAW,CAAC,CAAC;IAE/F,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC1E,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runs `fn` so that spans it starts continue the trace named by `traceparent`. With a
|
|
3
|
+
* missing or malformed value, `fn` runs in the current context.
|
|
4
|
+
*/
|
|
5
|
+
export declare function runWithTraceparent<T>(traceparent: string | undefined, fn: () => T): T;
|
|
6
|
+
//# sourceMappingURL=run-with-traceparent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-with-traceparent.d.ts","sourceRoot":"","sources":["../../src/propagation/run-with-traceparent.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAErF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { context } from '@opentelemetry/api';
|
|
2
|
+
import { contextWithTraceparent } from './context-with-traceparent.js';
|
|
3
|
+
/**
|
|
4
|
+
* Runs `fn` so that spans it starts continue the trace named by `traceparent`. With a
|
|
5
|
+
* missing or malformed value, `fn` runs in the current context.
|
|
6
|
+
*/
|
|
7
|
+
export function runWithTraceparent(traceparent, fn) {
|
|
8
|
+
return context.with(contextWithTraceparent(context.active(), traceparent), fn);
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=run-with-traceparent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-with-traceparent.js","sourceRoot":"","sources":["../../src/propagation/run-with-traceparent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAEvE;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAI,WAA+B,EAAE,EAAW;IAChF,OAAO,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC;AACjF,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type SpanContext } from '@opentelemetry/api';
|
|
2
|
+
/** Parses a `traceparent`. Returns undefined for anything malformed or all-zero ids. */
|
|
3
|
+
export declare function spanContextFromTraceparent(traceparent: string): SpanContext | undefined;
|
|
4
|
+
//# sourceMappingURL=span-context-from-traceparent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"span-context-from-traceparent.d.ts","sourceRoot":"","sources":["../../src/propagation/span-context-from-traceparent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAM1E,wFAAwF;AACxF,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAqBvF"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { isSpanContextValid } from '@opentelemetry/api';
|
|
2
|
+
// Version 00 only, lowercase hex, exact lengths: an event is stored and replayed, so a
|
|
3
|
+
// malformed value is dropped instead of being interpreted leniently.
|
|
4
|
+
const TRACEPARENT = /^00-([0-9a-f]{32})-([0-9a-f]{16})-([0-9a-f]{2})$/;
|
|
5
|
+
/** Parses a `traceparent`. Returns undefined for anything malformed or all-zero ids. */
|
|
6
|
+
export function spanContextFromTraceparent(traceparent) {
|
|
7
|
+
const match = TRACEPARENT.exec(traceparent);
|
|
8
|
+
if (match === null) {
|
|
9
|
+
return undefined;
|
|
10
|
+
}
|
|
11
|
+
const [, traceId, spanId, flags] = match;
|
|
12
|
+
if (traceId === undefined || spanId === undefined || flags === undefined) {
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
const spanContext = {
|
|
16
|
+
traceId,
|
|
17
|
+
spanId,
|
|
18
|
+
traceFlags: Number.parseInt(flags, 16),
|
|
19
|
+
isRemote: true,
|
|
20
|
+
};
|
|
21
|
+
return isSpanContextValid(spanContext) ? spanContext : undefined;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=span-context-from-traceparent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"span-context-from-traceparent.js","sourceRoot":"","sources":["../../src/propagation/span-context-from-traceparent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAoB,MAAM,oBAAoB,CAAC;AAE1E,uFAAuF;AACvF,qEAAqE;AACrE,MAAM,WAAW,GAAG,kDAAkD,CAAC;AAEvE,wFAAwF;AACxF,MAAM,UAAU,0BAA0B,CAAC,WAAmB;IAC5D,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAE5C,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,KAAK,CAAC;IAEzC,IAAI,OAAO,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACzE,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,WAAW,GAAgB;QAC/B,OAAO;QACP,MAAM;QACN,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC;QACtC,QAAQ,EAAE,IAAI;KACf,CAAC;IAEF,OAAO,kBAAkB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;AACnE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traceparent-from-context.d.ts","sourceRoot":"","sources":["../../src/propagation/traceparent-from-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7E,8DAA8D;AAC9D,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAUvE"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { isSpanContextValid, trace } from '@opentelemetry/api';
|
|
2
|
+
/** W3C `traceparent` of the span carried by `ctx`, if any. */
|
|
3
|
+
export function traceparentFromContext(ctx) {
|
|
4
|
+
const spanContext = trace.getSpanContext(ctx);
|
|
5
|
+
if (spanContext === undefined || !isSpanContextValid(spanContext)) {
|
|
6
|
+
return undefined;
|
|
7
|
+
}
|
|
8
|
+
const flags = (spanContext.traceFlags & 0xff).toString(16).padStart(2, '0');
|
|
9
|
+
return `00-${spanContext.traceId}-${spanContext.spanId}-${flags}`;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=traceparent-from-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traceparent-from-context.js","sourceRoot":"","sources":["../../src/propagation/traceparent-from-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,KAAK,EAAgB,MAAM,oBAAoB,CAAC;AAE7E,8DAA8D;AAC9D,MAAM,UAAU,sBAAsB,CAAC,GAAY;IACjD,MAAM,WAAW,GAAG,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;IAE9C,IAAI,WAAW,KAAK,SAAS,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAAC;QAClE,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,WAAW,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAE5E,OAAO,MAAM,WAAW,CAAC,OAAO,IAAI,WAAW,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constructor-name.d.ts","sourceRoot":"","sources":["../../src/span/constructor-name.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAStD"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Read without trusting the type: an object created without prototype has no constructor. */
|
|
2
|
+
export function constructorName(value) {
|
|
3
|
+
const constructor = Reflect.get(value, 'constructor');
|
|
4
|
+
const named = (typeof constructor === 'object' || typeof constructor === 'function') &&
|
|
5
|
+
constructor !== null &&
|
|
6
|
+
'name' in constructor;
|
|
7
|
+
return named ? constructor.name : undefined;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=constructor-name.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constructor-name.js","sourceRoot":"","sources":["../../src/span/constructor-name.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,MAAM,WAAW,GAAY,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IAE/D,MAAM,KAAK,GACT,CAAC,OAAO,WAAW,KAAK,QAAQ,IAAI,OAAO,WAAW,KAAK,UAAU,CAAC;QACtE,WAAW,KAAK,IAAI;QACpB,MAAM,IAAI,WAAW,CAAC;IAExB,OAAO,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"failed-traces.d.ts","sourceRoot":"","sources":["../../src/span/failed-traces.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,YAAY,yBAAgC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"failed-traces.js","sourceRoot":"","sources":["../../src/span/failed-traces.ts"],"names":[],"mappings":"AAAA,wGAAwG;AACxG,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,EAAkB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type Context, type Span, type SpanOptions } from '@opentelemetry/api';
|
|
2
|
+
export interface SpanStart {
|
|
3
|
+
readonly name: string;
|
|
4
|
+
readonly options?: SpanOptions;
|
|
5
|
+
/** Defaults to the active context. */
|
|
6
|
+
readonly parent?: Context;
|
|
7
|
+
/** What the span says of a failure. Defaults to `markSpanFailed`: status ERROR, class and code. */
|
|
8
|
+
readonly onFailure?: (span: Span, error: unknown) => void;
|
|
9
|
+
}
|
|
10
|
+
/** Runs asynchronous work in a span that ends with it. A failure goes on untouched. */
|
|
11
|
+
export declare function inSpan<T>(start: SpanStart, work: (span: Span) => Promise<T>): Promise<T>;
|
|
12
|
+
//# sourceMappingURL=in-span.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-span.d.ts","sourceRoot":"","sources":["../../src/span/in-span.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,OAAO,EAAE,KAAK,IAAI,EAAE,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAI/F,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC;IAC/B,sCAAsC;IACtC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,mGAAmG;IACnG,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CAC3D;AAED,uFAAuF;AACvF,wBAAsB,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAa9F"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { context, trace } from '@opentelemetry/api';
|
|
2
|
+
import { markSpanFailed } from './mark-span-failed.js';
|
|
3
|
+
import { tracer } from './tracer.js';
|
|
4
|
+
/** Runs asynchronous work in a span that ends with it. A failure goes on untouched. */
|
|
5
|
+
export async function inSpan(start, work) {
|
|
6
|
+
const parent = start.parent ?? context.active();
|
|
7
|
+
const span = tracer().startSpan(start.name, start.options ?? {}, parent);
|
|
8
|
+
try {
|
|
9
|
+
return await context.with(trace.setSpan(parent, span), () => work(span));
|
|
10
|
+
}
|
|
11
|
+
catch (error) {
|
|
12
|
+
(start.onFailure ?? markSpanFailed)(span, error);
|
|
13
|
+
throw error;
|
|
14
|
+
}
|
|
15
|
+
finally {
|
|
16
|
+
span.end();
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=in-span.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-span.js","sourceRoot":"","sources":["../../src/span/in-span.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAA6C,MAAM,oBAAoB,CAAC;AAC/F,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAWrC,uFAAuF;AACvF,MAAM,CAAC,KAAK,UAAU,MAAM,CAAI,KAAgB,EAAE,IAAgC;IAChF,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAChD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;IAEzE,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,CAAC,KAAK,CAAC,SAAS,IAAI,cAAc,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAEjD,MAAM,KAAK,CAAC;IACd,CAAC;YAAS,CAAC;QACT,IAAI,CAAC,GAAG,EAAE,CAAC;IACb,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-thenable.d.ts","sourceRoot":"","sources":["../../src/span/is-thenable.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAAC,OAAO,CAAC,CAOxE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-thenable.js","sourceRoot":"","sources":["../../src/span/is-thenable.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,OAAO,CACL,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,UAAU,CAAC;QAC1D,KAAK,KAAK,IAAI;QACd,MAAM,IAAI,KAAK;QACf,OAAO,KAAK,CAAC,IAAI,KAAK,UAAU,CACjC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mark-span-failed.d.ts","sourceRoot":"","sources":["../../src/span/mark-span-failed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuD,KAAK,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAOpG,6FAA6F;AAC7F,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAI/D"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { SpanStatusCode, isSpanContextValid } from '@opentelemetry/api';
|
|
2
|
+
import { constructorName } from './constructor-name.js';
|
|
3
|
+
import { failedTraces } from './failed-traces.js';
|
|
4
|
+
import { refusalCode } from './refusal-code.js';
|
|
5
|
+
const IDENTIFIER = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
6
|
+
/** Deliberately no `recordException` and no status message: both would carry the message. */
|
|
7
|
+
export function markSpanFailed(span, error) {
|
|
8
|
+
span.setStatus({ code: SpanStatusCode.ERROR });
|
|
9
|
+
span.setAttributes(errorAttributes(error));
|
|
10
|
+
remember(span, error);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* What a span may say about a failure. Messages and stacks quote data (ids, emails,
|
|
14
|
+
* SQL), so only an identifier-shaped class name and a code-shaped `code` get through.
|
|
15
|
+
*/
|
|
16
|
+
function errorAttributes(error) {
|
|
17
|
+
if (typeof error !== 'object' || error === null) {
|
|
18
|
+
return {};
|
|
19
|
+
}
|
|
20
|
+
const className = constructorName(error);
|
|
21
|
+
return { ...(isIdentifier(className) ? { 'error.type': className } : {}), ...refusalCode(error) };
|
|
22
|
+
}
|
|
23
|
+
function isIdentifier(value) {
|
|
24
|
+
return typeof value === 'string' && IDENTIFIER.test(value);
|
|
25
|
+
}
|
|
26
|
+
/** The innermost span sees the error first: the trace it names is the one the failure happened in. */
|
|
27
|
+
function remember(span, error) {
|
|
28
|
+
const spanContext = span.spanContext();
|
|
29
|
+
if (typeof error !== 'object' || error === null || failedTraces.has(error)) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
if (isSpanContextValid(spanContext)) {
|
|
33
|
+
failedTraces.set(error, spanContext.traceId);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=mark-span-failed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mark-span-failed.js","sourceRoot":"","sources":["../../src/span/mark-span-failed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAA8B,MAAM,oBAAoB,CAAC;AACpG,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,UAAU,GAAG,0BAA0B,CAAC;AAE9C,6FAA6F;AAC7F,MAAM,UAAU,cAAc,CAAC,IAAU,EAAE,KAAc;IACvD,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC;IAC/C,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3C,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACxB,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAEzC,OAAO,EAAE,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;AACpG,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC7D,CAAC;AAED,sGAAsG;AACtG,SAAS,QAAQ,CAAC,IAAU,EAAE,KAAc;IAC1C,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAEvC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3E,OAAO;IACT,CAAC;IAED,IAAI,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAAC;QACpC,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outcome-attribute.d.ts","sourceRoot":"","sources":["../../src/span/outcome-attribute.ts"],"names":[],"mappings":"AAAA,sGAAsG;AACtG,eAAO,MAAM,iBAAiB,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outcome-attribute.js","sourceRoot":"","sources":["../../src/span/outcome-attribute.ts"],"names":[],"mappings":"AAAA,sGAAsG;AACtG,MAAM,CAAC,MAAM,iBAAiB,GAAG,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refusal-code.d.ts","sourceRoot":"","sources":["../../src/span/refusal-code.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAIrD,kGAAkG;AAClG,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAQtD"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
const CODE = /^[A-Za-z_][A-Za-z0-9_.:-]{0,63}$/;
|
|
2
|
+
/** The `code` of an error as a span attribute, when it is shaped like a code: never a message. */
|
|
3
|
+
export function refusalCode(error) {
|
|
4
|
+
if (typeof error !== 'object' || error === null || !('code' in error)) {
|
|
5
|
+
return {};
|
|
6
|
+
}
|
|
7
|
+
const { code } = error;
|
|
8
|
+
return typeof code === 'string' && CODE.test(code) ? { 'app.error.code': code } : {};
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=refusal-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refusal-code.js","sourceRoot":"","sources":["../../src/span/refusal-code.ts"],"names":[],"mappings":"AAEA,MAAM,IAAI,GAAG,kCAAkC,CAAC;AAEhD,kGAAkG;AAClG,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,EAAE,CAAC;QACtE,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IAEvB,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACvF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracer.d.ts","sourceRoot":"","sources":["../../src/span/tracer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAIxD,wFAAwF;AACxF,wBAAgB,MAAM,IAAI,MAAM,CAE/B"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { trace } from '@opentelemetry/api';
|
|
2
|
+
const TRACER_NAME = '@ddd-ts-kit/tracing';
|
|
3
|
+
/** Looked up on every use so a provider registered after wrapping is still honoured. */
|
|
4
|
+
export function tracer() {
|
|
5
|
+
return trace.getTracer(TRACER_NAME);
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=tracer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracer.js","sourceRoot":"","sources":["../../src/span/tracer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAe,MAAM,oBAAoB,CAAC;AAExD,MAAM,WAAW,GAAG,qBAAqB,CAAC;AAE1C,wFAAwF;AACxF,MAAM,UAAU,MAAM;IACpB,OAAO,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type Attributes } from '@opentelemetry/api';
|
|
2
|
+
/**
|
|
3
|
+
* Runs `fn` in a span. For the composition root and platform code only (a migration, a
|
|
4
|
+
* scheduled job, a startup step): domain and application code never call it, adapters
|
|
5
|
+
* are wrapped with `traceDependency` instead. Attributes are the caller's
|
|
6
|
+
* responsibility: no user data, no secrets.
|
|
7
|
+
*/
|
|
8
|
+
export declare function withSpan<T>(name: string, fn: () => T, attributes?: Attributes): T;
|
|
9
|
+
//# sourceMappingURL=with-span.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"with-span.d.ts","sourceRoot":"","sources":["../../src/span/with-span.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAKrE;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,CAAC,CAgCjF"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { context, trace } from '@opentelemetry/api';
|
|
2
|
+
import { isThenable } from './is-thenable.js';
|
|
3
|
+
import { markSpanFailed } from './mark-span-failed.js';
|
|
4
|
+
import { tracer } from './tracer.js';
|
|
5
|
+
/**
|
|
6
|
+
* Runs `fn` in a span. For the composition root and platform code only (a migration, a
|
|
7
|
+
* scheduled job, a startup step): domain and application code never call it, adapters
|
|
8
|
+
* are wrapped with `traceDependency` instead. Attributes are the caller's
|
|
9
|
+
* responsibility: no user data, no secrets.
|
|
10
|
+
*/
|
|
11
|
+
export function withSpan(name, fn, attributes) {
|
|
12
|
+
const parent = context.active();
|
|
13
|
+
const span = tracer().startSpan(name, attributes === undefined ? {} : { attributes }, parent);
|
|
14
|
+
let result;
|
|
15
|
+
try {
|
|
16
|
+
result = context.with(trace.setSpan(parent, span), fn);
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
markSpanFailed(span, error);
|
|
20
|
+
span.end();
|
|
21
|
+
throw error;
|
|
22
|
+
}
|
|
23
|
+
if (!isThenable(result)) {
|
|
24
|
+
span.end();
|
|
25
|
+
return result;
|
|
26
|
+
}
|
|
27
|
+
// The promise is observed, not replaced: the caller keeps the object `fn` returned.
|
|
28
|
+
result.then(() => {
|
|
29
|
+
span.end();
|
|
30
|
+
}, (error) => {
|
|
31
|
+
markSpanFailed(span, error);
|
|
32
|
+
span.end();
|
|
33
|
+
});
|
|
34
|
+
return result;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=with-span.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"with-span.js","sourceRoot":"","sources":["../../src/span/with-span.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAmB,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC;;;;;GAKG;AACH,MAAM,UAAU,QAAQ,CAAI,IAAY,EAAE,EAAW,EAAE,UAAuB;IAC5E,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAChC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,MAAM,CAAC,CAAC;IAC9F,IAAI,MAAS,CAAC;IAEd,IAAI,CAAC;QACH,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC5B,IAAI,CAAC,GAAG,EAAE,CAAC;QAEX,MAAM,KAAK,CAAC;IACd,CAAC;IAED,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,IAAI,CAAC,GAAG,EAAE,CAAC;QAEX,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,oFAAoF;IACpF,MAAM,CAAC,IAAI,CACT,GAAG,EAAE;QACH,IAAI,CAAC,GAAG,EAAE,CAAC;IACb,CAAC,EACD,CAAC,KAAc,EAAE,EAAE;QACjB,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC5B,IAAI,CAAC,GAAG,EAAE,CAAC;IACb,CAAC,CACF,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ExpectedSpan } from './expected-span.js';
|
|
2
|
+
import type { SpanNode } from './span-node.js';
|
|
3
|
+
/**
|
|
4
|
+
* Asserts that a trace is exactly the tree described: the same spans, under the same parents,
|
|
5
|
+
* in the order they started, with the kinds, statuses and attributes named. On a mismatch it
|
|
6
|
+
* throws an error that lists what differs, then shows both trees with the attributes the
|
|
7
|
+
* expectation names. It depends on no test framework.
|
|
8
|
+
*/
|
|
9
|
+
export declare function expectSpanTree(actual: readonly SpanNode[], expected: readonly ExpectedSpan[]): void;
|
|
10
|
+
//# sourceMappingURL=expect-span-tree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expect-span-tree.d.ts","sourceRoot":"","sources":["../../src/testing/expect-span-tree.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE,EAAE,QAAQ,EAAE,SAAS,YAAY,EAAE,GAAG,IAAI,CAqBnG"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { renderSpanTree } from './render-span-tree.js';
|
|
2
|
+
import { spanMismatches } from './span-mismatches.js';
|
|
3
|
+
/**
|
|
4
|
+
* Asserts that a trace is exactly the tree described: the same spans, under the same parents,
|
|
5
|
+
* in the order they started, with the kinds, statuses and attributes named. On a mismatch it
|
|
6
|
+
* throws an error that lists what differs, then shows both trees with the attributes the
|
|
7
|
+
* expectation names. It depends on no test framework.
|
|
8
|
+
*/
|
|
9
|
+
export function expectSpanTree(actual, expected) {
|
|
10
|
+
const mismatches = spanMismatches(actual, expected);
|
|
11
|
+
if (mismatches.length === 0) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const keys = [...new Set(attributeKeys(expected))];
|
|
15
|
+
throw new Error([
|
|
16
|
+
'The trace is not the one expected.',
|
|
17
|
+
...mismatches.map((mismatch) => ` - ${mismatch}`),
|
|
18
|
+
'',
|
|
19
|
+
'Expected:',
|
|
20
|
+
renderSpanTree(expected, keys),
|
|
21
|
+
'',
|
|
22
|
+
'Found:',
|
|
23
|
+
renderSpanTree(actual, keys),
|
|
24
|
+
].join('\n'));
|
|
25
|
+
}
|
|
26
|
+
function attributeKeys(spans) {
|
|
27
|
+
return spans.flatMap((span) => [...Object.keys(span.attributes ?? {}), ...attributeKeys(span.children ?? [])]);
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=expect-span-tree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expect-span-tree.js","sourceRoot":"","sources":["../../src/testing/expect-span-tree.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,MAA2B,EAAE,QAAiC;IAC3F,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAEpD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEnD,MAAM,IAAI,KAAK,CACb;QACE,oCAAoC;QACpC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,OAAO,QAAQ,EAAE,CAAC;QAClD,EAAE;QACF,WAAW;QACX,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC;QAC9B,EAAE;QACF,QAAQ;QACR,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC;KAC7B,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,KAA8B;IACnD,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,GAAG,aAAa,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACjH,CAAC"}
|