@ddd-ts-kit/tracing 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +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,17 @@
|
|
|
1
|
+
import type { SpanNode } from './span-node.js';
|
|
2
|
+
/**
|
|
3
|
+
* What a spec says of one span. The name and the children are exact: a span that is not
|
|
4
|
+
* listed is a mismatch, and so is a listed one that is missing. The rest is checked when
|
|
5
|
+
* given, except that a span is expected not to be an error unless `status` says so.
|
|
6
|
+
*/
|
|
7
|
+
export interface ExpectedSpan {
|
|
8
|
+
readonly name: string;
|
|
9
|
+
readonly kind?: SpanNode['kind'];
|
|
10
|
+
/** Default: anything but `ERROR`. */
|
|
11
|
+
readonly status?: SpanNode['status'];
|
|
12
|
+
/** The attributes that matter here. `undefined` expects the attribute to be absent. */
|
|
13
|
+
readonly attributes?: Readonly<Record<string, unknown>>;
|
|
14
|
+
/** In the order they start. Default: none. */
|
|
15
|
+
readonly children?: readonly ExpectedSpan[];
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=expected-span.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expected-span.d.ts","sourceRoot":"","sources":["../../src/testing/expected-span.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACjC,qCAAqC;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACrC,uFAAuF;IACvF,QAAQ,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACxD,8CAA8C;IAC9C,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;CAC7C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expected-span.js","sourceRoot":"","sources":["../../src/testing/expected-span.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type Sampler, type SpanProcessor } from '@opentelemetry/sdk-trace-base';
|
|
2
|
+
import type { SpanNode } from './span-node.js';
|
|
3
|
+
export interface TestTracingOptions {
|
|
4
|
+
/** Run after the local root tracker and before the spans are collected, as `extraSpanProcessors` of `initTracing` are. */
|
|
5
|
+
readonly processors?: readonly SpanProcessor[];
|
|
6
|
+
/** Default: every trace is sampled. */
|
|
7
|
+
readonly sampler?: Sampler;
|
|
8
|
+
}
|
|
9
|
+
export interface TestTracing {
|
|
10
|
+
/** Runs the action and answers the spans that ended since it started, as trees. */
|
|
11
|
+
traceOf(action: () => unknown): Promise<SpanNode[]>;
|
|
12
|
+
/** Every span ended since the last `clear` or `traceOf`, as trees. */
|
|
13
|
+
spans(): SpanNode[];
|
|
14
|
+
clear(): void;
|
|
15
|
+
/** Gives the global tracer provider and context manager back. Call it when the spec is over. */
|
|
16
|
+
uninstall(): void;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Registers a real tracer provider that keeps the ended spans in memory, with the local root
|
|
20
|
+
* tracker of `initTracing`: what a spec then observes is what an exporter would be sent.
|
|
21
|
+
*/
|
|
22
|
+
export declare function installTestTracing(options?: TestTracingOptions): TestTracing;
|
|
23
|
+
//# sourceMappingURL=install-test-tracing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-test-tracing.d.ts","sourceRoot":"","sources":["../../src/testing/install-test-tracing.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,OAAO,EACZ,KAAK,aAAa,EACnB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAI/C,MAAM,WAAW,kBAAkB;IACjC,0HAA0H;IAC1H,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IAC/C,uCAAuC;IACvC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,mFAAmF;IACnF,OAAO,CAAC,MAAM,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IACpD,sEAAsE;IACtE,KAAK,IAAI,QAAQ,EAAE,CAAC;IACpB,KAAK,IAAI,IAAI,CAAC;IACd,gGAAgG;IAChG,SAAS,IAAI,IAAI,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,kBAAuB,GAAG,WAAW,CA6BhF"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { context, trace } from '@opentelemetry/api';
|
|
2
|
+
import { AsyncLocalStorageContextManager } from '@opentelemetry/context-async-hooks';
|
|
3
|
+
import { BasicTracerProvider, InMemorySpanExporter, SimpleSpanProcessor, } from '@opentelemetry/sdk-trace-base';
|
|
4
|
+
import { LocalRootTracker } from '../local-root/local-root-tracker.js';
|
|
5
|
+
import { spanTreeOf } from './span-tree-of.js';
|
|
6
|
+
import { StartOrder } from './start-order.js';
|
|
7
|
+
/**
|
|
8
|
+
* Registers a real tracer provider that keeps the ended spans in memory, with the local root
|
|
9
|
+
* tracker of `initTracing`: what a spec then observes is what an exporter would be sent.
|
|
10
|
+
*/
|
|
11
|
+
export function installTestTracing(options = {}) {
|
|
12
|
+
const exporter = new InMemorySpanExporter();
|
|
13
|
+
const order = new StartOrder();
|
|
14
|
+
const provider = collectingProvider(options, order, exporter);
|
|
15
|
+
const spans = () => spanTreeOf(exporter.getFinishedSpans(), (spanId) => order.positionOf(spanId));
|
|
16
|
+
const clear = () => {
|
|
17
|
+
exporter.reset();
|
|
18
|
+
order.clear();
|
|
19
|
+
};
|
|
20
|
+
context.setGlobalContextManager(new AsyncLocalStorageContextManager().enable());
|
|
21
|
+
trace.setGlobalTracerProvider(provider);
|
|
22
|
+
return {
|
|
23
|
+
spans,
|
|
24
|
+
clear,
|
|
25
|
+
async traceOf(action) {
|
|
26
|
+
clear();
|
|
27
|
+
await action();
|
|
28
|
+
return spans();
|
|
29
|
+
},
|
|
30
|
+
uninstall() {
|
|
31
|
+
trace.disable();
|
|
32
|
+
context.disable();
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function collectingProvider(options, order, exporter) {
|
|
37
|
+
const spanProcessors = [
|
|
38
|
+
new LocalRootTracker(),
|
|
39
|
+
order,
|
|
40
|
+
...(options.processors ?? []),
|
|
41
|
+
new SimpleSpanProcessor(exporter),
|
|
42
|
+
];
|
|
43
|
+
return new BasicTracerProvider({
|
|
44
|
+
spanProcessors,
|
|
45
|
+
...(options.sampler === undefined ? {} : { sampler: options.sampler }),
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=install-test-tracing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-test-tracing.js","sourceRoot":"","sources":["../../src/testing/install-test-tracing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,+BAA+B,EAAE,MAAM,oCAAoC,CAAC;AACrF,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,GAGpB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAEvE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAmB9C;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAO,GAAuB,EAAE;IACjE,MAAM,QAAQ,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC5C,MAAM,KAAK,GAAG,IAAI,UAAU,EAAE,CAAC;IAE/B,MAAM,QAAQ,GAAG,kBAAkB,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC9D,MAAM,KAAK,GAAG,GAAe,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,gBAAgB,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IAE9G,MAAM,KAAK,GAAG,GAAS,EAAE;QACvB,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjB,KAAK,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC,CAAC;IAEF,OAAO,CAAC,uBAAuB,CAAC,IAAI,+BAA+B,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;IAChF,KAAK,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IAExC,OAAO;QACL,KAAK;QACL,KAAK;QACL,KAAK,CAAC,OAAO,CAAC,MAAM;YAClB,KAAK,EAAE,CAAC;YACR,MAAM,MAAM,EAAE,CAAC;YAEf,OAAO,KAAK,EAAE,CAAC;QACjB,CAAC;QACD,SAAS;YACP,KAAK,CAAC,OAAO,EAAE,CAAC;YAChB,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CACzB,OAA2B,EAC3B,KAAiB,EACjB,QAA8B;IAE9B,MAAM,cAAc,GAAG;QACrB,IAAI,gBAAgB,EAAE;QACtB,KAAK;QACL,GAAG,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;QAC7B,IAAI,mBAAmB,CAAC,QAAQ,CAAC;KAClC,CAAC;IAEF,OAAO,IAAI,mBAAmB,CAAC;QAC7B,cAAc;QACd,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;KACvE,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ExpectedSpan } from './expected-span.js';
|
|
2
|
+
/**
|
|
3
|
+
* A tree as indented text, one span per line: `name [KIND] ERROR {key=value}`. Only the
|
|
4
|
+
* attributes named in `keys` are shown, so two trees rendered with the same keys compare line
|
|
5
|
+
* by line.
|
|
6
|
+
*/
|
|
7
|
+
export declare function renderSpanTree(spans: readonly ExpectedSpan[], keys?: readonly string[], depth?: number): string;
|
|
8
|
+
//# sourceMappingURL=render-span-tree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-span-tree.d.ts","sourceRoot":"","sources":["../../src/testing/render-span-tree.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,EAAE,IAAI,GAAE,SAAS,MAAM,EAAO,EAAE,KAAK,SAAI,GAAG,MAAM,CAK9G"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A tree as indented text, one span per line: `name [KIND] ERROR {key=value}`. Only the
|
|
3
|
+
* attributes named in `keys` are shown, so two trees rendered with the same keys compare line
|
|
4
|
+
* by line.
|
|
5
|
+
*/
|
|
6
|
+
export function renderSpanTree(spans, keys = [], depth = 0) {
|
|
7
|
+
return spans
|
|
8
|
+
.flatMap((span) => [lineOf(span, keys, depth), renderSpanTree(span.children ?? [], keys, depth + 1)])
|
|
9
|
+
.filter((line) => line !== '')
|
|
10
|
+
.join('\n');
|
|
11
|
+
}
|
|
12
|
+
function lineOf(span, keys, depth) {
|
|
13
|
+
const attributes = keys
|
|
14
|
+
.filter((key) => span.attributes?.[key] !== undefined)
|
|
15
|
+
.map((key) => `${key}=${JSON.stringify(span.attributes?.[key])}`);
|
|
16
|
+
return [
|
|
17
|
+
`${' '.repeat(depth)}${span.name}`,
|
|
18
|
+
...(span.kind === undefined ? [] : [`[${span.kind}]`]),
|
|
19
|
+
...(span.status === 'ERROR' ? ['ERROR'] : []),
|
|
20
|
+
...(attributes.length === 0 ? [] : [`{${attributes.join(', ')}}`]),
|
|
21
|
+
].join(' ');
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=render-span-tree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-span-tree.js","sourceRoot":"","sources":["../../src/testing/render-span-tree.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,KAA8B,EAAE,IAAI,GAAsB,EAAE,EAAE,KAAK,GAAG,CAAC;IACpG,OAAO,KAAK;SACT,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,cAAc,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;SACpG,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC;SAC7B,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,MAAM,CAAC,IAAkB,EAAE,IAAuB,EAAE,KAAa;IACxE,MAAM,UAAU,GAAG,IAAI;SACpB,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC;SACrD,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IAEpE,OAAO;QACL,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE;QACnC,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QACtD,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,GAAG,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;KACnE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ExpectedSpan } from './expected-span.js';
|
|
2
|
+
import type { SpanNode } from './span-node.js';
|
|
3
|
+
/** What differs between the spans found under one parent and the ones expected there, as sentences. */
|
|
4
|
+
export declare function spanMismatches(actual: readonly SpanNode[], expected: readonly ExpectedSpan[], under?: string): string[];
|
|
5
|
+
//# sourceMappingURL=span-mismatches.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"span-mismatches.d.ts","sourceRoot":"","sources":["../../src/testing/span-mismatches.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,uGAAuG;AACvG,wBAAgB,cAAc,CAC5B,MAAM,EAAE,SAAS,QAAQ,EAAE,EAC3B,QAAQ,EAAE,SAAS,YAAY,EAAE,EACjC,KAAK,SAAc,GAClB,MAAM,EAAE,CAeV"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/** What differs between the spans found under one parent and the ones expected there, as sentences. */
|
|
2
|
+
export function spanMismatches(actual, expected, under = 'the trace') {
|
|
3
|
+
const found = actual.map((span) => span.name).join(', ') || 'none';
|
|
4
|
+
const wanted = expected.map((span) => span.name).join(', ') || 'none';
|
|
5
|
+
if (found !== wanted) {
|
|
6
|
+
return [`under ${under}: expected the spans [${wanted}], found [${found}]`];
|
|
7
|
+
}
|
|
8
|
+
return expected.flatMap((span, index) => {
|
|
9
|
+
const node = actual[index];
|
|
10
|
+
return node === undefined
|
|
11
|
+
? []
|
|
12
|
+
: [...ownMismatches(node, span), ...spanMismatches(node.children, span.children ?? [], `"${span.name}"`)];
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
function ownMismatches(actual, expected) {
|
|
16
|
+
const mismatches = [];
|
|
17
|
+
if (expected.kind !== undefined && expected.kind !== actual.kind) {
|
|
18
|
+
mismatches.push(`"${actual.name}": expected the kind ${expected.kind}, found ${actual.kind}`);
|
|
19
|
+
}
|
|
20
|
+
if (expected.status === undefined ? actual.status === 'ERROR' : expected.status !== actual.status) {
|
|
21
|
+
mismatches.push(`"${actual.name}": expected the status ${expected.status ?? 'not ERROR'}, found ${actual.status}`);
|
|
22
|
+
}
|
|
23
|
+
for (const [key, value] of Object.entries(expected.attributes ?? {})) {
|
|
24
|
+
const found = actual.attributes[key];
|
|
25
|
+
if (JSON.stringify(found) !== JSON.stringify(value)) {
|
|
26
|
+
mismatches.push(`"${actual.name}": expected ${key} to be ${shown(value)}, found ${shown(found)}`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return mismatches;
|
|
30
|
+
}
|
|
31
|
+
function shown(value) {
|
|
32
|
+
return value === undefined ? 'absent' : JSON.stringify(value);
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=span-mismatches.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"span-mismatches.js","sourceRoot":"","sources":["../../src/testing/span-mismatches.ts"],"names":[],"mappings":"AAGA,uGAAuG;AACvG,MAAM,UAAU,cAAc,CAC5B,MAA2B,EAC3B,QAAiC,EACjC,KAAK,GAAG,WAAW;IAEnB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC;IACnE,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC;IAEtE,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QACrB,OAAO,CAAC,SAAS,KAAK,yBAAyB,MAAM,aAAa,KAAK,GAAG,CAAC,CAAC;IAC9E,CAAC;IAED,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACtC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAE3B,OAAO,IAAI,KAAK,SAAS;YACvB,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE,EAAE,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IAC9G,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,aAAa,CAAC,MAAgB,EAAE,QAAsB;IAC7D,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC;QACjE,UAAU,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,wBAAwB,QAAQ,CAAC,IAAI,WAAW,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAChG,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;QAClG,UAAU,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,0BAA0B,QAAQ,CAAC,MAAM,IAAI,WAAW,WAAW,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACrH,CAAC;IAED,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,CAAC;QACrE,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAErC,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YACpD,UAAU,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,eAAe,GAAG,UAAU,KAAK,CAAC,KAAK,CAAC,WAAW,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACpG,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,KAAK,CAAC,KAAc;IAC3B,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** One span of a trace as plain data, with the spans it is the parent of in the order they started. */
|
|
2
|
+
export interface SpanNode {
|
|
3
|
+
readonly name: string;
|
|
4
|
+
readonly kind: 'INTERNAL' | 'SERVER' | 'CLIENT' | 'PRODUCER' | 'CONSUMER';
|
|
5
|
+
readonly status: 'UNSET' | 'OK' | 'ERROR';
|
|
6
|
+
readonly attributes: Readonly<Record<string, unknown>>;
|
|
7
|
+
readonly traceId: string;
|
|
8
|
+
readonly spanId: string;
|
|
9
|
+
/** The trace ids the span links to. */
|
|
10
|
+
readonly links: readonly string[];
|
|
11
|
+
readonly children: readonly SpanNode[];
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=span-node.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"span-node.d.ts","sourceRoot":"","sources":["../../src/testing/span-node.ts"],"names":[],"mappings":"AAAA,uGAAuG;AACvG,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAC;IAC1E,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,GAAG,OAAO,CAAC;IAC1C,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACvD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,uCAAuC;IACvC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,SAAS,QAAQ,EAAE,CAAC;CACxC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"span-node.js","sourceRoot":"","sources":["../../src/testing/span-node.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ReadableSpan } from '@opentelemetry/sdk-trace-base';
|
|
2
|
+
import type { SpanNode } from './span-node.js';
|
|
3
|
+
/**
|
|
4
|
+
* The ended spans as trees: a span whose parent is not among them (no parent, or one of
|
|
5
|
+
* another process) is a root. Roots and children come in the order given by `positionOf`.
|
|
6
|
+
*/
|
|
7
|
+
export declare function spanTreeOf(spans: readonly ReadableSpan[], positionOf: (spanId: string) => number): SpanNode[];
|
|
8
|
+
//# sourceMappingURL=span-tree-of.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"span-tree-of.d.ts","sourceRoot":"","sources":["../../src/testing/span-tree-of.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAgB/C;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,EAAE,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,QAAQ,EAAE,CAiB7G"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { SpanKind, SpanStatusCode } from '@opentelemetry/api';
|
|
2
|
+
const KINDS = {
|
|
3
|
+
[SpanKind.INTERNAL]: 'INTERNAL',
|
|
4
|
+
[SpanKind.SERVER]: 'SERVER',
|
|
5
|
+
[SpanKind.CLIENT]: 'CLIENT',
|
|
6
|
+
[SpanKind.PRODUCER]: 'PRODUCER',
|
|
7
|
+
[SpanKind.CONSUMER]: 'CONSUMER',
|
|
8
|
+
};
|
|
9
|
+
const STATUSES = {
|
|
10
|
+
[SpanStatusCode.UNSET]: 'UNSET',
|
|
11
|
+
[SpanStatusCode.OK]: 'OK',
|
|
12
|
+
[SpanStatusCode.ERROR]: 'ERROR',
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* The ended spans as trees: a span whose parent is not among them (no parent, or one of
|
|
16
|
+
* another process) is a root. Roots and children come in the order given by `positionOf`.
|
|
17
|
+
*/
|
|
18
|
+
export function spanTreeOf(spans, positionOf) {
|
|
19
|
+
const ordered = [...spans].sort((a, b) => positionOf(a.spanContext().spanId) - positionOf(b.spanContext().spanId));
|
|
20
|
+
const known = new Set(ordered.map((span) => span.spanContext().spanId));
|
|
21
|
+
const parentOf = (span) => span.parentSpanContext?.spanId;
|
|
22
|
+
const nodeOf = (span) => ({
|
|
23
|
+
name: span.name,
|
|
24
|
+
kind: KINDS[span.kind],
|
|
25
|
+
status: STATUSES[span.status.code],
|
|
26
|
+
attributes: { ...span.attributes },
|
|
27
|
+
traceId: span.spanContext().traceId,
|
|
28
|
+
spanId: span.spanContext().spanId,
|
|
29
|
+
links: span.links.map((link) => link.context.traceId),
|
|
30
|
+
children: ordered.filter((child) => parentOf(child) === span.spanContext().spanId).map(nodeOf),
|
|
31
|
+
});
|
|
32
|
+
return ordered.filter((span) => !known.has(parentOf(span) ?? '')).map(nodeOf);
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=span-tree-of.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"span-tree-of.js","sourceRoot":"","sources":["../../src/testing/span-tree-of.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAI9D,MAAM,KAAK,GAAiD;IAC1D,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,UAAU;IAC/B,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ;IAC3B,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ;IAC3B,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,UAAU;IAC/B,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,UAAU;CAChC,CAAC;AAEF,MAAM,QAAQ,GAAyD;IACrE,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,OAAO;IAC/B,CAAC,cAAc,CAAC,EAAE,CAAC,EAAE,IAAI;IACzB,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,OAAO;CAChC,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,KAA8B,EAAE,UAAsC;IAC/F,MAAM,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IACnH,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IACxE,MAAM,QAAQ,GAAG,CAAC,IAAkB,EAAsB,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC;IAE5F,MAAM,MAAM,GAAG,CAAC,IAAkB,EAAY,EAAE,CAAC,CAAC;QAChD,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QACtB,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;QAClC,UAAU,EAAE,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE;QAClC,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO;QACnC,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM;QACjC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;QACrD,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;KAC/F,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAChF,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Span } from '@opentelemetry/api';
|
|
2
|
+
/** Span processor that remembers the order spans started in: start times alone can tie. */
|
|
3
|
+
export declare class StartOrder {
|
|
4
|
+
private readonly positions;
|
|
5
|
+
onStart(span: Span): void;
|
|
6
|
+
onEnd(): void;
|
|
7
|
+
forceFlush(): Promise<void>;
|
|
8
|
+
shutdown(): Promise<void>;
|
|
9
|
+
positionOf(spanId: string): number;
|
|
10
|
+
clear(): void;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=start-order.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start-order.d.ts","sourceRoot":"","sources":["../../src/testing/start-order.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE/C,2FAA2F;AAC3F,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;IAEvD,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAExB;IAED,KAAK,IAAI,IAAI,CAAG;IAEV,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAG;IAE9B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAG;IAElC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEjC;IAED,KAAK,IAAI,IAAI,CAEZ;CACF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** Span processor that remembers the order spans started in: start times alone can tie. */
|
|
2
|
+
export class StartOrder {
|
|
3
|
+
positions = new Map();
|
|
4
|
+
onStart(span) {
|
|
5
|
+
this.positions.set(span.spanContext().spanId, this.positions.size);
|
|
6
|
+
}
|
|
7
|
+
onEnd() { }
|
|
8
|
+
async forceFlush() { }
|
|
9
|
+
async shutdown() { }
|
|
10
|
+
positionOf(spanId) {
|
|
11
|
+
return this.positions.get(spanId) ?? Number.MAX_SAFE_INTEGER;
|
|
12
|
+
}
|
|
13
|
+
clear() {
|
|
14
|
+
this.positions.clear();
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=start-order.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start-order.js","sourceRoot":"","sources":["../../src/testing/start-order.ts"],"names":[],"mappings":"AAEA,2FAA2F;AAC3F,MAAM,OAAO,UAAU;IACJ,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEvD,OAAO,CAAC,IAAU;QAChB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,KAAU,CAAC;IAEhB,KAAK,CAAC,UAAU,KAAmB,CAAC;IAEpC,KAAK,CAAC,QAAQ,KAAmB,CAAC;IAElC,UAAU,CAAC,MAAc;QACvB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,gBAAgB,CAAC;IAC/D,CAAC;IAED,KAAK;QACH,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;CACF"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type { ExpectedSpan } from './testing/expected-span.js';
|
|
2
|
+
export { expectSpanTree } from './testing/expect-span-tree.js';
|
|
3
|
+
export { installTestTracing, type TestTracing, type TestTracingOptions } from './testing/install-test-tracing.js';
|
|
4
|
+
export { renderSpanTree } from './testing/render-span-tree.js';
|
|
5
|
+
export type { SpanNode } from './testing/span-node.js';
|
|
6
|
+
//# sourceMappingURL=testing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,KAAK,WAAW,EAAE,KAAK,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAClH,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,YAAY,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC"}
|
package/dist/testing.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAA6C,MAAM,mCAAmC,CAAC;AAClH,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type BusMiddleware } from '@ddd-ts-kit/kernel';
|
|
2
|
+
/**
|
|
3
|
+
* The bus middleware that makes one span per use case: `command PlaceOrder`, `query GetOrder`,
|
|
4
|
+
* with the bounded context of the handler and the outcome. A business refusal (`DomainError`)
|
|
5
|
+
* is an answer: the span says `refused` and the code, and is not an error. Anything else marks
|
|
6
|
+
* it failed. Put it after the authorization and outside the unit of work, as `kernelModule`
|
|
7
|
+
* does: a message refused by the guard never started, and the span covers the commit.
|
|
8
|
+
*/
|
|
9
|
+
export declare function traceUseCases(): BusMiddleware;
|
|
10
|
+
//# sourceMappingURL=trace-use-cases.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace-use-cases.d.ts","sourceRoot":"","sources":["../../src/use-case/trace-use-cases.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAM3E;;;;;;GAMG;AACH,wBAAgB,aAAa,IAAI,aAAa,CAsB7C"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { SpanKind } from '@opentelemetry/api';
|
|
2
|
+
import { isUnexpectedError } from '@ddd-ts-kit/kernel';
|
|
3
|
+
import { inSpan } from '../span/in-span.js';
|
|
4
|
+
import { markSpanFailed } from '../span/mark-span-failed.js';
|
|
5
|
+
import { OUTCOME_ATTRIBUTE } from '../span/outcome-attribute.js';
|
|
6
|
+
import { refusalCode } from '../span/refusal-code.js';
|
|
7
|
+
/**
|
|
8
|
+
* The bus middleware that makes one span per use case: `command PlaceOrder`, `query GetOrder`,
|
|
9
|
+
* with the bounded context of the handler and the outcome. A business refusal (`DomainError`)
|
|
10
|
+
* is an answer: the span says `refused` and the code, and is not an error. Anything else marks
|
|
11
|
+
* it failed. Put it after the authorization and outside the unit of work, as `kernelModule`
|
|
12
|
+
* does: a message refused by the guard never started, and the span covers the commit.
|
|
13
|
+
*/
|
|
14
|
+
export function traceUseCases() {
|
|
15
|
+
return (_message, next, info) => {
|
|
16
|
+
const attributes = {
|
|
17
|
+
'app.use_case.kind': info.kind,
|
|
18
|
+
'app.use_case.name': info.name,
|
|
19
|
+
...(info.context === undefined ? {} : { 'app.context': info.context }),
|
|
20
|
+
};
|
|
21
|
+
const start = {
|
|
22
|
+
name: `${info.kind} ${info.name}`,
|
|
23
|
+
options: { kind: SpanKind.INTERNAL, attributes },
|
|
24
|
+
onFailure: refusedOrFailed,
|
|
25
|
+
};
|
|
26
|
+
return inSpan(start, async (span) => {
|
|
27
|
+
const result = await next();
|
|
28
|
+
span.setAttribute(OUTCOME_ATTRIBUTE, 'succeeded');
|
|
29
|
+
return result;
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function refusedOrFailed(span, error) {
|
|
34
|
+
if (isUnexpectedError(error)) {
|
|
35
|
+
markSpanFailed(span, error);
|
|
36
|
+
span.setAttribute(OUTCOME_ATTRIBUTE, 'failed');
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
span.setAttributes({ [OUTCOME_ATTRIBUTE]: 'refused', ...refusalCode(error) });
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=trace-use-cases.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace-use-cases.js","sourceRoot":"","sources":["../../src/use-case/trace-use-cases.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAa,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAsB,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD;;;;;;GAMG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QAC9B,MAAM,UAAU,GAAG;YACjB,mBAAmB,EAAE,IAAI,CAAC,IAAI;YAC9B,mBAAmB,EAAE,IAAI,CAAC,IAAI;YAC9B,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;SACvE,CAAC;QAEF,MAAM,KAAK,GAAG;YACZ,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE;YACjC,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE;YAChD,SAAS,EAAE,eAAe;SAC3B,CAAC;QAEF,OAAO,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAClC,MAAM,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;YAE5B,IAAI,CAAC,YAAY,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC;YAElD,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,IAAU,EAAE,KAAc;IACjD,IAAI,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7B,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC5B,IAAI,CAAC,YAAY,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;QAE/C,OAAO;IACT,CAAC;IAED,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,iBAAiB,CAAC,EAAE,SAAS,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAChF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,77 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ddd-ts-kit/tracing",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Non-invasive OpenTelemetry tracing: adapters are wrapped at the composition root, the domain never knows.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/gbourgeat/ddd-ts-kit.git",
|
|
9
|
+
"directory": "packages/tracing"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://github.com/gbourgeat/ddd-ts-kit/tree/main/packages/tracing#readme",
|
|
12
|
+
"bugs": "https://github.com/gbourgeat/ddd-ts-kit/issues",
|
|
13
|
+
"publishConfig": {
|
|
14
|
+
"access": "public",
|
|
15
|
+
"provenance": true
|
|
16
|
+
},
|
|
17
|
+
"type": "module",
|
|
18
|
+
"sideEffects": false,
|
|
19
|
+
"exports": {
|
|
20
|
+
".": {
|
|
21
|
+
"types": "./dist/index.d.ts",
|
|
22
|
+
"default": "./dist/index.js"
|
|
23
|
+
},
|
|
24
|
+
"./node": {
|
|
25
|
+
"types": "./dist/node.d.ts",
|
|
26
|
+
"default": "./dist/node.js"
|
|
27
|
+
},
|
|
28
|
+
"./testing": {
|
|
29
|
+
"types": "./dist/testing.d.ts",
|
|
30
|
+
"default": "./dist/testing.js"
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
"files": [
|
|
34
|
+
"dist"
|
|
35
|
+
],
|
|
36
|
+
"dependencies": {
|
|
37
|
+
"@ddd-ts-kit/kernel": "0.1.0"
|
|
38
|
+
},
|
|
39
|
+
"peerDependencies": {
|
|
40
|
+
"@opentelemetry/api": "^1.9.0",
|
|
41
|
+
"@opentelemetry/auto-instrumentations-node": ">=0.60.0",
|
|
42
|
+
"@opentelemetry/context-async-hooks": ">=2.0.0",
|
|
43
|
+
"@opentelemetry/exporter-trace-otlp-http": ">=0.200.0",
|
|
44
|
+
"@opentelemetry/sdk-node": ">=0.200.0",
|
|
45
|
+
"@opentelemetry/sdk-trace-base": ">=2.0.0"
|
|
46
|
+
},
|
|
47
|
+
"peerDependenciesMeta": {
|
|
48
|
+
"@opentelemetry/sdk-node": {
|
|
49
|
+
"optional": true
|
|
50
|
+
},
|
|
51
|
+
"@opentelemetry/auto-instrumentations-node": {
|
|
52
|
+
"optional": true
|
|
53
|
+
},
|
|
54
|
+
"@opentelemetry/exporter-trace-otlp-http": {
|
|
55
|
+
"optional": true
|
|
56
|
+
},
|
|
57
|
+
"@opentelemetry/sdk-trace-base": {
|
|
58
|
+
"optional": true
|
|
59
|
+
},
|
|
60
|
+
"@opentelemetry/context-async-hooks": {
|
|
61
|
+
"optional": true
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
"devDependencies": {
|
|
65
|
+
"@ddd-ts-kit/audit": "0.1.0",
|
|
66
|
+
"@ddd-ts-kit/di": "0.1.0",
|
|
67
|
+
"@ddd-ts-kit/events": "0.1.0",
|
|
68
|
+
"@ddd-ts-kit/http": "0.1.0",
|
|
69
|
+
"@ddd-ts-kit/scheduling": "0.1.0",
|
|
70
|
+
"@opentelemetry/api": "^1.9.1",
|
|
71
|
+
"@opentelemetry/auto-instrumentations-node": "latest",
|
|
72
|
+
"@opentelemetry/context-async-hooks": "^2.0.0",
|
|
73
|
+
"@opentelemetry/exporter-trace-otlp-http": "^0.223.0",
|
|
74
|
+
"@opentelemetry/sdk-node": "^0.223.0",
|
|
75
|
+
"@opentelemetry/sdk-trace-base": "^2.0.0"
|
|
76
|
+
}
|
|
77
|
+
}
|