@fractaal/pi-telemetry 0.86.9 → 1.4.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.
@@ -0,0 +1,14 @@
1
+ /** Bind instrument names, kinds, metadata, and exact measurement attributes to one or more schemas. */
2
+ export function createTypedMetrics(metrics, schemas) {
3
+ const definitions = new Map();
4
+ for (const schema of schemas) {
5
+ for (const [name, definition] of Object.entries(schema.metrics ?? {}))
6
+ definitions.set(name, definition);
7
+ }
8
+ return {
9
+ counter: (name) => metrics.counter(name, definitions.get(name)),
10
+ upDownCounter: (name) => metrics.upDownCounter(name, definitions.get(name)),
11
+ histogram: (name) => metrics.histogram(name, definitions.get(name)),
12
+ };
13
+ }
14
+ //# sourceMappingURL=metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AA+HA,uGAAuG;AACvG,MAAM,UAAU,kBAAkB,CACjC,OAAyB,EACzB,OAGmF;IAEnF,MAAM,WAAW,GAAG,IAAI,GAAG,EAAqC,CAAC;IACjE,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC9B,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;YAAE,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC1G,CAAC;IACD,OAAO;QACN,OAAO,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACvE,aAAa,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,EAAE,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnF,SAAS,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;KAC9B,CAAC;AAChD,CAAC","sourcesContent":["import type {\n\tExactTelemetryAttributes,\n\tInferRequiredAndOptionalAttributes,\n\tSpanAttributes,\n\tTelemetryContext,\n\tTelemetrySchemaDefinition,\n\tTelemetryStartAttributeDefinition,\n} from \"./index.ts\";\n\nexport interface InstrumentOptions {\n\tdescription?: string;\n\tunit?: string;\n}\n\nexport interface HistogramOptions extends InstrumentOptions {\n\t/** Bucket hints; callers supply finite, strictly increasing values. */\n\tboundaries?: readonly number[];\n}\n\nexport interface TelemetryCounter {\n\tadd(value: number, attributes?: SpanAttributes): void;\n}\n\nexport interface TelemetryUpDownCounter {\n\tadd(value: number, attributes?: SpanAttributes): void;\n}\n\nexport interface TelemetryHistogram {\n\trecord(value: number, attributes?: SpanAttributes, context?: TelemetryContext): void;\n}\n\n/**\n * Optional adapter capability with synchronous factories and recording methods.\n * Typed inputs are trusted; callers supply finite measurements and nonnegative counter increments.\n * Malformed input behavior is unspecified.\n */\nexport interface TelemetryMetrics {\n\tcounter(name: string, options?: InstrumentOptions): TelemetryCounter;\n\tupDownCounter(name: string, options?: InstrumentOptions): TelemetryUpDownCounter;\n\thistogram(name: string, options?: HistogramOptions): TelemetryHistogram;\n}\n\nexport type TelemetryMetricAttributeDefinition = TelemetryStartAttributeDefinition & { cardinality?: \"low\" };\n\nexport type TelemetryMetricDefinition = {\n\tdescription: string;\n\tunit?: string;\n\tattributes: Record<string, TelemetryMetricAttributeDefinition>;\n} & ({ kind: \"counter\" | \"upDownCounter\"; boundaries?: never } | { kind: \"histogram\"; boundaries?: readonly number[] });\n\ntype MetricKind = TelemetryMetricDefinition[\"kind\"];\ntype MetricSchemas = readonly [TelemetrySchemaDefinition, ...TelemetrySchemaDefinition[]];\n\ntype MetricsOf<Schema extends TelemetrySchemaDefinition> = Schema extends {\n\tmetrics: infer Metrics extends Record<string, TelemetryMetricDefinition>;\n}\n\t? Metrics\n\t: Record<never, never>;\n\ntype MetricNames<\n\tSchema extends TelemetrySchemaDefinition,\n\tKind extends MetricKind,\n> = Schema extends TelemetrySchemaDefinition\n\t? {\n\t\t\t[Name in keyof MetricsOf<Schema>]: MetricsOf<Schema>[Name] extends { kind: Kind } ? Name : never;\n\t\t}[keyof MetricsOf<Schema>] &\n\t\t\tstring\n\t: never;\n\ntype MetricByName<\n\tSchema extends TelemetrySchemaDefinition,\n\tName extends string,\n> = Schema extends TelemetrySchemaDefinition\n\t? Name extends keyof MetricsOf<Schema>\n\t\t? MetricsOf<Schema>[Name]\n\t\t: never\n\t: never;\n\ntype DuplicateMetricNames<\n\tSchemas extends readonly TelemetrySchemaDefinition[],\n\tSeen extends string = never,\n> = Schemas extends readonly [\n\tinfer Schema extends TelemetrySchemaDefinition,\n\t...infer Rest extends readonly TelemetrySchemaDefinition[],\n]\n\t? Extract<keyof MetricsOf<Schema>, Seen> | DuplicateMetricNames<Rest, Seen | (keyof MetricsOf<Schema> & string)>\n\t: never;\n\ntype MetricAttributes<Definition extends TelemetryMetricDefinition> = InferRequiredAndOptionalAttributes<\n\tDefinition[\"attributes\"]\n>;\n\ntype MeasurementArguments<\n\tDefinition extends TelemetryMetricDefinition,\n\tAttributes extends MetricAttributes<Definition>,\n> = {\n\t[Name in keyof Definition[\"attributes\"]]: Definition[\"attributes\"][Name][\"required\"] extends true ? Name : never;\n}[keyof Definition[\"attributes\"]] extends never\n\t? [attributes?: ExactTelemetryAttributes<MetricAttributes<Definition>, Attributes>]\n\t: [attributes: ExactTelemetryAttributes<MetricAttributes<Definition>, Attributes>];\n\nexport type SchemaTelemetryCounter<Definition extends TelemetryMetricDefinition> = {\n\tadd<const Attributes extends MetricAttributes<Definition> = MetricAttributes<Definition>>(\n\t\tvalue: number,\n\t\t...args: MeasurementArguments<Definition, Attributes>\n\t): void;\n};\n\nexport type SchemaTelemetryHistogram<Definition extends TelemetryMetricDefinition> = {\n\trecord<const Attributes extends MetricAttributes<Definition> = MetricAttributes<Definition>>(\n\t\tvalue: number,\n\t\t...args: [...MeasurementArguments<Definition, Attributes>, context?: TelemetryContext]\n\t): void;\n};\n\nexport interface TypedTelemetryMetrics<Schemas extends MetricSchemas> {\n\tcounter<Name extends MetricNames<Schemas[number], \"counter\">>(\n\t\tname: Name,\n\t): SchemaTelemetryCounter<MetricByName<Schemas[number], Name>>;\n\tupDownCounter<Name extends MetricNames<Schemas[number], \"upDownCounter\">>(\n\t\tname: Name,\n\t): SchemaTelemetryCounter<MetricByName<Schemas[number], Name>>;\n\thistogram<Name extends MetricNames<Schemas[number], \"histogram\">>(\n\t\tname: Name,\n\t): SchemaTelemetryHistogram<MetricByName<Schemas[number], Name>>;\n}\n\n/** Bind instrument names, kinds, metadata, and exact measurement attributes to one or more schemas. */\nexport function createTypedMetrics<const Schemas extends MetricSchemas>(\n\tmetrics: TelemetryMetrics,\n\tschemas: Schemas &\n\t\t([DuplicateMetricNames<Schemas>] extends [never]\n\t\t\t? unknown\n\t\t\t: { readonly \"duplicate telemetry metric names\": DuplicateMetricNames<Schemas> }),\n): TypedTelemetryMetrics<Schemas> {\n\tconst definitions = new Map<string, TelemetryMetricDefinition>();\n\tfor (const schema of schemas) {\n\t\tfor (const [name, definition] of Object.entries(schema.metrics ?? {})) definitions.set(name, definition);\n\t}\n\treturn {\n\t\tcounter: (name: string) => metrics.counter(name, definitions.get(name)),\n\t\tupDownCounter: (name: string) => metrics.upDownCounter(name, definitions.get(name)),\n\t\thistogram: (name: string) => metrics.histogram(name, definitions.get(name)),\n\t} as unknown as TypedTelemetryMetrics<Schemas>;\n}\n"]}
package/dist/noop.d.ts CHANGED
@@ -1,4 +1,9 @@
1
- import type { TelemetryContext } from "./index.ts";
1
+ import type { TelemetryPropagation, TelemetrySpan } from "./index.ts";
2
+ import type { TelemetryMetrics } from "./metrics.ts";
3
+ /** Shared instruments that never inspect or retain metadata, measurements, or contexts. */
4
+ export declare const NOOP_TELEMETRY_METRICS: TelemetryMetrics;
5
+ /** Shared propagation capability that neither inspects nor retains its inputs. */
6
+ export declare const NOOP_TELEMETRY_PROPAGATION: TelemetryPropagation;
2
7
  /** Shared telemetry context used when an application does not provide one. */
3
- export declare const NOOP_TELEMETRY_CONTEXT: TelemetryContext;
8
+ export declare const NOOP_TELEMETRY_CONTEXT: TelemetrySpan;
4
9
  //# sourceMappingURL=noop.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"noop.d.ts","sourceRoot":"","sources":["../src/noop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,gBAAgB,EAAiB,MAAM,YAAY,CAAC;AAkB/E,8EAA8E;AAC9E,eAAO,MAAM,sBAAsB,EAAE,gBAAoC,CAAC"}
1
+ {"version":3,"file":"noop.d.ts","sourceRoot":"","sources":["../src/noop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,oBAAoB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACnF,OAAO,KAAK,EAAwC,gBAAgB,EAA0B,MAAM,cAAc,CAAC;AAUnH,2FAA2F;AAC3F,eAAO,MAAM,sBAAsB,EAAE,gBAInC,CAAC;AAEH,kFAAkF;AAClF,eAAO,MAAM,0BAA0B,EAAE,oBAGvC,CAAC;AAaH,8EAA8E;AAC9E,eAAO,MAAM,sBAAsB,EAAE,aAAiC,CAAC"}
package/dist/noop.js CHANGED
@@ -1,13 +1,25 @@
1
- function startNoopSpan(_options, callback) {
2
- try {
3
- return Promise.resolve(callback(noopTelemetrySpan));
4
- }
5
- catch (error) {
6
- return Promise.reject(error);
7
- }
1
+ async function startNoopSpan(_options, callback) {
2
+ return callback(noopTelemetrySpan);
8
3
  }
4
+ const noopCounter = Object.freeze({ add: () => { } });
5
+ const noopUpDownCounter = Object.freeze({ add: () => { } });
6
+ const noopHistogram = Object.freeze({ record: () => { } });
7
+ /** Shared instruments that never inspect or retain metadata, measurements, or contexts. */
8
+ export const NOOP_TELEMETRY_METRICS = Object.freeze({
9
+ counter: () => noopCounter,
10
+ upDownCounter: () => noopUpDownCounter,
11
+ histogram: () => noopHistogram,
12
+ });
13
+ /** Shared propagation capability that neither inspects nor retains its inputs. */
14
+ export const NOOP_TELEMETRY_PROPAGATION = Object.freeze({
15
+ inject: () => undefined,
16
+ extract: () => NOOP_TELEMETRY_CONTEXT,
17
+ });
9
18
  const noopTelemetrySpan = {
19
+ metrics: NOOP_TELEMETRY_METRICS,
20
+ propagation: NOOP_TELEMETRY_PROPAGATION,
10
21
  startSpan: startNoopSpan,
22
+ addLink: () => { },
11
23
  addEvent: () => { },
12
24
  setAttributes: () => { },
13
25
  setStatus: () => { },
package/dist/noop.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"noop.js","sourceRoot":"","sources":["../src/noop.ts"],"names":[],"mappings":"AAEA,SAAS,aAAa,CAAI,QAAqB,EAAE,QAAiD;IACjG,IAAI,CAAC;QACJ,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC;IACrD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;AACF,CAAC;AAED,MAAM,iBAAiB,GAAkB;IACxC,SAAS,EAAE,aAAa;IACxB,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC;IAClB,aAAa,EAAE,GAAG,EAAE,GAAE,CAAC;IACvB,SAAS,EAAE,GAAG,EAAE,GAAE,CAAC;CACnB,CAAC;AACF,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAEjC,8EAA8E;AAC9E,MAAM,CAAC,MAAM,sBAAsB,GAAqB,iBAAiB,CAAC","sourcesContent":["import type { SpanOptions, TelemetryContext, TelemetrySpan } from \"./index.ts\";\n\nfunction startNoopSpan<T>(_options: SpanOptions, callback: (span: TelemetrySpan) => T | Promise<T>): Promise<T> {\n\ttry {\n\t\treturn Promise.resolve(callback(noopTelemetrySpan));\n\t} catch (error) {\n\t\treturn Promise.reject(error);\n\t}\n}\n\nconst noopTelemetrySpan: TelemetrySpan = {\n\tstartSpan: startNoopSpan,\n\taddEvent: () => {},\n\tsetAttributes: () => {},\n\tsetStatus: () => {},\n};\nObject.freeze(noopTelemetrySpan);\n\n/** Shared telemetry context used when an application does not provide one. */\nexport const NOOP_TELEMETRY_CONTEXT: TelemetryContext = noopTelemetrySpan;\n"]}
1
+ {"version":3,"file":"noop.js","sourceRoot":"","sources":["../src/noop.ts"],"names":[],"mappings":"AAGA,KAAK,UAAU,aAAa,CAAI,QAAqB,EAAE,QAAiD;IACvG,OAAO,QAAQ,CAAC,iBAAiB,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,WAAW,GAAqB,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC,CAAC;AACvE,MAAM,iBAAiB,GAA2B,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC,CAAC;AACnF,MAAM,aAAa,GAAuB,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC,CAAC;AAE9E,2FAA2F;AAC3F,MAAM,CAAC,MAAM,sBAAsB,GAAqB,MAAM,CAAC,MAAM,CAAC;IACrE,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW;IAC1B,aAAa,EAAE,GAAG,EAAE,CAAC,iBAAiB;IACtC,SAAS,EAAE,GAAG,EAAE,CAAC,aAAa;CAC9B,CAAC,CAAC;AAEH,kFAAkF;AAClF,MAAM,CAAC,MAAM,0BAA0B,GAAyB,MAAM,CAAC,MAAM,CAAC;IAC7E,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS;IACvB,OAAO,EAAE,GAAG,EAAE,CAAC,sBAAsB;CACrC,CAAC,CAAC;AAEH,MAAM,iBAAiB,GAAkB;IACxC,OAAO,EAAE,sBAAsB;IAC/B,WAAW,EAAE,0BAA0B;IACvC,SAAS,EAAE,aAAa;IACxB,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC;IACjB,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC;IAClB,aAAa,EAAE,GAAG,EAAE,GAAE,CAAC;IACvB,SAAS,EAAE,GAAG,EAAE,GAAE,CAAC;CACnB,CAAC;AACF,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAEjC,8EAA8E;AAC9E,MAAM,CAAC,MAAM,sBAAsB,GAAkB,iBAAiB,CAAC","sourcesContent":["import type { SpanOptions, TelemetryPropagation, TelemetrySpan } from \"./index.ts\";\nimport type { TelemetryCounter, TelemetryHistogram, TelemetryMetrics, TelemetryUpDownCounter } from \"./metrics.ts\";\n\nasync function startNoopSpan<T>(_options: SpanOptions, callback: (span: TelemetrySpan) => T | Promise<T>): Promise<T> {\n\treturn callback(noopTelemetrySpan);\n}\n\nconst noopCounter: TelemetryCounter = Object.freeze({ add: () => {} });\nconst noopUpDownCounter: TelemetryUpDownCounter = Object.freeze({ add: () => {} });\nconst noopHistogram: TelemetryHistogram = Object.freeze({ record: () => {} });\n\n/** Shared instruments that never inspect or retain metadata, measurements, or contexts. */\nexport const NOOP_TELEMETRY_METRICS: TelemetryMetrics = Object.freeze({\n\tcounter: () => noopCounter,\n\tupDownCounter: () => noopUpDownCounter,\n\thistogram: () => noopHistogram,\n});\n\n/** Shared propagation capability that neither inspects nor retains its inputs. */\nexport const NOOP_TELEMETRY_PROPAGATION: TelemetryPropagation = Object.freeze({\n\tinject: () => undefined,\n\textract: () => NOOP_TELEMETRY_CONTEXT,\n});\n\nconst noopTelemetrySpan: TelemetrySpan = {\n\tmetrics: NOOP_TELEMETRY_METRICS,\n\tpropagation: NOOP_TELEMETRY_PROPAGATION,\n\tstartSpan: startNoopSpan,\n\taddLink: () => {},\n\taddEvent: () => {},\n\tsetAttributes: () => {},\n\tsetStatus: () => {},\n};\nObject.freeze(noopTelemetrySpan);\n\n/** Shared telemetry context used when an application does not provide one. */\nexport const NOOP_TELEMETRY_CONTEXT: TelemetrySpan = noopTelemetrySpan;\n"]}
@@ -0,0 +1,4 @@
1
+ import type { StoredSpan } from "./index.ts";
2
+ /** Render stored spans as a chronological forest, treating absent parents as roots. */
3
+ export declare function renderTrace(spans: readonly StoredSpan[]): string;
4
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,UAAU,EAAE,MAAM,YAAY,CAAC;AAQ7D,uFAAuF;AACvF,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,GAAG,MAAM,CAuChE"}
package/dist/render.js ADDED
@@ -0,0 +1,48 @@
1
+ function formatAttributes(attributes = {}) {
2
+ return Object.entries(attributes)
3
+ .map(([key, value]) => ` ${key}=${JSON.stringify(value)}`)
4
+ .join("");
5
+ }
6
+ /** Render stored spans as a chronological forest, treating absent parents as roots. */
7
+ export function renderTrace(spans) {
8
+ const byId = new Map(spans.map((span) => [span.id, span]));
9
+ const roots = [];
10
+ const children = new Map();
11
+ for (const span of [...byId.values()].sort((left, right) => left.startedMs - right.startedMs)) {
12
+ if (span.parentId === undefined || !byId.has(span.parentId)) {
13
+ roots.push(span);
14
+ }
15
+ else {
16
+ const siblings = children.get(span.parentId);
17
+ if (siblings === undefined)
18
+ children.set(span.parentId, [span]);
19
+ else
20
+ siblings.push(span);
21
+ }
22
+ }
23
+ const lines = [];
24
+ const pending = roots.reverse().map((span) => ({ span, depth: 0 }));
25
+ while (pending.length > 0) {
26
+ const { span, depth } = pending.pop();
27
+ const indent = " ".repeat(depth);
28
+ let error = "";
29
+ if (span.status.status === "error") {
30
+ error = " error";
31
+ if (span.status.error !== undefined)
32
+ error += ` ${span.status.error.name}: ${span.status.error.message}`;
33
+ }
34
+ lines.push(`${indent}${span.name}${formatAttributes(span.attributes)} (${span.endedMs - span.startedMs}ms)${error}`);
35
+ for (const event of span.events) {
36
+ lines.push(`${indent} · ${event.name}${formatAttributes(event.attributes)} (+${event.timeMs}ms)`);
37
+ }
38
+ for (const link of span.links) {
39
+ lines.push(`${indent} → link trace ${link.traceId} span ${link.spanId}${formatAttributes(link.attributes)}`);
40
+ }
41
+ const descendants = children.get(span.id) ?? [];
42
+ for (let index = descendants.length - 1; index >= 0; index--) {
43
+ pending.push({ span: descendants[index], depth: depth + 1 });
44
+ }
45
+ }
46
+ return lines.join("\n");
47
+ }
48
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SpanAttributes, StoredSpan } from \"./index.ts\";\n\nfunction formatAttributes(attributes: Readonly<SpanAttributes> = {}): string {\n\treturn Object.entries(attributes)\n\t\t.map(([key, value]) => ` ${key}=${JSON.stringify(value)}`)\n\t\t.join(\"\");\n}\n\n/** Render stored spans as a chronological forest, treating absent parents as roots. */\nexport function renderTrace(spans: readonly StoredSpan[]): string {\n\tconst byId = new Map(spans.map((span) => [span.id, span]));\n\tconst roots: StoredSpan[] = [];\n\tconst children = new Map<string, StoredSpan[]>();\n\tfor (const span of [...byId.values()].sort((left, right) => left.startedMs - right.startedMs)) {\n\t\tif (span.parentId === undefined || !byId.has(span.parentId)) {\n\t\t\troots.push(span);\n\t\t} else {\n\t\t\tconst siblings = children.get(span.parentId);\n\t\t\tif (siblings === undefined) children.set(span.parentId, [span]);\n\t\t\telse siblings.push(span);\n\t\t}\n\t}\n\n\tconst lines: string[] = [];\n\tconst pending = roots.reverse().map((span) => ({ span, depth: 0 }));\n\twhile (pending.length > 0) {\n\t\tconst { span, depth } = pending.pop()!;\n\t\tconst indent = \" \".repeat(depth);\n\t\tlet error = \"\";\n\t\tif (span.status.status === \"error\") {\n\t\t\terror = \" error\";\n\t\t\tif (span.status.error !== undefined) error += ` ${span.status.error.name}: ${span.status.error.message}`;\n\t\t}\n\t\tlines.push(\n\t\t\t`${indent}${span.name}${formatAttributes(span.attributes)} (${span.endedMs - span.startedMs}ms)${error}`,\n\t\t);\n\t\tfor (const event of span.events) {\n\t\t\tlines.push(`${indent} · ${event.name}${formatAttributes(event.attributes)} (+${event.timeMs}ms)`);\n\t\t}\n\t\tfor (const link of span.links) {\n\t\t\tlines.push(`${indent} → link trace ${link.traceId} span ${link.spanId}${formatAttributes(link.attributes)}`);\n\t\t}\n\t\tconst descendants = children.get(span.id) ?? [];\n\t\tfor (let index = descendants.length - 1; index >= 0; index--) {\n\t\t\tpending.push({ span: descendants[index]!, depth: depth + 1 });\n\t\t}\n\t}\n\treturn lines.join(\"\\n\");\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"conformance.d.ts","sourceRoot":"","sources":["../../src/testing/conformance.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACX,+BAA+B,EAE/B,8BAA8B,EAC9B,MAAM,YAAY,CAAC;AAoDpB,oFAAoF;AACpF,wBAAgB,iCAAiC,CAChD,OAAO,EAAE,8BAA8B,GACrC,SAAS,+BAA+B,EAAE,CA4P5C"}
1
+ {"version":3,"file":"conformance.d.ts","sourceRoot":"","sources":["../../src/testing/conformance.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACX,+BAA+B,EAE/B,8BAA8B,EAC9B,MAAM,YAAY,CAAC;AAmCpB,oFAAoF;AACpF,wBAAgB,iCAAiC,CAChD,OAAO,EAAE,8BAA8B,GACrC,SAAS,+BAA+B,EAAE,CAoV5C"}
@@ -50,7 +50,8 @@ var __disposeResources = (this && this.__disposeResources) || (function (Suppres
50
50
  var e = new Error(message);
51
51
  return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
52
52
  });
53
- import { deepStrictEqual, doesNotThrow, fail, ok, strictEqual } from "node:assert/strict";
53
+ import { deepStrictEqual, fail, ok, strictEqual } from "node:assert/strict";
54
+ import { NOOP_TELEMETRY_CONTEXT } from "../index.js";
54
55
  function createCase(factory, group, name, test) {
55
56
  return {
56
57
  group,
@@ -87,25 +88,174 @@ async function rejectsWithSameValue(operation, expected) {
87
88
  strictEqual(error, expected);
88
89
  }
89
90
  }
90
- function unreadable(value) {
91
- return new Proxy(value, {
92
- get: () => {
93
- throw new Error("read");
94
- },
95
- getOwnPropertyDescriptor: () => {
96
- throw new Error("inspect");
97
- },
98
- getPrototypeOf: () => {
99
- throw new Error("prototype");
100
- },
101
- ownKeys: () => {
102
- throw new Error("enumerate");
103
- },
104
- });
105
- }
106
91
  /** Creates runner-independent cases for the callback telemetry adapter contract. */
107
92
  export function createTelemetryAdapterConformance(factory) {
108
93
  return [
94
+ createCase(factory, "capabilities", "carries adapter capabilities through contexts and spans", async (fixture) => {
95
+ const metrics = fixture.metrics ?? fixture.context.metrics;
96
+ const propagation = fixture.propagation ?? fixture.context.propagation;
97
+ const assertCapabilities = (context) => {
98
+ strictEqual(context.metrics, metrics);
99
+ strictEqual(context.propagation, propagation);
100
+ };
101
+ assertCapabilities(fixture.context);
102
+ let settled;
103
+ await fixture.context.startSpan({ name: "capabilities" }, async (span) => {
104
+ settled = span;
105
+ assertCapabilities(span);
106
+ await span.startSpan({ name: "capabilities.child" }, assertCapabilities);
107
+ if (propagation) {
108
+ const parent = propagation.extract(propagation.inject(span));
109
+ assertCapabilities(parent);
110
+ await parent.startSpan({ name: "capabilities.extracted" }, assertCapabilities);
111
+ }
112
+ });
113
+ ok(settled);
114
+ await settled.startSpan({ name: "capabilities.inert" }, assertCapabilities);
115
+ }),
116
+ createCase(factory, "metrics", "records ordered measurements and optional histogram exemplars", async (fixture) => {
117
+ if (!fixture.metrics)
118
+ return;
119
+ ok(fixture.getMetrics, "Metrics fixtures require a normalized measurement reader");
120
+ fixture.metrics
121
+ .counter("bytes", { description: "Encoded bytes", unit: "By" })
122
+ .add(12, { direction: "out" });
123
+ const active = fixture.metrics.upDownCounter("active");
124
+ active.add(1);
125
+ active.add(-1);
126
+ const histogram = fixture.metrics.histogram("duration", { unit: "ms", boundaries: [1, 10] });
127
+ await fixture.context.startSpan({ name: "measured" }, (span) => histogram.record(5, { method: "read" }, span));
128
+ const measurements = await fixture.getMetrics();
129
+ deepStrictEqual(measurements.map((measurement) => [measurement.kind, measurement.name, measurement.value]), [
130
+ ["counter", "bytes", 12],
131
+ ["upDownCounter", "active", 1],
132
+ ["upDownCounter", "active", -1],
133
+ ["histogram", "duration", 5],
134
+ ]);
135
+ deepStrictEqual(measurements[0]?.attributes, { direction: "out" });
136
+ strictEqual(measurements[0]?.description, "Encoded bytes");
137
+ strictEqual(measurements[0]?.unit, "By");
138
+ deepStrictEqual(measurements[3]?.boundaries, [1, 10]);
139
+ deepStrictEqual(measurements[3]?.context, findSpan(await fixture.getSpans(), "measured").context);
140
+ }),
141
+ createCase(factory, "metrics", "copies instrument metadata and measurement attributes", async (fixture) => {
142
+ if (!fixture.metrics)
143
+ return;
144
+ ok(fixture.getMetrics, "Metrics fixtures require a normalized measurement reader");
145
+ const boundaries = [1, 10];
146
+ const options = { description: "Original", boundaries };
147
+ const histogram = fixture.metrics.histogram("snapshot", options);
148
+ boundaries.push(100);
149
+ options.description = "Changed";
150
+ const attributes = { tags: ["original"] };
151
+ histogram.record(-1, attributes);
152
+ attributes.tags.push("changed");
153
+ const measurements = await fixture.getMetrics();
154
+ strictEqual(measurements.length, 1);
155
+ deepStrictEqual(measurements[0]?.attributes, { tags: ["original"] });
156
+ deepStrictEqual(measurements[0]?.boundaries, [1, 10]);
157
+ strictEqual(measurements[0]?.description, "Original");
158
+ strictEqual(measurements[0]?.context, null);
159
+ }),
160
+ createCase(factory, "links", "records initial and late links without changing parents", async (fixture) => {
161
+ let target;
162
+ await fixture.context.startSpan({ name: "target" }, (span) => {
163
+ target = span;
164
+ });
165
+ if (!target)
166
+ throw new Error("Expected target span");
167
+ const targetSpan = target;
168
+ const attributes = { reason: ["initial"] };
169
+ await fixture.context.startSpan({ name: "linked", links: [{ context: target, attributes }] }, (span) => {
170
+ attributes.reason.push("mutated");
171
+ span.addLink({ context: targetSpan, attributes: { reason: "late" } });
172
+ span.addLink({ context: NOOP_TELEMETRY_CONTEXT });
173
+ });
174
+ const spans = await fixture.getSpans();
175
+ const linked = findSpan(spans, "linked");
176
+ strictEqual(linked.parentId, null);
177
+ strictEqual(linked.parentContext, null);
178
+ deepStrictEqual(linked.links, [
179
+ { context: findSpan(spans, "target").context, attributes: { reason: ["initial"] } },
180
+ { context: findSpan(spans, "target").context, attributes: { reason: "late" } },
181
+ ]);
182
+ }),
183
+ createCase(factory, "links", "ignores links added after source settlement", async (fixture) => {
184
+ let source;
185
+ await fixture.context.startSpan({ name: "link-source" }, (span) => {
186
+ source = span;
187
+ });
188
+ if (!source)
189
+ throw new Error("Expected source span");
190
+ source.addLink({ context: source });
191
+ deepStrictEqual(findSpan(await fixture.getSpans(), "link-source").links, []);
192
+ }),
193
+ createCase(factory, "propagation", "roundtrips parent identity through JSON without retaining the carrier", async (fixture) => {
194
+ if (!fixture.propagation)
195
+ return;
196
+ const propagation = fixture.propagation;
197
+ await fixture.context.startSpan({ name: "sender" }, async (span) => {
198
+ const carrier = propagation.inject(span);
199
+ ok(carrier);
200
+ const wire = JSON.parse(JSON.stringify(carrier));
201
+ const parent = propagation.extract(wire);
202
+ for (const key of Object.keys(wire))
203
+ wire[key] = "mutated";
204
+ await parent.startSpan({ name: "receiver" }, () => 42);
205
+ deepStrictEqual(propagation.inject(span), carrier);
206
+ });
207
+ const spans = await fixture.getSpans();
208
+ deepStrictEqual(findSpan(spans, "receiver").parentContext, findSpan(spans, "sender").context);
209
+ }),
210
+ createCase(factory, "propagation", "absent and unknown carriers produce recorded roots", async (fixture) => {
211
+ if (!fixture.propagation)
212
+ return;
213
+ strictEqual(fixture.propagation.inject(NOOP_TELEMETRY_CONTEXT), undefined);
214
+ const carriers = [undefined, {}, { unknown: "format" }];
215
+ for (const [index, carrier] of carriers.entries()) {
216
+ const context = fixture.propagation.extract(carrier);
217
+ strictEqual(await context.startSpan({ name: `fallback-${index}` }, () => 42), 42);
218
+ }
219
+ for (const span of await fixture.getSpans())
220
+ strictEqual(span.parentContext, null);
221
+ }),
222
+ createCase(factory, "propagation", "propagates across fresh adapters and multiple hops", async (fixture) => {
223
+ const env_2 = { stack: [], error: void 0, hasError: false };
224
+ try {
225
+ if (!fixture.propagation)
226
+ return;
227
+ const receiver = __addDisposableResource(env_2, await factory(), true);
228
+ const worker = __addDisposableResource(env_2, await factory(), true);
229
+ if (!receiver.propagation || !worker.propagation)
230
+ throw new Error("Expected propagation on each fixture");
231
+ let senderCarrier;
232
+ await fixture.context.startSpan({ name: "sender" }, (span) => {
233
+ senderCarrier = fixture.propagation?.inject(span);
234
+ });
235
+ ok(senderCarrier);
236
+ let receiverCarrier;
237
+ await receiver.propagation
238
+ .extract(JSON.parse(JSON.stringify(senderCarrier)))
239
+ .startSpan({ name: "receiver" }, (span) => {
240
+ receiverCarrier = receiver.propagation?.inject(span);
241
+ });
242
+ ok(receiverCarrier);
243
+ await worker.propagation
244
+ .extract(JSON.parse(JSON.stringify(receiverCarrier)))
245
+ .startSpan({ name: "worker" }, () => { });
246
+ deepStrictEqual(findSpan(await receiver.getSpans(), "receiver").parentContext, senderCarrier);
247
+ deepStrictEqual(findSpan(await worker.getSpans(), "worker").parentContext, receiverCarrier);
248
+ }
249
+ catch (e_2) {
250
+ env_2.error = e_2;
251
+ env_2.hasError = true;
252
+ }
253
+ finally {
254
+ const result_2 = __disposeResources(env_2);
255
+ if (result_2)
256
+ await result_2;
257
+ }
258
+ }),
109
259
  createCase(factory, "callback lifecycle", "admits once synchronously and preserves the result", async (fixture) => {
110
260
  let admitted = false;
111
261
  let calls = 0;
@@ -131,20 +281,8 @@ export function createTelemetryAdapterConformance(factory) {
131
281
  throw asyncError;
132
282
  }), asyncError);
133
283
  await rejectsWithSameValue(fixture.context.startSpan({ name: "undefined-error" }, () => Promise.reject(undefined)), undefined);
134
- const unreadableError = unreadable({ kind: "unreadable" });
135
- await rejectsWithSameValue(fixture.context.startSpan({ name: "unreadable-error" }, () => {
136
- throw unreadableError;
137
- }), unreadableError);
138
- const asyncUnreadableError = unreadable({ kind: "async-unreadable" });
139
- await rejectsWithSameValue(fixture.context.startSpan({ name: "async-unreadable-error" }, () => Promise.reject(asyncUnreadableError)), asyncUnreadableError);
140
284
  const spans = await fixture.getSpans();
141
- for (const name of [
142
- "sync-error",
143
- "async-error",
144
- "undefined-error",
145
- "unreadable-error",
146
- "async-unreadable-error",
147
- ]) {
285
+ for (const name of ["sync-error", "async-error", "undefined-error"]) {
148
286
  strictEqual(findSpan(spans, name).status.status, "error");
149
287
  }
150
288
  }),
@@ -196,18 +334,6 @@ export function createTelemetryAdapterConformance(factory) {
196
334
  { name: "second", attributes: { index: 2 } },
197
335
  ]);
198
336
  }),
199
- createCase(factory, "recording", "ignores failed attribute calls atomically", async (fixture) => {
200
- await fixture.context.startSpan({ name: "atomic-attributes", attributes: { retained: "value" } }, (span) => {
201
- const attributes = {
202
- partial: "must not survive",
203
- unreadable: unreadable(["value"]),
204
- };
205
- doesNotThrow(() => span.setAttributes(attributes));
206
- });
207
- deepStrictEqual(findSpan(await fixture.getSpans(), "atomic-attributes").attributes, {
208
- retained: "value",
209
- });
210
- }),
211
337
  createCase(factory, "recording", "makes calls after settlement inert", async (fixture) => {
212
338
  let settledSpan;
213
339
  await fixture.context.startSpan({ name: "settled", attributes: { value: "initial" } }, (span) => {
@@ -216,9 +342,9 @@ export function createTelemetryAdapterConformance(factory) {
216
342
  const capturedSpan = settledSpan;
217
343
  if (!capturedSpan)
218
344
  throw new Error("Expected callback span");
219
- doesNotThrow(() => capturedSpan.setAttributes({ value: "late" }));
220
- doesNotThrow(() => capturedSpan.addEvent("late", { value: true }));
221
- doesNotThrow(() => capturedSpan.setStatus({ status: "error" }));
345
+ capturedSpan.setAttributes({ value: "late" });
346
+ capturedSpan.addEvent("late", { value: true });
347
+ capturedSpan.setStatus({ status: "error" });
222
348
  let childAdmitted = false;
223
349
  const childResult = capturedSpan.startSpan({ name: "late-child" }, () => {
224
350
  childAdmitted = true;
@@ -257,38 +383,6 @@ export function createTelemetryAdapterConformance(factory) {
257
383
  ok(second.endSequence < first.endSequence);
258
384
  ok(first.endSequence < parent.endSequence);
259
385
  }),
260
- createCase(factory, "passivity", "suppresses unreadable telemetry payload failures", async (fixture) => {
261
- let calls = 0;
262
- const options = unreadable({ name: "unreadable-options", attributes: { secret: "value" } });
263
- const result = fixture.context.startSpan(options, () => {
264
- calls++;
265
- return 9;
266
- });
267
- strictEqual(calls, 1);
268
- strictEqual(await result, 9);
269
- deepStrictEqual(await fixture.getSpans(), []);
270
- await fixture.context.startSpan({ name: "unreadable-recording" }, (span) => {
271
- const attributes = unreadable({ secret: "value" });
272
- const status = unreadable({ status: "ok" });
273
- doesNotThrow(() => span.setAttributes(attributes));
274
- doesNotThrow(() => span.addEvent("unreadable-event", attributes));
275
- doesNotThrow(() => span.setStatus(status));
276
- });
277
- const recorded = await fixture.getSpans();
278
- strictEqual(recorded.length, 1);
279
- deepStrictEqual(recorded[0]?.attributes, {});
280
- deepStrictEqual(recorded[0]?.events, []);
281
- deepStrictEqual(recorded[0]?.status, { status: "ok" });
282
- }),
283
- createCase(factory, "passivity", "ignores failed status calls atomically", async (fixture) => {
284
- const rejection = new Error("rejected after unreadable status");
285
- await rejectsWithSameValue(fixture.context.startSpan({ name: "unreadable-status" }, (span) => {
286
- const status = unreadable({ status: "ok" });
287
- doesNotThrow(() => span.setStatus(status));
288
- return Promise.reject(rejection);
289
- }), rejection);
290
- strictEqual(findSpan(await fixture.getSpans(), "unreadable-status").status.status, "error");
291
- }),
292
386
  ];
293
387
  }
294
388
  //# sourceMappingURL=conformance.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"conformance.js","sourceRoot":"","sources":["../../src/testing/conformance.ts"],"names":[],"mappings":"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","sourcesContent":["import { deepStrictEqual, doesNotThrow, fail, ok, strictEqual } from \"node:assert/strict\";\nimport type { SpanAttributes, SpanOptions, SpanStatus, TelemetrySpan } from \"../index.ts\";\nimport type { RecordedTelemetrySpan } from \"../memory.ts\";\nimport type {\n\tTelemetryAdapterConformanceCase,\n\tTelemetryAdapterFixture,\n\tTelemetryAdapterFixtureFactory,\n} from \"./types.ts\";\n\ntype ConformanceTest = (fixture: TelemetryAdapterFixture) => Promise<void>;\n\nfunction createCase(\n\tfactory: TelemetryAdapterFixtureFactory,\n\tgroup: string,\n\tname: string,\n\ttest: ConformanceTest,\n): TelemetryAdapterConformanceCase {\n\treturn {\n\t\tgroup,\n\t\tname,\n\t\tasync run() {\n\t\t\tawait using fixture = await factory();\n\t\t\tawait test(fixture);\n\t\t},\n\t};\n}\n\nfunction findSpan(spans: readonly RecordedTelemetrySpan[], name: string): RecordedTelemetrySpan {\n\tconst span = spans.find((candidate) => candidate.name === name);\n\tok(span, `Expected recorded span ${name}`);\n\treturn span;\n}\n\nasync function rejectsWithSameValue(operation: Promise<unknown>, expected: unknown): Promise<void> {\n\ttry {\n\t\tawait operation;\n\t\tfail(\"Expected operation to reject\");\n\t} catch (error) {\n\t\tstrictEqual(error, expected);\n\t}\n}\n\nfunction unreadable<T extends object>(value: T): T {\n\treturn new Proxy(value, {\n\t\tget: () => {\n\t\t\tthrow new Error(\"read\");\n\t\t},\n\t\tgetOwnPropertyDescriptor: () => {\n\t\t\tthrow new Error(\"inspect\");\n\t\t},\n\t\tgetPrototypeOf: () => {\n\t\t\tthrow new Error(\"prototype\");\n\t\t},\n\t\townKeys: () => {\n\t\t\tthrow new Error(\"enumerate\");\n\t\t},\n\t});\n}\n\n/** Creates runner-independent cases for the callback telemetry adapter contract. */\nexport function createTelemetryAdapterConformance(\n\tfactory: TelemetryAdapterFixtureFactory,\n): readonly TelemetryAdapterConformanceCase[] {\n\treturn [\n\t\tcreateCase(\n\t\t\tfactory,\n\t\t\t\"callback lifecycle\",\n\t\t\t\"admits once synchronously and preserves the result\",\n\t\t\tasync (fixture) => {\n\t\t\t\tlet admitted = false;\n\t\t\t\tlet calls = 0;\n\t\t\t\tconst expected = { value: 42 };\n\t\t\t\tconst result = fixture.context.startSpan({ name: \"success\" }, () => {\n\t\t\t\t\tadmitted = true;\n\t\t\t\t\tcalls++;\n\t\t\t\t\treturn expected;\n\t\t\t\t});\n\n\t\t\t\tstrictEqual(admitted, true);\n\t\t\t\tstrictEqual(calls, 1);\n\t\t\t\tstrictEqual(await result, expected);\n\t\t\t\tdeepStrictEqual(findSpan(await fixture.getSpans(), \"success\").status, { status: \"ok\" });\n\t\t\t\tstrictEqual(findSpan(await fixture.getSpans(), \"success\").settled, true);\n\t\t\t},\n\t\t),\n\n\t\tcreateCase(\n\t\t\tfactory,\n\t\t\t\"callback lifecycle\",\n\t\t\t\"preserves synchronous and asynchronous rejection values\",\n\t\t\tasync (fixture) => {\n\t\t\t\tconst syncError = new Error(\"sync\");\n\t\t\t\tawait rejectsWithSameValue(\n\t\t\t\t\tfixture.context.startSpan({ name: \"sync-error\" }, () => {\n\t\t\t\t\t\tthrow syncError;\n\t\t\t\t\t}),\n\t\t\t\t\tsyncError,\n\t\t\t\t);\n\n\t\t\t\tconst asyncError = { kind: \"async\" };\n\t\t\t\tawait rejectsWithSameValue(\n\t\t\t\t\tfixture.context.startSpan({ name: \"async-error\" }, async () => {\n\t\t\t\t\t\tthrow asyncError;\n\t\t\t\t\t}),\n\t\t\t\t\tasyncError,\n\t\t\t\t);\n\n\t\t\t\tawait rejectsWithSameValue(\n\t\t\t\t\tfixture.context.startSpan({ name: \"undefined-error\" }, () => Promise.reject(undefined)),\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\n\t\t\t\tconst unreadableError = unreadable({ kind: \"unreadable\" });\n\t\t\t\tawait rejectsWithSameValue(\n\t\t\t\t\tfixture.context.startSpan({ name: \"unreadable-error\" }, () => {\n\t\t\t\t\t\tthrow unreadableError;\n\t\t\t\t\t}),\n\t\t\t\t\tunreadableError,\n\t\t\t\t);\n\n\t\t\t\tconst asyncUnreadableError = unreadable({ kind: \"async-unreadable\" });\n\t\t\t\tawait rejectsWithSameValue(\n\t\t\t\t\tfixture.context.startSpan({ name: \"async-unreadable-error\" }, () =>\n\t\t\t\t\t\tPromise.reject(asyncUnreadableError),\n\t\t\t\t\t),\n\t\t\t\t\tasyncUnreadableError,\n\t\t\t\t);\n\n\t\t\t\tconst spans = await fixture.getSpans();\n\t\t\t\tfor (const name of [\n\t\t\t\t\t\"sync-error\",\n\t\t\t\t\t\"async-error\",\n\t\t\t\t\t\"undefined-error\",\n\t\t\t\t\t\"unreadable-error\",\n\t\t\t\t\t\"async-unreadable-error\",\n\t\t\t\t]) {\n\t\t\t\t\tstrictEqual(findSpan(spans, name).status.status, \"error\");\n\t\t\t\t}\n\t\t\t},\n\t\t),\n\n\t\tcreateCase(factory, \"status\", \"uses last explicit status without automatic overwrite\", async (fixture) => {\n\t\t\tawait fixture.context.startSpan({ name: \"last-status\" }, (span) => {\n\t\t\t\tspan.setStatus({ status: \"error\", error: { name: \"Expected\", message: \"first\" } });\n\t\t\t\tspan.setStatus({ status: \"ok\" });\n\t\t\t});\n\n\t\t\tconst thrown = new Error(\"after explicit status\");\n\t\t\tawait rejectsWithSameValue(\n\t\t\t\tfixture.context.startSpan({ name: \"explicit-before-throw\" }, (span) => {\n\t\t\t\t\tspan.setStatus({ status: \"ok\" });\n\t\t\t\t\tthrow thrown;\n\t\t\t\t}),\n\t\t\t\tthrown,\n\t\t\t);\n\n\t\t\tconst rejected = new Error(\"after async explicit status\");\n\t\t\tawait rejectsWithSameValue(\n\t\t\t\tfixture.context.startSpan({ name: \"explicit-before-rejection\" }, (span) => {\n\t\t\t\t\tspan.setStatus({ status: \"error\", error: { name: \"Expected\", message: \"async failure\" } });\n\t\t\t\t\treturn Promise.reject(rejected);\n\t\t\t\t}),\n\t\t\t\trejected,\n\t\t\t);\n\n\t\t\tawait fixture.context.startSpan({ name: \"expected-failure\" }, (span) => {\n\t\t\t\tspan.setStatus({ status: \"error\", error: { name: \"Expected\", message: \"returned failure\" } });\n\t\t\t\treturn { ok: false };\n\t\t\t});\n\n\t\t\tconst spans = await fixture.getSpans();\n\t\t\tdeepStrictEqual(findSpan(spans, \"last-status\").status, { status: \"ok\" });\n\t\t\tdeepStrictEqual(findSpan(spans, \"explicit-before-throw\").status, { status: \"ok\" });\n\t\t\tdeepStrictEqual(findSpan(spans, \"explicit-before-rejection\").status, {\n\t\t\t\tstatus: \"error\",\n\t\t\t\terror: { name: \"Expected\", message: \"async failure\" },\n\t\t\t});\n\t\t\tdeepStrictEqual(findSpan(spans, \"expected-failure\").status, {\n\t\t\t\tstatus: \"error\",\n\t\t\t\terror: { name: \"Expected\", message: \"returned failure\" },\n\t\t\t});\n\t\t}),\n\n\t\tcreateCase(factory, \"recording\", \"merges attributes and records ordered events\", async (fixture) => {\n\t\t\tawait fixture.context.startSpan(\n\t\t\t\t{\n\t\t\t\t\tname: \"recording\",\n\t\t\t\t\tattributes: { start: \"value\", overwrite: \"start\", ignored: undefined },\n\t\t\t\t},\n\t\t\t\t(span) => {\n\t\t\t\t\tspan.setAttributes({ count: 1, overwrite: \"middle\" });\n\t\t\t\t\tspan.setAttributes({ count: undefined, overwrite: \"end\" });\n\t\t\t\t\tspan.addEvent(\"first\", { index: 1, ignored: undefined });\n\t\t\t\t\tspan.addEvent(\"second\", { index: 2 });\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tconst span = findSpan(await fixture.getSpans(), \"recording\");\n\t\t\tdeepStrictEqual(span.attributes, { start: \"value\", overwrite: \"end\", count: 1 });\n\t\t\tdeepStrictEqual(span.events, [\n\t\t\t\t{ name: \"first\", attributes: { index: 1 } },\n\t\t\t\t{ name: \"second\", attributes: { index: 2 } },\n\t\t\t]);\n\t\t}),\n\n\t\tcreateCase(factory, \"recording\", \"ignores failed attribute calls atomically\", async (fixture) => {\n\t\t\tawait fixture.context.startSpan({ name: \"atomic-attributes\", attributes: { retained: \"value\" } }, (span) => {\n\t\t\t\tconst attributes: SpanAttributes = {\n\t\t\t\t\tpartial: \"must not survive\",\n\t\t\t\t\tunreadable: unreadable([\"value\"]),\n\t\t\t\t};\n\t\t\t\tdoesNotThrow(() => span.setAttributes(attributes));\n\t\t\t});\n\n\t\t\tdeepStrictEqual(findSpan(await fixture.getSpans(), \"atomic-attributes\").attributes, {\n\t\t\t\tretained: \"value\",\n\t\t\t});\n\t\t}),\n\n\t\tcreateCase(factory, \"recording\", \"makes calls after settlement inert\", async (fixture) => {\n\t\t\tlet settledSpan: TelemetrySpan | undefined;\n\t\t\tawait fixture.context.startSpan({ name: \"settled\", attributes: { value: \"initial\" } }, (span) => {\n\t\t\t\tsettledSpan = span;\n\t\t\t});\n\t\t\tconst capturedSpan = settledSpan;\n\t\t\tif (!capturedSpan) throw new Error(\"Expected callback span\");\n\n\t\t\tdoesNotThrow(() => capturedSpan.setAttributes({ value: \"late\" }));\n\t\t\tdoesNotThrow(() => capturedSpan.addEvent(\"late\", { value: true }));\n\t\t\tdoesNotThrow(() => capturedSpan.setStatus({ status: \"error\" }));\n\t\t\tlet childAdmitted = false;\n\t\t\tconst childResult = capturedSpan.startSpan({ name: \"late-child\" }, () => {\n\t\t\t\tchildAdmitted = true;\n\t\t\t\treturn 7;\n\t\t\t});\n\t\t\tstrictEqual(childAdmitted, true);\n\t\t\tstrictEqual(await childResult, 7);\n\n\t\t\tconst spans = await fixture.getSpans();\n\t\t\tstrictEqual(spans.length, 1);\n\t\t\tdeepStrictEqual(spans[0]?.attributes, { value: \"initial\" });\n\t\t\tdeepStrictEqual(spans[0]?.events, []);\n\t\t\tdeepStrictEqual(spans[0]?.status, { status: \"ok\" });\n\t\t}),\n\n\t\tcreateCase(factory, \"parentage\", \"records nested and concurrent child relationships\", async (fixture) => {\n\t\t\tlet releaseFirst: (() => void) | undefined;\n\t\t\tconst firstGate = new Promise<void>((resolve) => {\n\t\t\t\treleaseFirst = resolve;\n\t\t\t});\n\n\t\t\tawait fixture.context.startSpan({ name: \"parent\" }, async (parent) => {\n\t\t\t\tconst first = parent.startSpan({ name: \"first-child\" }, async () => {\n\t\t\t\t\tawait firstGate;\n\t\t\t\t});\n\t\t\t\tconst second = parent.startSpan({ name: \"second-child\" }, () => \"done\");\n\t\t\t\tstrictEqual(await second, \"done\");\n\t\t\t\treleaseFirst?.();\n\t\t\t\tawait first;\n\t\t\t});\n\n\t\t\tconst spans = await fixture.getSpans();\n\t\t\tconst parent = findSpan(spans, \"parent\");\n\t\t\tconst first = findSpan(spans, \"first-child\");\n\t\t\tconst second = findSpan(spans, \"second-child\");\n\t\t\tstrictEqual(parent.parentId, null);\n\t\t\tstrictEqual(first.parentId, parent.id);\n\t\t\tstrictEqual(second.parentId, parent.id);\n\t\t\tok(second.endSequence !== undefined && first.endSequence !== undefined && parent.endSequence !== undefined);\n\t\t\tok(second.endSequence < first.endSequence);\n\t\t\tok(first.endSequence < parent.endSequence);\n\t\t}),\n\n\t\tcreateCase(factory, \"passivity\", \"suppresses unreadable telemetry payload failures\", async (fixture) => {\n\t\t\tlet calls = 0;\n\t\t\tconst options = unreadable<SpanOptions>({ name: \"unreadable-options\", attributes: { secret: \"value\" } });\n\t\t\tconst result = fixture.context.startSpan(options, () => {\n\t\t\t\tcalls++;\n\t\t\t\treturn 9;\n\t\t\t});\n\n\t\t\tstrictEqual(calls, 1);\n\t\t\tstrictEqual(await result, 9);\n\t\t\tdeepStrictEqual(await fixture.getSpans(), []);\n\n\t\t\tawait fixture.context.startSpan({ name: \"unreadable-recording\" }, (span) => {\n\t\t\t\tconst attributes = unreadable<SpanAttributes>({ secret: \"value\" });\n\t\t\t\tconst status = unreadable<SpanStatus>({ status: \"ok\" });\n\t\t\t\tdoesNotThrow(() => span.setAttributes(attributes));\n\t\t\t\tdoesNotThrow(() => span.addEvent(\"unreadable-event\", attributes));\n\t\t\t\tdoesNotThrow(() => span.setStatus(status));\n\t\t\t});\n\n\t\t\tconst recorded = await fixture.getSpans();\n\t\t\tstrictEqual(recorded.length, 1);\n\t\t\tdeepStrictEqual(recorded[0]?.attributes, {});\n\t\t\tdeepStrictEqual(recorded[0]?.events, []);\n\t\t\tdeepStrictEqual(recorded[0]?.status, { status: \"ok\" });\n\t\t}),\n\n\t\tcreateCase(factory, \"passivity\", \"ignores failed status calls atomically\", async (fixture) => {\n\t\t\tconst rejection = new Error(\"rejected after unreadable status\");\n\t\t\tawait rejectsWithSameValue(\n\t\t\t\tfixture.context.startSpan({ name: \"unreadable-status\" }, (span) => {\n\t\t\t\t\tconst status = unreadable<SpanStatus>({ status: \"ok\" });\n\t\t\t\t\tdoesNotThrow(() => span.setStatus(status));\n\t\t\t\t\treturn Promise.reject(rejection);\n\t\t\t\t}),\n\t\t\t\trejection,\n\t\t\t);\n\n\t\t\tstrictEqual(findSpan(await fixture.getSpans(), \"unreadable-status\").status.status, \"error\");\n\t\t}),\n\t];\n}\n"]}
1
+ {"version":3,"file":"conformance.js","sourceRoot":"","sources":["../../src/testing/conformance.ts"],"names":[],"mappings":"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","sourcesContent":["import { deepStrictEqual, fail, ok, strictEqual } from \"node:assert/strict\";\nimport { NOOP_TELEMETRY_CONTEXT, type TelemetryCarrier, type TelemetryContext, type TelemetrySpan } from \"../index.ts\";\nimport type { RecordedTelemetrySpan } from \"../memory.ts\";\nimport type {\n\tTelemetryAdapterConformanceCase,\n\tTelemetryAdapterFixture,\n\tTelemetryAdapterFixtureFactory,\n} from \"./types.ts\";\n\ntype ConformanceTest = (fixture: TelemetryAdapterFixture) => Promise<void>;\n\nfunction createCase(\n\tfactory: TelemetryAdapterFixtureFactory,\n\tgroup: string,\n\tname: string,\n\ttest: ConformanceTest,\n): TelemetryAdapterConformanceCase {\n\treturn {\n\t\tgroup,\n\t\tname,\n\t\tasync run() {\n\t\t\tawait using fixture = await factory();\n\t\t\tawait test(fixture);\n\t\t},\n\t};\n}\n\nfunction findSpan(spans: readonly RecordedTelemetrySpan[], name: string): RecordedTelemetrySpan {\n\tconst span = spans.find((candidate) => candidate.name === name);\n\tok(span, `Expected recorded span ${name}`);\n\treturn span;\n}\n\nasync function rejectsWithSameValue(operation: Promise<unknown>, expected: unknown): Promise<void> {\n\ttry {\n\t\tawait operation;\n\t\tfail(\"Expected operation to reject\");\n\t} catch (error) {\n\t\tstrictEqual(error, expected);\n\t}\n}\n\n/** Creates runner-independent cases for the callback telemetry adapter contract. */\nexport function createTelemetryAdapterConformance(\n\tfactory: TelemetryAdapterFixtureFactory,\n): readonly TelemetryAdapterConformanceCase[] {\n\treturn [\n\t\tcreateCase(\n\t\t\tfactory,\n\t\t\t\"capabilities\",\n\t\t\t\"carries adapter capabilities through contexts and spans\",\n\t\t\tasync (fixture) => {\n\t\t\t\tconst metrics = fixture.metrics ?? fixture.context.metrics;\n\t\t\t\tconst propagation = fixture.propagation ?? fixture.context.propagation;\n\t\t\t\tconst assertCapabilities = (context: TelemetryContext): void => {\n\t\t\t\t\tstrictEqual(context.metrics, metrics);\n\t\t\t\t\tstrictEqual(context.propagation, propagation);\n\t\t\t\t};\n\t\t\t\tassertCapabilities(fixture.context);\n\t\t\t\tlet settled: TelemetrySpan | undefined;\n\t\t\t\tawait fixture.context.startSpan({ name: \"capabilities\" }, async (span) => {\n\t\t\t\t\tsettled = span;\n\t\t\t\t\tassertCapabilities(span);\n\t\t\t\t\tawait span.startSpan({ name: \"capabilities.child\" }, assertCapabilities);\n\t\t\t\t\tif (propagation) {\n\t\t\t\t\t\tconst parent = propagation.extract(propagation.inject(span));\n\t\t\t\t\t\tassertCapabilities(parent);\n\t\t\t\t\t\tawait parent.startSpan({ name: \"capabilities.extracted\" }, assertCapabilities);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tok(settled);\n\t\t\t\tawait settled.startSpan({ name: \"capabilities.inert\" }, assertCapabilities);\n\t\t\t},\n\t\t),\n\t\tcreateCase(\n\t\t\tfactory,\n\t\t\t\"metrics\",\n\t\t\t\"records ordered measurements and optional histogram exemplars\",\n\t\t\tasync (fixture) => {\n\t\t\t\tif (!fixture.metrics) return;\n\t\t\t\tok(fixture.getMetrics, \"Metrics fixtures require a normalized measurement reader\");\n\t\t\t\tfixture.metrics\n\t\t\t\t\t.counter(\"bytes\", { description: \"Encoded bytes\", unit: \"By\" })\n\t\t\t\t\t.add(12, { direction: \"out\" });\n\t\t\t\tconst active = fixture.metrics.upDownCounter(\"active\");\n\t\t\t\tactive.add(1);\n\t\t\t\tactive.add(-1);\n\t\t\t\tconst histogram = fixture.metrics.histogram(\"duration\", { unit: \"ms\", boundaries: [1, 10] });\n\t\t\t\tawait fixture.context.startSpan({ name: \"measured\" }, (span) =>\n\t\t\t\t\thistogram.record(5, { method: \"read\" }, span),\n\t\t\t\t);\n\t\t\t\tconst measurements = await fixture.getMetrics();\n\t\t\t\tdeepStrictEqual(\n\t\t\t\t\tmeasurements.map((measurement) => [measurement.kind, measurement.name, measurement.value]),\n\t\t\t\t\t[\n\t\t\t\t\t\t[\"counter\", \"bytes\", 12],\n\t\t\t\t\t\t[\"upDownCounter\", \"active\", 1],\n\t\t\t\t\t\t[\"upDownCounter\", \"active\", -1],\n\t\t\t\t\t\t[\"histogram\", \"duration\", 5],\n\t\t\t\t\t],\n\t\t\t\t);\n\t\t\t\tdeepStrictEqual(measurements[0]?.attributes, { direction: \"out\" });\n\t\t\t\tstrictEqual(measurements[0]?.description, \"Encoded bytes\");\n\t\t\t\tstrictEqual(measurements[0]?.unit, \"By\");\n\t\t\t\tdeepStrictEqual(measurements[3]?.boundaries, [1, 10]);\n\t\t\t\tdeepStrictEqual(measurements[3]?.context, findSpan(await fixture.getSpans(), \"measured\").context);\n\t\t\t},\n\t\t),\n\t\tcreateCase(factory, \"metrics\", \"copies instrument metadata and measurement attributes\", async (fixture) => {\n\t\t\tif (!fixture.metrics) return;\n\t\t\tok(fixture.getMetrics, \"Metrics fixtures require a normalized measurement reader\");\n\t\t\tconst boundaries = [1, 10];\n\t\t\tconst options = { description: \"Original\", boundaries };\n\t\t\tconst histogram = fixture.metrics.histogram(\"snapshot\", options);\n\t\t\tboundaries.push(100);\n\t\t\toptions.description = \"Changed\";\n\t\t\tconst attributes = { tags: [\"original\"] };\n\t\t\thistogram.record(-1, attributes);\n\t\t\tattributes.tags.push(\"changed\");\n\t\t\tconst measurements = await fixture.getMetrics();\n\t\t\tstrictEqual(measurements.length, 1);\n\t\t\tdeepStrictEqual(measurements[0]?.attributes, { tags: [\"original\"] });\n\t\t\tdeepStrictEqual(measurements[0]?.boundaries, [1, 10]);\n\t\t\tstrictEqual(measurements[0]?.description, \"Original\");\n\t\t\tstrictEqual(measurements[0]?.context, null);\n\t\t}),\n\t\tcreateCase(factory, \"links\", \"records initial and late links without changing parents\", async (fixture) => {\n\t\t\tlet target: TelemetrySpan | undefined;\n\t\t\tawait fixture.context.startSpan({ name: \"target\" }, (span) => {\n\t\t\t\ttarget = span;\n\t\t\t});\n\t\t\tif (!target) throw new Error(\"Expected target span\");\n\t\t\tconst targetSpan = target;\n\t\t\tconst attributes = { reason: [\"initial\"] };\n\t\t\tawait fixture.context.startSpan({ name: \"linked\", links: [{ context: target, attributes }] }, (span) => {\n\t\t\t\tattributes.reason.push(\"mutated\");\n\t\t\t\tspan.addLink({ context: targetSpan, attributes: { reason: \"late\" } });\n\t\t\t\tspan.addLink({ context: NOOP_TELEMETRY_CONTEXT });\n\t\t\t});\n\t\t\tconst spans = await fixture.getSpans();\n\t\t\tconst linked = findSpan(spans, \"linked\");\n\t\t\tstrictEqual(linked.parentId, null);\n\t\t\tstrictEqual(linked.parentContext, null);\n\t\t\tdeepStrictEqual(linked.links, [\n\t\t\t\t{ context: findSpan(spans, \"target\").context, attributes: { reason: [\"initial\"] } },\n\t\t\t\t{ context: findSpan(spans, \"target\").context, attributes: { reason: \"late\" } },\n\t\t\t]);\n\t\t}),\n\t\tcreateCase(factory, \"links\", \"ignores links added after source settlement\", async (fixture) => {\n\t\t\tlet source: TelemetrySpan | undefined;\n\t\t\tawait fixture.context.startSpan({ name: \"link-source\" }, (span) => {\n\t\t\t\tsource = span;\n\t\t\t});\n\t\t\tif (!source) throw new Error(\"Expected source span\");\n\t\t\tsource.addLink({ context: source });\n\t\t\tdeepStrictEqual(findSpan(await fixture.getSpans(), \"link-source\").links, []);\n\t\t}),\n\n\t\tcreateCase(\n\t\t\tfactory,\n\t\t\t\"propagation\",\n\t\t\t\"roundtrips parent identity through JSON without retaining the carrier\",\n\t\t\tasync (fixture) => {\n\t\t\t\tif (!fixture.propagation) return;\n\t\t\t\tconst propagation = fixture.propagation;\n\t\t\t\tawait fixture.context.startSpan({ name: \"sender\" }, async (span) => {\n\t\t\t\t\tconst carrier = propagation.inject(span);\n\t\t\t\t\tok(carrier);\n\t\t\t\t\tconst wire = JSON.parse(JSON.stringify(carrier)) as TelemetryCarrier;\n\t\t\t\t\tconst parent = propagation.extract(wire);\n\t\t\t\t\tfor (const key of Object.keys(wire)) wire[key] = \"mutated\";\n\t\t\t\t\tawait parent.startSpan({ name: \"receiver\" }, () => 42);\n\t\t\t\t\tdeepStrictEqual(propagation.inject(span), carrier);\n\t\t\t\t});\n\t\t\t\tconst spans = await fixture.getSpans();\n\t\t\t\tdeepStrictEqual(findSpan(spans, \"receiver\").parentContext, findSpan(spans, \"sender\").context);\n\t\t\t},\n\t\t),\n\t\tcreateCase(factory, \"propagation\", \"absent and unknown carriers produce recorded roots\", async (fixture) => {\n\t\t\tif (!fixture.propagation) return;\n\t\t\tstrictEqual(fixture.propagation.inject(NOOP_TELEMETRY_CONTEXT), undefined);\n\t\t\tconst carriers: readonly (TelemetryCarrier | undefined)[] = [undefined, {}, { unknown: \"format\" }];\n\t\t\tfor (const [index, carrier] of carriers.entries()) {\n\t\t\t\tconst context = fixture.propagation.extract(carrier);\n\t\t\t\tstrictEqual(await context.startSpan({ name: `fallback-${index}` }, () => 42), 42);\n\t\t\t}\n\t\t\tfor (const span of await fixture.getSpans()) strictEqual(span.parentContext, null);\n\t\t}),\n\n\t\tcreateCase(factory, \"propagation\", \"propagates across fresh adapters and multiple hops\", async (fixture) => {\n\t\t\tif (!fixture.propagation) return;\n\t\t\tawait using receiver = await factory();\n\t\t\tawait using worker = await factory();\n\t\t\tif (!receiver.propagation || !worker.propagation) throw new Error(\"Expected propagation on each fixture\");\n\t\t\tlet senderCarrier: TelemetryCarrier | undefined;\n\t\t\tawait fixture.context.startSpan({ name: \"sender\" }, (span) => {\n\t\t\t\tsenderCarrier = fixture.propagation?.inject(span);\n\t\t\t});\n\t\t\tok(senderCarrier);\n\t\t\tlet receiverCarrier: TelemetryCarrier | undefined;\n\t\t\tawait receiver.propagation\n\t\t\t\t.extract(JSON.parse(JSON.stringify(senderCarrier)) as TelemetryCarrier)\n\t\t\t\t.startSpan({ name: \"receiver\" }, (span) => {\n\t\t\t\t\treceiverCarrier = receiver.propagation?.inject(span);\n\t\t\t\t});\n\t\t\tok(receiverCarrier);\n\t\t\tawait worker.propagation\n\t\t\t\t.extract(JSON.parse(JSON.stringify(receiverCarrier)) as TelemetryCarrier)\n\t\t\t\t.startSpan({ name: \"worker\" }, () => {});\n\t\t\tdeepStrictEqual(findSpan(await receiver.getSpans(), \"receiver\").parentContext, senderCarrier);\n\t\t\tdeepStrictEqual(findSpan(await worker.getSpans(), \"worker\").parentContext, receiverCarrier);\n\t\t}),\n\t\tcreateCase(\n\t\t\tfactory,\n\t\t\t\"callback lifecycle\",\n\t\t\t\"admits once synchronously and preserves the result\",\n\t\t\tasync (fixture) => {\n\t\t\t\tlet admitted = false;\n\t\t\t\tlet calls = 0;\n\t\t\t\tconst expected = { value: 42 };\n\t\t\t\tconst result = fixture.context.startSpan({ name: \"success\" }, () => {\n\t\t\t\t\tadmitted = true;\n\t\t\t\t\tcalls++;\n\t\t\t\t\treturn expected;\n\t\t\t\t});\n\n\t\t\t\tstrictEqual(admitted, true);\n\t\t\t\tstrictEqual(calls, 1);\n\t\t\t\tstrictEqual(await result, expected);\n\t\t\t\tdeepStrictEqual(findSpan(await fixture.getSpans(), \"success\").status, { status: \"ok\" });\n\t\t\t\tstrictEqual(findSpan(await fixture.getSpans(), \"success\").settled, true);\n\t\t\t},\n\t\t),\n\n\t\tcreateCase(\n\t\t\tfactory,\n\t\t\t\"callback lifecycle\",\n\t\t\t\"preserves synchronous and asynchronous rejection values\",\n\t\t\tasync (fixture) => {\n\t\t\t\tconst syncError = new Error(\"sync\");\n\t\t\t\tawait rejectsWithSameValue(\n\t\t\t\t\tfixture.context.startSpan({ name: \"sync-error\" }, () => {\n\t\t\t\t\t\tthrow syncError;\n\t\t\t\t\t}),\n\t\t\t\t\tsyncError,\n\t\t\t\t);\n\n\t\t\t\tconst asyncError = { kind: \"async\" };\n\t\t\t\tawait rejectsWithSameValue(\n\t\t\t\t\tfixture.context.startSpan({ name: \"async-error\" }, async () => {\n\t\t\t\t\t\tthrow asyncError;\n\t\t\t\t\t}),\n\t\t\t\t\tasyncError,\n\t\t\t\t);\n\n\t\t\t\tawait rejectsWithSameValue(\n\t\t\t\t\tfixture.context.startSpan({ name: \"undefined-error\" }, () => Promise.reject(undefined)),\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\n\t\t\t\tconst spans = await fixture.getSpans();\n\t\t\t\tfor (const name of [\"sync-error\", \"async-error\", \"undefined-error\"]) {\n\t\t\t\t\tstrictEqual(findSpan(spans, name).status.status, \"error\");\n\t\t\t\t}\n\t\t\t},\n\t\t),\n\n\t\tcreateCase(factory, \"status\", \"uses last explicit status without automatic overwrite\", async (fixture) => {\n\t\t\tawait fixture.context.startSpan({ name: \"last-status\" }, (span) => {\n\t\t\t\tspan.setStatus({ status: \"error\", error: { name: \"Expected\", message: \"first\" } });\n\t\t\t\tspan.setStatus({ status: \"ok\" });\n\t\t\t});\n\n\t\t\tconst thrown = new Error(\"after explicit status\");\n\t\t\tawait rejectsWithSameValue(\n\t\t\t\tfixture.context.startSpan({ name: \"explicit-before-throw\" }, (span) => {\n\t\t\t\t\tspan.setStatus({ status: \"ok\" });\n\t\t\t\t\tthrow thrown;\n\t\t\t\t}),\n\t\t\t\tthrown,\n\t\t\t);\n\n\t\t\tconst rejected = new Error(\"after async explicit status\");\n\t\t\tawait rejectsWithSameValue(\n\t\t\t\tfixture.context.startSpan({ name: \"explicit-before-rejection\" }, (span) => {\n\t\t\t\t\tspan.setStatus({ status: \"error\", error: { name: \"Expected\", message: \"async failure\" } });\n\t\t\t\t\treturn Promise.reject(rejected);\n\t\t\t\t}),\n\t\t\t\trejected,\n\t\t\t);\n\n\t\t\tawait fixture.context.startSpan({ name: \"expected-failure\" }, (span) => {\n\t\t\t\tspan.setStatus({ status: \"error\", error: { name: \"Expected\", message: \"returned failure\" } });\n\t\t\t\treturn { ok: false };\n\t\t\t});\n\n\t\t\tconst spans = await fixture.getSpans();\n\t\t\tdeepStrictEqual(findSpan(spans, \"last-status\").status, { status: \"ok\" });\n\t\t\tdeepStrictEqual(findSpan(spans, \"explicit-before-throw\").status, { status: \"ok\" });\n\t\t\tdeepStrictEqual(findSpan(spans, \"explicit-before-rejection\").status, {\n\t\t\t\tstatus: \"error\",\n\t\t\t\terror: { name: \"Expected\", message: \"async failure\" },\n\t\t\t});\n\t\t\tdeepStrictEqual(findSpan(spans, \"expected-failure\").status, {\n\t\t\t\tstatus: \"error\",\n\t\t\t\terror: { name: \"Expected\", message: \"returned failure\" },\n\t\t\t});\n\t\t}),\n\n\t\tcreateCase(factory, \"recording\", \"merges attributes and records ordered events\", async (fixture) => {\n\t\t\tawait fixture.context.startSpan(\n\t\t\t\t{\n\t\t\t\t\tname: \"recording\",\n\t\t\t\t\tattributes: { start: \"value\", overwrite: \"start\", ignored: undefined },\n\t\t\t\t},\n\t\t\t\t(span) => {\n\t\t\t\t\tspan.setAttributes({ count: 1, overwrite: \"middle\" });\n\t\t\t\t\tspan.setAttributes({ count: undefined, overwrite: \"end\" });\n\t\t\t\t\tspan.addEvent(\"first\", { index: 1, ignored: undefined });\n\t\t\t\t\tspan.addEvent(\"second\", { index: 2 });\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tconst span = findSpan(await fixture.getSpans(), \"recording\");\n\t\t\tdeepStrictEqual(span.attributes, { start: \"value\", overwrite: \"end\", count: 1 });\n\t\t\tdeepStrictEqual(span.events, [\n\t\t\t\t{ name: \"first\", attributes: { index: 1 } },\n\t\t\t\t{ name: \"second\", attributes: { index: 2 } },\n\t\t\t]);\n\t\t}),\n\n\t\tcreateCase(factory, \"recording\", \"makes calls after settlement inert\", async (fixture) => {\n\t\t\tlet settledSpan: TelemetrySpan | undefined;\n\t\t\tawait fixture.context.startSpan({ name: \"settled\", attributes: { value: \"initial\" } }, (span) => {\n\t\t\t\tsettledSpan = span;\n\t\t\t});\n\t\t\tconst capturedSpan = settledSpan;\n\t\t\tif (!capturedSpan) throw new Error(\"Expected callback span\");\n\n\t\t\tcapturedSpan.setAttributes({ value: \"late\" });\n\t\t\tcapturedSpan.addEvent(\"late\", { value: true });\n\t\t\tcapturedSpan.setStatus({ status: \"error\" });\n\t\t\tlet childAdmitted = false;\n\t\t\tconst childResult = capturedSpan.startSpan({ name: \"late-child\" }, () => {\n\t\t\t\tchildAdmitted = true;\n\t\t\t\treturn 7;\n\t\t\t});\n\t\t\tstrictEqual(childAdmitted, true);\n\t\t\tstrictEqual(await childResult, 7);\n\n\t\t\tconst spans = await fixture.getSpans();\n\t\t\tstrictEqual(spans.length, 1);\n\t\t\tdeepStrictEqual(spans[0]?.attributes, { value: \"initial\" });\n\t\t\tdeepStrictEqual(spans[0]?.events, []);\n\t\t\tdeepStrictEqual(spans[0]?.status, { status: \"ok\" });\n\t\t}),\n\n\t\tcreateCase(factory, \"parentage\", \"records nested and concurrent child relationships\", async (fixture) => {\n\t\t\tlet releaseFirst: (() => void) | undefined;\n\t\t\tconst firstGate = new Promise<void>((resolve) => {\n\t\t\t\treleaseFirst = resolve;\n\t\t\t});\n\n\t\t\tawait fixture.context.startSpan({ name: \"parent\" }, async (parent) => {\n\t\t\t\tconst first = parent.startSpan({ name: \"first-child\" }, async () => {\n\t\t\t\t\tawait firstGate;\n\t\t\t\t});\n\t\t\t\tconst second = parent.startSpan({ name: \"second-child\" }, () => \"done\");\n\t\t\t\tstrictEqual(await second, \"done\");\n\t\t\t\treleaseFirst?.();\n\t\t\t\tawait first;\n\t\t\t});\n\n\t\t\tconst spans = await fixture.getSpans();\n\t\t\tconst parent = findSpan(spans, \"parent\");\n\t\t\tconst first = findSpan(spans, \"first-child\");\n\t\t\tconst second = findSpan(spans, \"second-child\");\n\t\t\tstrictEqual(parent.parentId, null);\n\t\t\tstrictEqual(first.parentId, parent.id);\n\t\t\tstrictEqual(second.parentId, parent.id);\n\t\t\tok(second.endSequence !== undefined && first.endSequence !== undefined && parent.endSequence !== undefined);\n\t\t\tok(second.endSequence < first.endSequence);\n\t\t\tok(first.endSequence < parent.endSequence);\n\t\t}),\n\t];\n}\n"]}
@@ -1,8 +1,11 @@
1
- import type { TelemetryContext } from "../index.ts";
2
- import type { RecordedTelemetrySpan } from "../memory.ts";
1
+ import type { TelemetryContext, TelemetryMetrics, TelemetryPropagation } from "../index.ts";
2
+ import type { RecordedTelemetryMeasurement, RecordedTelemetrySpan } from "../memory.ts";
3
3
  /** A fresh adapter instance and normalized snapshot reader owned by one conformance case. */
4
4
  export interface TelemetryAdapterFixture extends AsyncDisposable {
5
5
  readonly context: TelemetryContext;
6
+ readonly propagation?: TelemetryPropagation;
7
+ readonly metrics?: TelemetryMetrics;
8
+ getMetrics?(): Promise<readonly RecordedTelemetryMeasurement[]>;
6
9
  getSpans(): Promise<readonly RecordedTelemetrySpan[]>;
7
10
  }
8
11
  /** Creates an isolated adapter fixture for one conformance case. */