@sammorrowdrums/mcpi-telemetry 0.85.0-bootstrap.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/LICENSE +21 -0
- package/README.md +464 -0
- package/dist/index.d.ts +194 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/memory.d.ts +26 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +154 -0
- package/dist/memory.js.map +1 -0
- package/dist/noop.d.ts +4 -0
- package/dist/noop.d.ts.map +1 -0
- package/dist/noop.js +18 -0
- package/dist/noop.js.map +1 -0
- package/dist/testing/conformance.d.ts +4 -0
- package/dist/testing/conformance.d.ts.map +1 -0
- package/dist/testing/conformance.js +294 -0
- package/dist/testing/conformance.js.map +1 -0
- package/dist/testing/index.d.ts +3 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +2 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/types.d.ts +16 -0
- package/dist/testing/types.d.ts.map +1 -0
- package/dist/testing/types.js +2 -0
- package/dist/testing/types.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["export type AttributeValue = string | number | boolean | readonly string[] | readonly number[] | readonly boolean[];\n\nexport interface SpanAttributes {\n\t[name: string]: AttributeValue | undefined;\n}\n\nexport interface SpanOptions {\n\tname: string;\n\tattributes?: SpanAttributes;\n}\n\nexport type SpanStatus = { status: \"ok\" } | { status: \"error\"; error?: { name: string; message: string } };\n\nexport interface TelemetryContext {\n\tstartSpan<T>(options: SpanOptions, callback: (span: TelemetrySpan) => T | Promise<T>): Promise<T>;\n}\n\nexport interface TelemetrySpan extends TelemetryContext {\n\taddEvent(name: string, attributes?: SpanAttributes): void;\n\tsetAttributes(attributes: SpanAttributes): void;\n\tsetStatus(status: SpanStatus): void;\n}\n\nexport { NOOP_TELEMETRY_CONTEXT } from \"./noop.ts\";\n\nexport type TelemetryAttributeType = \"string\" | \"number\" | \"boolean\" | \"string[]\" | \"number[]\" | \"boolean[]\";\n\nexport interface TelemetryAttributeMetadata {\n\tdescription: string;\n\tsensitive?: boolean;\n\tcardinality?: \"low\" | \"high\";\n}\n\nexport type TelemetryAttributeDefinition = TelemetryAttributeMetadata &\n\t(\n\t\t| { type: \"string\"; values?: readonly string[]; examples?: readonly string[] }\n\t\t| { type: \"number\"; values?: readonly number[]; examples?: readonly number[] }\n\t\t| { type: \"boolean\"; values?: readonly boolean[]; examples?: readonly boolean[] }\n\t\t| { type: \"string[]\"; elementValues?: readonly string[]; examples?: readonly (readonly string[])[] }\n\t\t| { type: \"number[]\"; elementValues?: readonly number[]; examples?: readonly (readonly number[])[] }\n\t\t| { type: \"boolean[]\"; elementValues?: readonly boolean[]; examples?: readonly (readonly boolean[])[] }\n\t);\n\nexport type TelemetryStartAttributeDefinition = TelemetryAttributeDefinition & { required: boolean };\nexport type TelemetryEventAttributeDefinition = TelemetryAttributeDefinition & { required: boolean };\n\nexport interface TelemetryEventDefinition {\n\tdescription: string;\n\tattributes: Record<string, TelemetryEventAttributeDefinition>;\n}\n\nexport type TelemetryParentDefinition =\n\t| { kind: \"any\" }\n\t| { kind: \"root_or_external\" }\n\t| { kind: \"spans\"; spans: readonly string[] };\n\nexport interface TelemetrySpanDefinition {\n\tdescription: string;\n\tparents: TelemetryParentDefinition;\n\tstartAttributes: Record<string, TelemetryStartAttributeDefinition>;\n\tendAttributes: Record<string, TelemetryAttributeDefinition>;\n\tevents?: Record<string, TelemetryEventDefinition>;\n\tstatus: { default: \"ok\"; errorWhen: string };\n}\n\nexport interface TelemetrySchemaDefinition {\n\tversion: number;\n\tspans: Record<string, TelemetrySpanDefinition>;\n}\n\n/** Typed identity helper for serializable telemetry schema data. */\nexport function defineTelemetrySchema<const T extends TelemetrySchemaDefinition>(schema: T): T {\n\treturn schema;\n}\n\ntype AttributeDefinitionValue<Definition extends TelemetryAttributeDefinition> = Definition extends {\n\ttype: \"string\";\n\tvalues: readonly (infer Value extends string)[];\n}\n\t? Value\n\t: Definition extends { type: \"string\" }\n\t\t? string\n\t\t: Definition extends { type: \"number\"; values: readonly (infer Value extends number)[] }\n\t\t\t? Value\n\t\t\t: Definition extends { type: \"number\" }\n\t\t\t\t? number\n\t\t\t\t: Definition extends { type: \"boolean\"; values: readonly (infer Value extends boolean)[] }\n\t\t\t\t\t? Value\n\t\t\t\t\t: Definition extends { type: \"boolean\" }\n\t\t\t\t\t\t? boolean\n\t\t\t\t\t\t: Definition extends {\n\t\t\t\t\t\t\t\t\ttype: \"string[]\";\n\t\t\t\t\t\t\t\t\telementValues: readonly (infer Value extends string)[];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t? readonly Value[]\n\t\t\t\t\t\t\t: Definition extends { type: \"string[]\" }\n\t\t\t\t\t\t\t\t? readonly string[]\n\t\t\t\t\t\t\t\t: Definition extends {\n\t\t\t\t\t\t\t\t\t\t\ttype: \"number[]\";\n\t\t\t\t\t\t\t\t\t\t\telementValues: readonly (infer Value extends number)[];\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t? readonly Value[]\n\t\t\t\t\t\t\t\t\t: Definition extends { type: \"number[]\" }\n\t\t\t\t\t\t\t\t\t\t? readonly number[]\n\t\t\t\t\t\t\t\t\t\t: Definition extends {\n\t\t\t\t\t\t\t\t\t\t\t\t\ttype: \"boolean[]\";\n\t\t\t\t\t\t\t\t\t\t\t\t\telementValues: readonly (infer Value extends boolean)[];\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t? readonly Value[]\n\t\t\t\t\t\t\t\t\t\t\t: readonly boolean[];\n\ntype RequiredAttributeNames<\n\tDefinitions extends Record<string, TelemetryStartAttributeDefinition | TelemetryEventAttributeDefinition>,\n> = {\n\t[Name in keyof Definitions]-?: Definitions[Name][\"required\"] extends true ? Name : never;\n}[keyof Definitions];\n\ntype OptionalAttributeNames<\n\tDefinitions extends Record<string, TelemetryStartAttributeDefinition | TelemetryEventAttributeDefinition>,\n> = Exclude<keyof Definitions, RequiredAttributeNames<Definitions>>;\n\nexport type InferRequiredAndOptionalAttributes<\n\tDefinitions extends Record<string, TelemetryStartAttributeDefinition | TelemetryEventAttributeDefinition>,\n> = keyof Definitions extends never\n\t? Record<string, never>\n\t: {\n\t\t\t[Name in RequiredAttributeNames<Definitions>]: AttributeDefinitionValue<Definitions[Name]>;\n\t\t} & {\n\t\t\t[Name in OptionalAttributeNames<Definitions>]?: AttributeDefinitionValue<Definitions[Name]>;\n\t\t};\n\nexport type InferStartAttributes<Definitions extends Record<string, TelemetryStartAttributeDefinition>> =\n\tInferRequiredAndOptionalAttributes<Definitions>;\n\nexport type InferOptionalAttributes<Definitions extends Record<string, TelemetryAttributeDefinition>> =\n\tkeyof Definitions extends never\n\t\t? Record<string, never>\n\t\t: { [Name in keyof Definitions]?: AttributeDefinitionValue<Definitions[Name]> };\n\nexport type ExactTelemetryAttributes<Expected, Actual extends Expected> = Actual &\n\tRecord<Exclude<keyof Actual, keyof Expected>, never>;\n\nexport type InferEventAttributes<Definitions extends Record<string, TelemetryEventAttributeDefinition>> =\n\tInferRequiredAndOptionalAttributes<Definitions>;\n\nexport type TelemetrySchemaSpanName<Schema extends TelemetrySchemaDefinition> = keyof Schema[\"spans\"] & string;\n\ntype SchemaSpan<\n\tSchema extends TelemetrySchemaDefinition,\n\tName extends TelemetrySchemaSpanName<Schema>,\n> = Schema[\"spans\"][Name];\n\nexport type TelemetrySchemaSpanStartAttributes<\n\tSchema extends TelemetrySchemaDefinition,\n\tName extends TelemetrySchemaSpanName<Schema>,\n> = SchemaSpan<Schema, Name>[\"startAttributes\"] extends infer Definitions extends Record<\n\tstring,\n\tTelemetryStartAttributeDefinition\n>\n\t? InferStartAttributes<Definitions>\n\t: never;\n\nexport type TelemetrySchemaSpanEndAttributes<\n\tSchema extends TelemetrySchemaDefinition,\n\tName extends TelemetrySchemaSpanName<Schema>,\n> = SchemaSpan<Schema, Name>[\"endAttributes\"] extends infer Definitions extends Record<\n\tstring,\n\tTelemetryAttributeDefinition\n>\n\t? InferOptionalAttributes<Definitions>\n\t: never;\n\ntype SchemaSpanEvents<\n\tSchema extends TelemetrySchemaDefinition,\n\tName extends TelemetrySchemaSpanName<Schema>,\n> = SchemaSpan<Schema, Name> extends { events: infer Events extends Record<string, TelemetryEventDefinition> }\n\t? Events\n\t: Record<never, never>;\n\nexport type TelemetrySchemaSpanEventName<\n\tSchema extends TelemetrySchemaDefinition,\n\tName extends TelemetrySchemaSpanName<Schema>,\n> = keyof SchemaSpanEvents<Schema, Name> & string;\n\ntype SchemaSpanEvent<\n\tSchema extends TelemetrySchemaDefinition,\n\tName extends TelemetrySchemaSpanName<Schema>,\n\tEventName extends TelemetrySchemaSpanEventName<Schema, Name>,\n> = SchemaSpanEvents<Schema, Name> extends infer Events\n\t? EventName extends keyof Events\n\t\t? Events[EventName]\n\t\t: never\n\t: never;\n\nexport type TelemetrySchemaSpanEventAttributes<\n\tSchema extends TelemetrySchemaDefinition,\n\tName extends TelemetrySchemaSpanName<Schema>,\n\tEventName extends TelemetrySchemaSpanEventName<Schema, Name>,\n> = SchemaSpanEvent<Schema, Name, EventName> extends {\n\tattributes: infer Definitions extends Record<string, TelemetryEventAttributeDefinition>;\n}\n\t? InferEventAttributes<Definitions>\n\t: never;\n\ntype SchemaSpanEventAttributeDefinitions<\n\tSchema extends TelemetrySchemaDefinition,\n\tName extends TelemetrySchemaSpanName<Schema>,\n\tEventName extends TelemetrySchemaSpanEventName<Schema, Name>,\n> = SchemaSpanEvent<Schema, Name, EventName> extends {\n\tattributes: infer Definitions extends Record<string, TelemetryEventAttributeDefinition>;\n}\n\t? Definitions\n\t: Record<never, never>;\n\ntype EventArguments<\n\tDefinitions extends Record<string, TelemetryEventAttributeDefinition>,\n\tAttributes extends InferEventAttributes<Definitions>,\n> = [RequiredAttributeNames<Definitions>] extends [never]\n\t? [attributes?: ExactTelemetryAttributes<InferEventAttributes<Definitions>, Attributes>]\n\t: [attributes: ExactTelemetryAttributes<InferEventAttributes<Definitions>, Attributes>];\n\nexport type SchemaTelemetrySpan<\n\tSchema extends TelemetrySchemaDefinition,\n\tName extends TelemetrySchemaSpanName<Schema>,\n> = Omit<TelemetrySpan, \"addEvent\" | \"setAttributes\"> & {\n\taddEvent<\n\t\tEventName extends TelemetrySchemaSpanEventName<Schema, Name>,\n\t\tconst Attributes extends InferEventAttributes<\n\t\t\tSchemaSpanEventAttributeDefinitions<Schema, Name, EventName>\n\t\t> = InferEventAttributes<SchemaSpanEventAttributeDefinitions<Schema, Name, EventName>>,\n\t>(\n\t\tname: EventName,\n\t\t...args: EventArguments<SchemaSpanEventAttributeDefinitions<Schema, Name, EventName>, Attributes>\n\t): void;\n\tsetAttributes<const Attributes extends TelemetrySchemaSpanEndAttributes<Schema, Name>>(\n\t\tattributes: ExactTelemetryAttributes<TelemetrySchemaSpanEndAttributes<Schema, Name>, Attributes>,\n\t): void;\n};\n\nexport type TelemetrySchemaSpanUnion<Schema extends TelemetrySchemaDefinition> = {\n\t[Name in TelemetrySchemaSpanName<Schema>]: {\n\t\tname: Name;\n\t\tstartAttributes: TelemetrySchemaSpanStartAttributes<Schema, Name>;\n\t\tendAttributes: TelemetrySchemaSpanEndAttributes<Schema, Name>;\n\t\tevents: {\n\t\t\t[EventName in TelemetrySchemaSpanEventName<Schema, Name>]: TelemetrySchemaSpanEventAttributes<\n\t\t\t\tSchema,\n\t\t\t\tName,\n\t\t\t\tEventName\n\t\t\t>;\n\t\t};\n\t};\n}[TelemetrySchemaSpanName<Schema>];\n\ntype TelemetrySchemaTuple = readonly [TelemetrySchemaDefinition, ...TelemetrySchemaDefinition[]];\n\ntype SpanNameInSchema<Schema extends TelemetrySchemaDefinition> = Schema extends TelemetrySchemaDefinition\n\t? TelemetrySchemaSpanName<Schema>\n\t: never;\n\ntype SpanNameInSchemas<Schemas extends TelemetrySchemaTuple> = SpanNameInSchema<Schemas[number]>;\n\ntype SpanStartAttributesInSchema<\n\tSchema extends TelemetrySchemaDefinition,\n\tName extends string,\n> = Schema extends TelemetrySchemaDefinition\n\t? Name extends TelemetrySchemaSpanName<Schema>\n\t\t? TelemetrySchemaSpanStartAttributes<Schema, Name>\n\t\t: never\n\t: never;\n\ntype SpanInSchema<\n\tSchema extends TelemetrySchemaDefinition,\n\tName extends string,\n> = Schema extends TelemetrySchemaDefinition\n\t? Name extends TelemetrySchemaSpanName<Schema>\n\t\t? SchemaTelemetrySpan<Schema, Name>\n\t\t: never\n\t: never;\n\ntype DuplicateTelemetrySpanNames<\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?\n\t\t\t| Extract<TelemetrySchemaSpanName<Schema>, Seen>\n\t\t\t| DuplicateTelemetrySpanNames<Rest, Seen | TelemetrySchemaSpanName<Schema>>\n\t: never;\n\ntype UniqueTelemetrySchemas<Schemas extends TelemetrySchemaTuple> = [DuplicateTelemetrySpanNames<Schemas>] extends [\n\tnever,\n]\n\t? unknown\n\t: { readonly \"duplicate telemetry span names\": DuplicateTelemetrySpanNames<Schemas> };\n\ntype UnionToIntersection<Union> = (Union extends unknown ? (value: Union) => void : never) extends (\n\tvalue: infer Intersection,\n) => void\n\t? Intersection\n\t: never;\n\ntype TypedSpanStarterForName<Schemas extends TelemetrySchemaTuple, Name extends SpanNameInSchemas<Schemas>> = <\n\tconst Attributes extends SpanStartAttributesInSchema<Schemas[number], Name>,\n\tResult,\n>(\n\tname: Name,\n\tattributes: ExactTelemetryAttributes<SpanStartAttributesInSchema<Schemas[number], Name>, Attributes>,\n\tcallback: (\n\t\tspan: SpanInSchema<Schemas[number], Name>,\n\t\tstartChildSpan: TypedSpanStarter<Schemas>,\n\t) => Result | Promise<Result>,\n) => Promise<Result>;\n\n/** A per-span overload set bound to one explicit parent context and one or more schemas. */\nexport type TypedSpanStarter<Schemas extends TelemetrySchemaTuple> = UnionToIntersection<\n\t{\n\t\t[Name in SpanNameInSchemas<Schemas>]: TypedSpanStarterForName<Schemas, Name>;\n\t}[SpanNameInSchemas<Schemas>]\n>;\n\nfunction bindTypedSpanStarter<Schemas extends TelemetrySchemaTuple>(\n\ttelemetryContext: TelemetryContext,\n): TypedSpanStarter<Schemas> {\n\tconst startSpan = (\n\t\tname: SpanNameInSchemas<Schemas>,\n\t\tattributes: SpanAttributes,\n\t\tcallback: (\n\t\t\tspan: SpanInSchema<Schemas[number], SpanNameInSchemas<Schemas>>,\n\t\t\tstartChildSpan: TypedSpanStarter<Schemas>,\n\t\t) => unknown,\n\t): Promise<unknown> =>\n\t\ttelemetryContext.startSpan({ name, attributes }, (span) =>\n\t\t\tcallback(\n\t\t\t\tspan as SpanInSchema<Schemas[number], SpanNameInSchemas<Schemas>>,\n\t\t\t\tbindTypedSpanStarter<Schemas>(span),\n\t\t\t),\n\t\t);\n\n\treturn startSpan as TypedSpanStarter<Schemas>;\n}\n\n/**\n * Bind an explicit parent context to the combined span vocabulary of one or more schemas.\n * Schema values are used only for type inference; no runtime schema validation is performed.\n */\nexport function createTypedSpanStarter<const Schemas extends TelemetrySchemaTuple>(\n\ttelemetryContext: TelemetryContext,\n\t_schemas: Schemas & UniqueTelemetrySchemas<Schemas>,\n): TypedSpanStarter<Schemas> {\n\treturn bindTypedSpanStarter<Schemas>(telemetryContext);\n}\n\nexport type { RecordedTelemetryEvent, RecordedTelemetrySpan } from \"./memory.ts\";\nexport { InMemoryTelemetryContext } from \"./memory.ts\";\n"]}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export { NOOP_TELEMETRY_CONTEXT } from "./noop.js";
|
|
2
|
+
/** Typed identity helper for serializable telemetry schema data. */
|
|
3
|
+
export function defineTelemetrySchema(schema) {
|
|
4
|
+
return schema;
|
|
5
|
+
}
|
|
6
|
+
function bindTypedSpanStarter(telemetryContext) {
|
|
7
|
+
const startSpan = (name, attributes, callback) => telemetryContext.startSpan({ name, attributes }, (span) => callback(span, bindTypedSpanStarter(span)));
|
|
8
|
+
return startSpan;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Bind an explicit parent context to the combined span vocabulary of one or more schemas.
|
|
12
|
+
* Schema values are used only for type inference; no runtime schema validation is performed.
|
|
13
|
+
*/
|
|
14
|
+
export function createTypedSpanStarter(telemetryContext, _schemas) {
|
|
15
|
+
return bindTypedSpanStarter(telemetryContext);
|
|
16
|
+
}
|
|
17
|
+
export { InMemoryTelemetryContext } from "./memory.js";
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AA+CnD,oEAAoE;AACpE,MAAM,UAAU,qBAAqB,CAA4C,MAAS,EAAK;IAC9F,OAAO,MAAM,CAAC;AAAA,CACd;AA0PD,SAAS,oBAAoB,CAC5B,gBAAkC,EACN;IAC5B,MAAM,SAAS,GAAG,CACjB,IAAgC,EAChC,UAA0B,EAC1B,QAGY,EACO,EAAE,CACrB,gBAAgB,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CACzD,QAAQ,CACP,IAAiE,EACjE,oBAAoB,CAAU,IAAI,CAAC,CACnC,CACD,CAAC;IAEH,OAAO,SAAsC,CAAC;AAAA,CAC9C;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CACrC,gBAAkC,EAClC,QAAmD,EACvB;IAC5B,OAAO,oBAAoB,CAAU,gBAAgB,CAAC,CAAC;AAAA,CACvD;AAGD,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC","sourcesContent":["export type AttributeValue = string | number | boolean | readonly string[] | readonly number[] | readonly boolean[];\n\nexport interface SpanAttributes {\n\t[name: string]: AttributeValue | undefined;\n}\n\nexport interface SpanOptions {\n\tname: string;\n\tattributes?: SpanAttributes;\n}\n\nexport type SpanStatus = { status: \"ok\" } | { status: \"error\"; error?: { name: string; message: string } };\n\nexport interface TelemetryContext {\n\tstartSpan<T>(options: SpanOptions, callback: (span: TelemetrySpan) => T | Promise<T>): Promise<T>;\n}\n\nexport interface TelemetrySpan extends TelemetryContext {\n\taddEvent(name: string, attributes?: SpanAttributes): void;\n\tsetAttributes(attributes: SpanAttributes): void;\n\tsetStatus(status: SpanStatus): void;\n}\n\nexport { NOOP_TELEMETRY_CONTEXT } from \"./noop.ts\";\n\nexport type TelemetryAttributeType = \"string\" | \"number\" | \"boolean\" | \"string[]\" | \"number[]\" | \"boolean[]\";\n\nexport interface TelemetryAttributeMetadata {\n\tdescription: string;\n\tsensitive?: boolean;\n\tcardinality?: \"low\" | \"high\";\n}\n\nexport type TelemetryAttributeDefinition = TelemetryAttributeMetadata &\n\t(\n\t\t| { type: \"string\"; values?: readonly string[]; examples?: readonly string[] }\n\t\t| { type: \"number\"; values?: readonly number[]; examples?: readonly number[] }\n\t\t| { type: \"boolean\"; values?: readonly boolean[]; examples?: readonly boolean[] }\n\t\t| { type: \"string[]\"; elementValues?: readonly string[]; examples?: readonly (readonly string[])[] }\n\t\t| { type: \"number[]\"; elementValues?: readonly number[]; examples?: readonly (readonly number[])[] }\n\t\t| { type: \"boolean[]\"; elementValues?: readonly boolean[]; examples?: readonly (readonly boolean[])[] }\n\t);\n\nexport type TelemetryStartAttributeDefinition = TelemetryAttributeDefinition & { required: boolean };\nexport type TelemetryEventAttributeDefinition = TelemetryAttributeDefinition & { required: boolean };\n\nexport interface TelemetryEventDefinition {\n\tdescription: string;\n\tattributes: Record<string, TelemetryEventAttributeDefinition>;\n}\n\nexport type TelemetryParentDefinition =\n\t| { kind: \"any\" }\n\t| { kind: \"root_or_external\" }\n\t| { kind: \"spans\"; spans: readonly string[] };\n\nexport interface TelemetrySpanDefinition {\n\tdescription: string;\n\tparents: TelemetryParentDefinition;\n\tstartAttributes: Record<string, TelemetryStartAttributeDefinition>;\n\tendAttributes: Record<string, TelemetryAttributeDefinition>;\n\tevents?: Record<string, TelemetryEventDefinition>;\n\tstatus: { default: \"ok\"; errorWhen: string };\n}\n\nexport interface TelemetrySchemaDefinition {\n\tversion: number;\n\tspans: Record<string, TelemetrySpanDefinition>;\n}\n\n/** Typed identity helper for serializable telemetry schema data. */\nexport function defineTelemetrySchema<const T extends TelemetrySchemaDefinition>(schema: T): T {\n\treturn schema;\n}\n\ntype AttributeDefinitionValue<Definition extends TelemetryAttributeDefinition> = Definition extends {\n\ttype: \"string\";\n\tvalues: readonly (infer Value extends string)[];\n}\n\t? Value\n\t: Definition extends { type: \"string\" }\n\t\t? string\n\t\t: Definition extends { type: \"number\"; values: readonly (infer Value extends number)[] }\n\t\t\t? Value\n\t\t\t: Definition extends { type: \"number\" }\n\t\t\t\t? number\n\t\t\t\t: Definition extends { type: \"boolean\"; values: readonly (infer Value extends boolean)[] }\n\t\t\t\t\t? Value\n\t\t\t\t\t: Definition extends { type: \"boolean\" }\n\t\t\t\t\t\t? boolean\n\t\t\t\t\t\t: Definition extends {\n\t\t\t\t\t\t\t\t\ttype: \"string[]\";\n\t\t\t\t\t\t\t\t\telementValues: readonly (infer Value extends string)[];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t? readonly Value[]\n\t\t\t\t\t\t\t: Definition extends { type: \"string[]\" }\n\t\t\t\t\t\t\t\t? readonly string[]\n\t\t\t\t\t\t\t\t: Definition extends {\n\t\t\t\t\t\t\t\t\t\t\ttype: \"number[]\";\n\t\t\t\t\t\t\t\t\t\t\telementValues: readonly (infer Value extends number)[];\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t? readonly Value[]\n\t\t\t\t\t\t\t\t\t: Definition extends { type: \"number[]\" }\n\t\t\t\t\t\t\t\t\t\t? readonly number[]\n\t\t\t\t\t\t\t\t\t\t: Definition extends {\n\t\t\t\t\t\t\t\t\t\t\t\t\ttype: \"boolean[]\";\n\t\t\t\t\t\t\t\t\t\t\t\t\telementValues: readonly (infer Value extends boolean)[];\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t? readonly Value[]\n\t\t\t\t\t\t\t\t\t\t\t: readonly boolean[];\n\ntype RequiredAttributeNames<\n\tDefinitions extends Record<string, TelemetryStartAttributeDefinition | TelemetryEventAttributeDefinition>,\n> = {\n\t[Name in keyof Definitions]-?: Definitions[Name][\"required\"] extends true ? Name : never;\n}[keyof Definitions];\n\ntype OptionalAttributeNames<\n\tDefinitions extends Record<string, TelemetryStartAttributeDefinition | TelemetryEventAttributeDefinition>,\n> = Exclude<keyof Definitions, RequiredAttributeNames<Definitions>>;\n\nexport type InferRequiredAndOptionalAttributes<\n\tDefinitions extends Record<string, TelemetryStartAttributeDefinition | TelemetryEventAttributeDefinition>,\n> = keyof Definitions extends never\n\t? Record<string, never>\n\t: {\n\t\t\t[Name in RequiredAttributeNames<Definitions>]: AttributeDefinitionValue<Definitions[Name]>;\n\t\t} & {\n\t\t\t[Name in OptionalAttributeNames<Definitions>]?: AttributeDefinitionValue<Definitions[Name]>;\n\t\t};\n\nexport type InferStartAttributes<Definitions extends Record<string, TelemetryStartAttributeDefinition>> =\n\tInferRequiredAndOptionalAttributes<Definitions>;\n\nexport type InferOptionalAttributes<Definitions extends Record<string, TelemetryAttributeDefinition>> =\n\tkeyof Definitions extends never\n\t\t? Record<string, never>\n\t\t: { [Name in keyof Definitions]?: AttributeDefinitionValue<Definitions[Name]> };\n\nexport type ExactTelemetryAttributes<Expected, Actual extends Expected> = Actual &\n\tRecord<Exclude<keyof Actual, keyof Expected>, never>;\n\nexport type InferEventAttributes<Definitions extends Record<string, TelemetryEventAttributeDefinition>> =\n\tInferRequiredAndOptionalAttributes<Definitions>;\n\nexport type TelemetrySchemaSpanName<Schema extends TelemetrySchemaDefinition> = keyof Schema[\"spans\"] & string;\n\ntype SchemaSpan<\n\tSchema extends TelemetrySchemaDefinition,\n\tName extends TelemetrySchemaSpanName<Schema>,\n> = Schema[\"spans\"][Name];\n\nexport type TelemetrySchemaSpanStartAttributes<\n\tSchema extends TelemetrySchemaDefinition,\n\tName extends TelemetrySchemaSpanName<Schema>,\n> = SchemaSpan<Schema, Name>[\"startAttributes\"] extends infer Definitions extends Record<\n\tstring,\n\tTelemetryStartAttributeDefinition\n>\n\t? InferStartAttributes<Definitions>\n\t: never;\n\nexport type TelemetrySchemaSpanEndAttributes<\n\tSchema extends TelemetrySchemaDefinition,\n\tName extends TelemetrySchemaSpanName<Schema>,\n> = SchemaSpan<Schema, Name>[\"endAttributes\"] extends infer Definitions extends Record<\n\tstring,\n\tTelemetryAttributeDefinition\n>\n\t? InferOptionalAttributes<Definitions>\n\t: never;\n\ntype SchemaSpanEvents<\n\tSchema extends TelemetrySchemaDefinition,\n\tName extends TelemetrySchemaSpanName<Schema>,\n> = SchemaSpan<Schema, Name> extends { events: infer Events extends Record<string, TelemetryEventDefinition> }\n\t? Events\n\t: Record<never, never>;\n\nexport type TelemetrySchemaSpanEventName<\n\tSchema extends TelemetrySchemaDefinition,\n\tName extends TelemetrySchemaSpanName<Schema>,\n> = keyof SchemaSpanEvents<Schema, Name> & string;\n\ntype SchemaSpanEvent<\n\tSchema extends TelemetrySchemaDefinition,\n\tName extends TelemetrySchemaSpanName<Schema>,\n\tEventName extends TelemetrySchemaSpanEventName<Schema, Name>,\n> = SchemaSpanEvents<Schema, Name> extends infer Events\n\t? EventName extends keyof Events\n\t\t? Events[EventName]\n\t\t: never\n\t: never;\n\nexport type TelemetrySchemaSpanEventAttributes<\n\tSchema extends TelemetrySchemaDefinition,\n\tName extends TelemetrySchemaSpanName<Schema>,\n\tEventName extends TelemetrySchemaSpanEventName<Schema, Name>,\n> = SchemaSpanEvent<Schema, Name, EventName> extends {\n\tattributes: infer Definitions extends Record<string, TelemetryEventAttributeDefinition>;\n}\n\t? InferEventAttributes<Definitions>\n\t: never;\n\ntype SchemaSpanEventAttributeDefinitions<\n\tSchema extends TelemetrySchemaDefinition,\n\tName extends TelemetrySchemaSpanName<Schema>,\n\tEventName extends TelemetrySchemaSpanEventName<Schema, Name>,\n> = SchemaSpanEvent<Schema, Name, EventName> extends {\n\tattributes: infer Definitions extends Record<string, TelemetryEventAttributeDefinition>;\n}\n\t? Definitions\n\t: Record<never, never>;\n\ntype EventArguments<\n\tDefinitions extends Record<string, TelemetryEventAttributeDefinition>,\n\tAttributes extends InferEventAttributes<Definitions>,\n> = [RequiredAttributeNames<Definitions>] extends [never]\n\t? [attributes?: ExactTelemetryAttributes<InferEventAttributes<Definitions>, Attributes>]\n\t: [attributes: ExactTelemetryAttributes<InferEventAttributes<Definitions>, Attributes>];\n\nexport type SchemaTelemetrySpan<\n\tSchema extends TelemetrySchemaDefinition,\n\tName extends TelemetrySchemaSpanName<Schema>,\n> = Omit<TelemetrySpan, \"addEvent\" | \"setAttributes\"> & {\n\taddEvent<\n\t\tEventName extends TelemetrySchemaSpanEventName<Schema, Name>,\n\t\tconst Attributes extends InferEventAttributes<\n\t\t\tSchemaSpanEventAttributeDefinitions<Schema, Name, EventName>\n\t\t> = InferEventAttributes<SchemaSpanEventAttributeDefinitions<Schema, Name, EventName>>,\n\t>(\n\t\tname: EventName,\n\t\t...args: EventArguments<SchemaSpanEventAttributeDefinitions<Schema, Name, EventName>, Attributes>\n\t): void;\n\tsetAttributes<const Attributes extends TelemetrySchemaSpanEndAttributes<Schema, Name>>(\n\t\tattributes: ExactTelemetryAttributes<TelemetrySchemaSpanEndAttributes<Schema, Name>, Attributes>,\n\t): void;\n};\n\nexport type TelemetrySchemaSpanUnion<Schema extends TelemetrySchemaDefinition> = {\n\t[Name in TelemetrySchemaSpanName<Schema>]: {\n\t\tname: Name;\n\t\tstartAttributes: TelemetrySchemaSpanStartAttributes<Schema, Name>;\n\t\tendAttributes: TelemetrySchemaSpanEndAttributes<Schema, Name>;\n\t\tevents: {\n\t\t\t[EventName in TelemetrySchemaSpanEventName<Schema, Name>]: TelemetrySchemaSpanEventAttributes<\n\t\t\t\tSchema,\n\t\t\t\tName,\n\t\t\t\tEventName\n\t\t\t>;\n\t\t};\n\t};\n}[TelemetrySchemaSpanName<Schema>];\n\ntype TelemetrySchemaTuple = readonly [TelemetrySchemaDefinition, ...TelemetrySchemaDefinition[]];\n\ntype SpanNameInSchema<Schema extends TelemetrySchemaDefinition> = Schema extends TelemetrySchemaDefinition\n\t? TelemetrySchemaSpanName<Schema>\n\t: never;\n\ntype SpanNameInSchemas<Schemas extends TelemetrySchemaTuple> = SpanNameInSchema<Schemas[number]>;\n\ntype SpanStartAttributesInSchema<\n\tSchema extends TelemetrySchemaDefinition,\n\tName extends string,\n> = Schema extends TelemetrySchemaDefinition\n\t? Name extends TelemetrySchemaSpanName<Schema>\n\t\t? TelemetrySchemaSpanStartAttributes<Schema, Name>\n\t\t: never\n\t: never;\n\ntype SpanInSchema<\n\tSchema extends TelemetrySchemaDefinition,\n\tName extends string,\n> = Schema extends TelemetrySchemaDefinition\n\t? Name extends TelemetrySchemaSpanName<Schema>\n\t\t? SchemaTelemetrySpan<Schema, Name>\n\t\t: never\n\t: never;\n\ntype DuplicateTelemetrySpanNames<\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?\n\t\t\t| Extract<TelemetrySchemaSpanName<Schema>, Seen>\n\t\t\t| DuplicateTelemetrySpanNames<Rest, Seen | TelemetrySchemaSpanName<Schema>>\n\t: never;\n\ntype UniqueTelemetrySchemas<Schemas extends TelemetrySchemaTuple> = [DuplicateTelemetrySpanNames<Schemas>] extends [\n\tnever,\n]\n\t? unknown\n\t: { readonly \"duplicate telemetry span names\": DuplicateTelemetrySpanNames<Schemas> };\n\ntype UnionToIntersection<Union> = (Union extends unknown ? (value: Union) => void : never) extends (\n\tvalue: infer Intersection,\n) => void\n\t? Intersection\n\t: never;\n\ntype TypedSpanStarterForName<Schemas extends TelemetrySchemaTuple, Name extends SpanNameInSchemas<Schemas>> = <\n\tconst Attributes extends SpanStartAttributesInSchema<Schemas[number], Name>,\n\tResult,\n>(\n\tname: Name,\n\tattributes: ExactTelemetryAttributes<SpanStartAttributesInSchema<Schemas[number], Name>, Attributes>,\n\tcallback: (\n\t\tspan: SpanInSchema<Schemas[number], Name>,\n\t\tstartChildSpan: TypedSpanStarter<Schemas>,\n\t) => Result | Promise<Result>,\n) => Promise<Result>;\n\n/** A per-span overload set bound to one explicit parent context and one or more schemas. */\nexport type TypedSpanStarter<Schemas extends TelemetrySchemaTuple> = UnionToIntersection<\n\t{\n\t\t[Name in SpanNameInSchemas<Schemas>]: TypedSpanStarterForName<Schemas, Name>;\n\t}[SpanNameInSchemas<Schemas>]\n>;\n\nfunction bindTypedSpanStarter<Schemas extends TelemetrySchemaTuple>(\n\ttelemetryContext: TelemetryContext,\n): TypedSpanStarter<Schemas> {\n\tconst startSpan = (\n\t\tname: SpanNameInSchemas<Schemas>,\n\t\tattributes: SpanAttributes,\n\t\tcallback: (\n\t\t\tspan: SpanInSchema<Schemas[number], SpanNameInSchemas<Schemas>>,\n\t\t\tstartChildSpan: TypedSpanStarter<Schemas>,\n\t\t) => unknown,\n\t): Promise<unknown> =>\n\t\ttelemetryContext.startSpan({ name, attributes }, (span) =>\n\t\t\tcallback(\n\t\t\t\tspan as SpanInSchema<Schemas[number], SpanNameInSchemas<Schemas>>,\n\t\t\t\tbindTypedSpanStarter<Schemas>(span),\n\t\t\t),\n\t\t);\n\n\treturn startSpan as TypedSpanStarter<Schemas>;\n}\n\n/**\n * Bind an explicit parent context to the combined span vocabulary of one or more schemas.\n * Schema values are used only for type inference; no runtime schema validation is performed.\n */\nexport function createTypedSpanStarter<const Schemas extends TelemetrySchemaTuple>(\n\ttelemetryContext: TelemetryContext,\n\t_schemas: Schemas & UniqueTelemetrySchemas<Schemas>,\n): TypedSpanStarter<Schemas> {\n\treturn bindTypedSpanStarter<Schemas>(telemetryContext);\n}\n\nexport type { RecordedTelemetryEvent, RecordedTelemetrySpan } from \"./memory.ts\";\nexport { InMemoryTelemetryContext } from \"./memory.ts\";\n"]}
|
package/dist/memory.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { SpanAttributes, SpanOptions, SpanStatus, TelemetryContext, TelemetrySpan } from "./index.ts";
|
|
2
|
+
export interface RecordedTelemetryEvent {
|
|
3
|
+
readonly name: string;
|
|
4
|
+
readonly attributes: Readonly<SpanAttributes>;
|
|
5
|
+
}
|
|
6
|
+
export interface RecordedTelemetrySpan {
|
|
7
|
+
readonly id: number;
|
|
8
|
+
readonly parentId: number | null;
|
|
9
|
+
readonly name: string;
|
|
10
|
+
readonly attributes: Readonly<SpanAttributes>;
|
|
11
|
+
readonly events: readonly RecordedTelemetryEvent[];
|
|
12
|
+
readonly status: SpanStatus;
|
|
13
|
+
readonly settled: boolean;
|
|
14
|
+
readonly endSequence?: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Backend-neutral reference implementation that records spans in process memory.
|
|
18
|
+
* Create a fresh instance to isolate tests or independent recording scopes.
|
|
19
|
+
*/
|
|
20
|
+
export declare class InMemoryTelemetryContext implements TelemetryContext {
|
|
21
|
+
private readonly state;
|
|
22
|
+
startSpan<T>(options: SpanOptions, callback: (span: TelemetrySpan) => T | Promise<T>): Promise<T>;
|
|
23
|
+
/** Returns detached snapshots in span-start order. */
|
|
24
|
+
getSpans(): readonly RecordedTelemetrySpan[];
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEX,cAAc,EACd,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,aAAa,EACb,MAAM,YAAY,CAAC;AAGpB,MAAM,WAAW,sBAAsB;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC;CAC9C;AAED,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC;IAC9C,QAAQ,CAAC,MAAM,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACnD,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC9B;AAmKD;;;GAGG;AACH,qBAAa,wBAAyB,YAAW,gBAAgB;IAChE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAIpB;IAEF,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAEhG;IAED,sDAAsD;IACtD,QAAQ,IAAI,SAAS,qBAAqB,EAAE,CAc3C;CACD","sourcesContent":["import type {\n\tAttributeValue,\n\tSpanAttributes,\n\tSpanOptions,\n\tSpanStatus,\n\tTelemetryContext,\n\tTelemetrySpan,\n} from \"./index.ts\";\nimport { NOOP_TELEMETRY_CONTEXT } from \"./noop.ts\";\n\nexport interface RecordedTelemetryEvent {\n\treadonly name: string;\n\treadonly attributes: Readonly<SpanAttributes>;\n}\n\nexport interface RecordedTelemetrySpan {\n\treadonly id: number;\n\treadonly parentId: number | null;\n\treadonly name: string;\n\treadonly attributes: Readonly<SpanAttributes>;\n\treadonly events: readonly RecordedTelemetryEvent[];\n\treadonly status: SpanStatus;\n\treadonly settled: boolean;\n\treadonly endSequence?: number;\n}\n\ninterface MutableRecordedTelemetryEvent {\n\tname: string;\n\tattributes: SpanAttributes;\n}\n\ninterface MutableRecordedTelemetrySpan {\n\tid: number;\n\tparentId: number | null;\n\tname: string;\n\tattributes: SpanAttributes;\n\tevents: MutableRecordedTelemetryEvent[];\n\tstatus: SpanStatus;\n\texplicitStatus: boolean;\n\tsettled: boolean;\n\tendSequence?: number;\n}\n\ninterface InMemoryTelemetryState {\n\tspans: MutableRecordedTelemetrySpan[];\n\tnextSpanId: number;\n\tnextEndSequence: number;\n}\n\nfunction copyAttributeValue(value: AttributeValue): AttributeValue {\n\treturn Array.isArray(value) ? ([...value] as AttributeValue) : value;\n}\n\nfunction copyAttributes(attributes?: SpanAttributes): SpanAttributes {\n\tconst copy: SpanAttributes = {};\n\tif (!attributes) return copy;\n\tfor (const [name, value] of Object.entries(attributes)) {\n\t\tif (value !== undefined) copy[name] = copyAttributeValue(value);\n\t}\n\treturn copy;\n}\n\nfunction mergeAttributes(current: SpanAttributes, attributes: SpanAttributes): SpanAttributes {\n\tconst merged = copyAttributes(current);\n\tfor (const [name, value] of Object.entries(attributes)) {\n\t\tif (value !== undefined) merged[name] = copyAttributeValue(value);\n\t}\n\treturn merged;\n}\n\nfunction copyStatus(status: SpanStatus): SpanStatus {\n\tif (status.status === \"ok\") return { status: \"ok\" };\n\treturn status.error\n\t\t? { status: \"error\", error: { name: status.error.name, message: status.error.message } }\n\t\t: { status: \"error\" };\n}\n\nfunction automaticErrorStatus(error: unknown): SpanStatus {\n\ttry {\n\t\tif (error instanceof Error) {\n\t\t\treturn { status: \"error\", error: { name: error.name, message: error.message } };\n\t\t}\n\t} catch {\n\t\t// Error inspection is passive. Fall through to an error status without details.\n\t}\n\treturn { status: \"error\" };\n}\n\nfunction settleSpan(\n\tstate: InMemoryTelemetryState,\n\tspan: MutableRecordedTelemetrySpan,\n\tfailed: boolean,\n\terror?: unknown,\n): void {\n\tif (span.settled) return;\n\tif (failed && !span.explicitStatus) span.status = automaticErrorStatus(error);\n\tspan.settled = true;\n\tspan.endSequence = state.nextEndSequence++;\n}\n\nfunction createSpan(\n\tstate: InMemoryTelemetryState,\n\tparent: MutableRecordedTelemetrySpan | undefined,\n\toptions: SpanOptions,\n): MutableRecordedTelemetrySpan {\n\tconst name = options.name;\n\tconst attributes = copyAttributes(options.attributes);\n\treturn {\n\t\tid: state.nextSpanId++,\n\t\tparentId: parent?.id ?? null,\n\t\tname,\n\t\tattributes,\n\t\tevents: [],\n\t\tstatus: { status: \"ok\" },\n\t\texplicitStatus: false,\n\t\tsettled: false,\n\t};\n}\n\nfunction startInMemorySpan<T>(\n\tstate: InMemoryTelemetryState,\n\tparent: MutableRecordedTelemetrySpan | undefined,\n\toptions: SpanOptions,\n\tcallback: (span: TelemetrySpan) => T | Promise<T>,\n): Promise<T> {\n\tif (parent?.settled) return NOOP_TELEMETRY_CONTEXT.startSpan(options, callback);\n\n\tlet recordedSpan: MutableRecordedTelemetrySpan;\n\ttry {\n\t\trecordedSpan = createSpan(state, parent, options);\n\t\tstate.spans.push(recordedSpan);\n\t} catch {\n\t\treturn NOOP_TELEMETRY_CONTEXT.startSpan(options, callback);\n\t}\n\n\tconst span: TelemetrySpan = {\n\t\tstartSpan: <Result>(\n\t\t\tchildOptions: SpanOptions,\n\t\t\tchildCallback: (child: TelemetrySpan) => Result | Promise<Result>,\n\t\t) => startInMemorySpan(state, recordedSpan, childOptions, childCallback),\n\t\taddEvent(name, attributes) {\n\t\t\tif (recordedSpan.settled) return;\n\t\t\ttry {\n\t\t\t\trecordedSpan.events.push({ name, attributes: copyAttributes(attributes) });\n\t\t\t} catch {\n\t\t\t\t// Recording is passive. Ignore malformed or unreadable telemetry payloads.\n\t\t\t}\n\t\t},\n\t\tsetAttributes(attributes) {\n\t\t\tif (recordedSpan.settled) return;\n\t\t\ttry {\n\t\t\t\trecordedSpan.attributes = mergeAttributes(recordedSpan.attributes, attributes);\n\t\t\t} catch {\n\t\t\t\t// Recording is passive. Ignore malformed or unreadable telemetry payloads.\n\t\t\t}\n\t\t},\n\t\tsetStatus(status) {\n\t\t\tif (recordedSpan.settled) return;\n\t\t\ttry {\n\t\t\t\trecordedSpan.status = copyStatus(status);\n\t\t\t\trecordedSpan.explicitStatus = true;\n\t\t\t} catch {\n\t\t\t\t// Recording is passive. Ignore malformed or unreadable telemetry payloads.\n\t\t\t}\n\t\t},\n\t};\n\n\tlet result: T | Promise<T>;\n\ttry {\n\t\tresult = callback(span);\n\t} catch (error) {\n\t\tsettleSpan(state, recordedSpan, true, error);\n\t\treturn Promise.reject(error);\n\t}\n\n\treturn Promise.resolve(result).then(\n\t\t(value) => {\n\t\t\tsettleSpan(state, recordedSpan, false);\n\t\t\treturn value;\n\t\t},\n\t\t(error: unknown) => {\n\t\t\tsettleSpan(state, recordedSpan, true, error);\n\t\t\tthrow error;\n\t\t},\n\t);\n}\n\n/**\n * Backend-neutral reference implementation that records spans in process memory.\n * Create a fresh instance to isolate tests or independent recording scopes.\n */\nexport class InMemoryTelemetryContext implements TelemetryContext {\n\tprivate readonly state: InMemoryTelemetryState = {\n\t\tspans: [],\n\t\tnextSpanId: 1,\n\t\tnextEndSequence: 1,\n\t};\n\n\tstartSpan<T>(options: SpanOptions, callback: (span: TelemetrySpan) => T | Promise<T>): Promise<T> {\n\t\treturn startInMemorySpan(this.state, undefined, options, callback);\n\t}\n\n\t/** Returns detached snapshots in span-start order. */\n\tgetSpans(): readonly RecordedTelemetrySpan[] {\n\t\treturn this.state.spans.map((span) => ({\n\t\t\tid: span.id,\n\t\t\tparentId: span.parentId,\n\t\t\tname: span.name,\n\t\t\tattributes: copyAttributes(span.attributes),\n\t\t\tevents: span.events.map((event) => ({\n\t\t\t\tname: event.name,\n\t\t\t\tattributes: copyAttributes(event.attributes),\n\t\t\t})),\n\t\t\tstatus: copyStatus(span.status),\n\t\t\tsettled: span.settled,\n\t\t\t...(span.endSequence === undefined ? {} : { endSequence: span.endSequence }),\n\t\t}));\n\t}\n}\n"]}
|
package/dist/memory.js
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { NOOP_TELEMETRY_CONTEXT } from "./noop.js";
|
|
2
|
+
function copyAttributeValue(value) {
|
|
3
|
+
return Array.isArray(value) ? [...value] : value;
|
|
4
|
+
}
|
|
5
|
+
function copyAttributes(attributes) {
|
|
6
|
+
const copy = {};
|
|
7
|
+
if (!attributes)
|
|
8
|
+
return copy;
|
|
9
|
+
for (const [name, value] of Object.entries(attributes)) {
|
|
10
|
+
if (value !== undefined)
|
|
11
|
+
copy[name] = copyAttributeValue(value);
|
|
12
|
+
}
|
|
13
|
+
return copy;
|
|
14
|
+
}
|
|
15
|
+
function mergeAttributes(current, attributes) {
|
|
16
|
+
const merged = copyAttributes(current);
|
|
17
|
+
for (const [name, value] of Object.entries(attributes)) {
|
|
18
|
+
if (value !== undefined)
|
|
19
|
+
merged[name] = copyAttributeValue(value);
|
|
20
|
+
}
|
|
21
|
+
return merged;
|
|
22
|
+
}
|
|
23
|
+
function copyStatus(status) {
|
|
24
|
+
if (status.status === "ok")
|
|
25
|
+
return { status: "ok" };
|
|
26
|
+
return status.error
|
|
27
|
+
? { status: "error", error: { name: status.error.name, message: status.error.message } }
|
|
28
|
+
: { status: "error" };
|
|
29
|
+
}
|
|
30
|
+
function automaticErrorStatus(error) {
|
|
31
|
+
try {
|
|
32
|
+
if (error instanceof Error) {
|
|
33
|
+
return { status: "error", error: { name: error.name, message: error.message } };
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// Error inspection is passive. Fall through to an error status without details.
|
|
38
|
+
}
|
|
39
|
+
return { status: "error" };
|
|
40
|
+
}
|
|
41
|
+
function settleSpan(state, span, failed, error) {
|
|
42
|
+
if (span.settled)
|
|
43
|
+
return;
|
|
44
|
+
if (failed && !span.explicitStatus)
|
|
45
|
+
span.status = automaticErrorStatus(error);
|
|
46
|
+
span.settled = true;
|
|
47
|
+
span.endSequence = state.nextEndSequence++;
|
|
48
|
+
}
|
|
49
|
+
function createSpan(state, parent, options) {
|
|
50
|
+
const name = options.name;
|
|
51
|
+
const attributes = copyAttributes(options.attributes);
|
|
52
|
+
return {
|
|
53
|
+
id: state.nextSpanId++,
|
|
54
|
+
parentId: parent?.id ?? null,
|
|
55
|
+
name,
|
|
56
|
+
attributes,
|
|
57
|
+
events: [],
|
|
58
|
+
status: { status: "ok" },
|
|
59
|
+
explicitStatus: false,
|
|
60
|
+
settled: false,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
function startInMemorySpan(state, parent, options, callback) {
|
|
64
|
+
if (parent?.settled)
|
|
65
|
+
return NOOP_TELEMETRY_CONTEXT.startSpan(options, callback);
|
|
66
|
+
let recordedSpan;
|
|
67
|
+
try {
|
|
68
|
+
recordedSpan = createSpan(state, parent, options);
|
|
69
|
+
state.spans.push(recordedSpan);
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return NOOP_TELEMETRY_CONTEXT.startSpan(options, callback);
|
|
73
|
+
}
|
|
74
|
+
const span = {
|
|
75
|
+
startSpan: (childOptions, childCallback) => startInMemorySpan(state, recordedSpan, childOptions, childCallback),
|
|
76
|
+
addEvent(name, attributes) {
|
|
77
|
+
if (recordedSpan.settled)
|
|
78
|
+
return;
|
|
79
|
+
try {
|
|
80
|
+
recordedSpan.events.push({ name, attributes: copyAttributes(attributes) });
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
// Recording is passive. Ignore malformed or unreadable telemetry payloads.
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
setAttributes(attributes) {
|
|
87
|
+
if (recordedSpan.settled)
|
|
88
|
+
return;
|
|
89
|
+
try {
|
|
90
|
+
recordedSpan.attributes = mergeAttributes(recordedSpan.attributes, attributes);
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
// Recording is passive. Ignore malformed or unreadable telemetry payloads.
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
setStatus(status) {
|
|
97
|
+
if (recordedSpan.settled)
|
|
98
|
+
return;
|
|
99
|
+
try {
|
|
100
|
+
recordedSpan.status = copyStatus(status);
|
|
101
|
+
recordedSpan.explicitStatus = true;
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
// Recording is passive. Ignore malformed or unreadable telemetry payloads.
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
let result;
|
|
109
|
+
try {
|
|
110
|
+
result = callback(span);
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
settleSpan(state, recordedSpan, true, error);
|
|
114
|
+
return Promise.reject(error);
|
|
115
|
+
}
|
|
116
|
+
return Promise.resolve(result).then((value) => {
|
|
117
|
+
settleSpan(state, recordedSpan, false);
|
|
118
|
+
return value;
|
|
119
|
+
}, (error) => {
|
|
120
|
+
settleSpan(state, recordedSpan, true, error);
|
|
121
|
+
throw error;
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Backend-neutral reference implementation that records spans in process memory.
|
|
126
|
+
* Create a fresh instance to isolate tests or independent recording scopes.
|
|
127
|
+
*/
|
|
128
|
+
export class InMemoryTelemetryContext {
|
|
129
|
+
state = {
|
|
130
|
+
spans: [],
|
|
131
|
+
nextSpanId: 1,
|
|
132
|
+
nextEndSequence: 1,
|
|
133
|
+
};
|
|
134
|
+
startSpan(options, callback) {
|
|
135
|
+
return startInMemorySpan(this.state, undefined, options, callback);
|
|
136
|
+
}
|
|
137
|
+
/** Returns detached snapshots in span-start order. */
|
|
138
|
+
getSpans() {
|
|
139
|
+
return this.state.spans.map((span) => ({
|
|
140
|
+
id: span.id,
|
|
141
|
+
parentId: span.parentId,
|
|
142
|
+
name: span.name,
|
|
143
|
+
attributes: copyAttributes(span.attributes),
|
|
144
|
+
events: span.events.map((event) => ({
|
|
145
|
+
name: event.name,
|
|
146
|
+
attributes: copyAttributes(event.attributes),
|
|
147
|
+
})),
|
|
148
|
+
status: copyStatus(span.status),
|
|
149
|
+
settled: span.settled,
|
|
150
|
+
...(span.endSequence === undefined ? {} : { endSequence: span.endSequence }),
|
|
151
|
+
}));
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAyCnD,SAAS,kBAAkB,CAAC,KAAqB,EAAkB;IAClE,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAE,CAAC,GAAG,KAAK,CAAoB,CAAC,CAAC,CAAC,KAAK,CAAC;AAAA,CACrE;AAED,SAAS,cAAc,CAAC,UAA2B,EAAkB;IACpE,MAAM,IAAI,GAAmB,EAAE,CAAC;IAChC,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAC7B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACxD,IAAI,KAAK,KAAK,SAAS;YAAE,IAAI,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,IAAI,CAAC;AAAA,CACZ;AAED,SAAS,eAAe,CAAC,OAAuB,EAAE,UAA0B,EAAkB;IAC7F,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACxD,IAAI,KAAK,KAAK,SAAS;YAAE,MAAM,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,MAAM,CAAC;AAAA,CACd;AAED,SAAS,UAAU,CAAC,MAAkB,EAAc;IACnD,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI;QAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACpD,OAAO,MAAM,CAAC,KAAK;QAClB,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE;QACxF,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAAA,CACvB;AAED,SAAS,oBAAoB,CAAC,KAAc,EAAc;IACzD,IAAI,CAAC;QACJ,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC5B,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QACjF,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;QACR,gFAAgF;IACjF,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAAA,CAC3B;AAED,SAAS,UAAU,CAClB,KAA6B,EAC7B,IAAkC,EAClC,MAAe,EACf,KAAe,EACR;IACP,IAAI,IAAI,CAAC,OAAO;QAAE,OAAO;IACzB,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc;QAAE,IAAI,CAAC,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC9E,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACpB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,eAAe,EAAE,CAAC;AAAA,CAC3C;AAED,SAAS,UAAU,CAClB,KAA6B,EAC7B,MAAgD,EAChD,OAAoB,EACW;IAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1B,MAAM,UAAU,GAAG,cAAc,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACtD,OAAO;QACN,EAAE,EAAE,KAAK,CAAC,UAAU,EAAE;QACtB,QAAQ,EAAE,MAAM,EAAE,EAAE,IAAI,IAAI;QAC5B,IAAI;QACJ,UAAU;QACV,MAAM,EAAE,EAAE;QACV,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;QACxB,cAAc,EAAE,KAAK;QACrB,OAAO,EAAE,KAAK;KACd,CAAC;AAAA,CACF;AAED,SAAS,iBAAiB,CACzB,KAA6B,EAC7B,MAAgD,EAChD,OAAoB,EACpB,QAAiD,EACpC;IACb,IAAI,MAAM,EAAE,OAAO;QAAE,OAAO,sBAAsB,CAAC,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAEhF,IAAI,YAA0C,CAAC;IAC/C,IAAI,CAAC;QACJ,YAAY,GAAG,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAClD,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,sBAAsB,CAAC,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,IAAI,GAAkB;QAC3B,SAAS,EAAE,CACV,YAAyB,EACzB,aAAiE,EAChE,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,CAAC;QACxE,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE;YAC1B,IAAI,YAAY,CAAC,OAAO;gBAAE,OAAO;YACjC,IAAI,CAAC;gBACJ,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,cAAc,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAC5E,CAAC;YAAC,MAAM,CAAC;gBACR,2EAA2E;YAC5E,CAAC;QAAA,CACD;QACD,aAAa,CAAC,UAAU,EAAE;YACzB,IAAI,YAAY,CAAC,OAAO;gBAAE,OAAO;YACjC,IAAI,CAAC;gBACJ,YAAY,CAAC,UAAU,GAAG,eAAe,CAAC,YAAY,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YAChF,CAAC;YAAC,MAAM,CAAC;gBACR,2EAA2E;YAC5E,CAAC;QAAA,CACD;QACD,SAAS,CAAC,MAAM,EAAE;YACjB,IAAI,YAAY,CAAC,OAAO;gBAAE,OAAO;YACjC,IAAI,CAAC;gBACJ,YAAY,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;gBACzC,YAAY,CAAC,cAAc,GAAG,IAAI,CAAC;YACpC,CAAC;YAAC,MAAM,CAAC;gBACR,2EAA2E;YAC5E,CAAC;QAAA,CACD;KACD,CAAC;IAEF,IAAI,MAAsB,CAAC;IAC3B,IAAI,CAAC;QACJ,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,UAAU,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAC7C,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAClC,CAAC,KAAK,EAAE,EAAE,CAAC;QACV,UAAU,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;QACvC,OAAO,KAAK,CAAC;IAAA,CACb,EACD,CAAC,KAAc,EAAE,EAAE,CAAC;QACnB,UAAU,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAC7C,MAAM,KAAK,CAAC;IAAA,CACZ,CACD,CAAC;AAAA,CACF;AAED;;;GAGG;AACH,MAAM,OAAO,wBAAwB;IACnB,KAAK,GAA2B;QAChD,KAAK,EAAE,EAAE;QACT,UAAU,EAAE,CAAC;QACb,eAAe,EAAE,CAAC;KAClB,CAAC;IAEF,SAAS,CAAI,OAAoB,EAAE,QAAiD,EAAc;QACjG,OAAO,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAAA,CACnE;IAED,sDAAsD;IACtD,QAAQ,GAAqC;QAC5C,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACtC,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,UAAU,EAAE,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC;YAC3C,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACnC,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,UAAU,EAAE,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC;aAC5C,CAAC,CAAC;YACH,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;YAC/B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,GAAG,CAAC,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;SAC5E,CAAC,CAAC,CAAC;IAAA,CACJ;CACD","sourcesContent":["import type {\n\tAttributeValue,\n\tSpanAttributes,\n\tSpanOptions,\n\tSpanStatus,\n\tTelemetryContext,\n\tTelemetrySpan,\n} from \"./index.ts\";\nimport { NOOP_TELEMETRY_CONTEXT } from \"./noop.ts\";\n\nexport interface RecordedTelemetryEvent {\n\treadonly name: string;\n\treadonly attributes: Readonly<SpanAttributes>;\n}\n\nexport interface RecordedTelemetrySpan {\n\treadonly id: number;\n\treadonly parentId: number | null;\n\treadonly name: string;\n\treadonly attributes: Readonly<SpanAttributes>;\n\treadonly events: readonly RecordedTelemetryEvent[];\n\treadonly status: SpanStatus;\n\treadonly settled: boolean;\n\treadonly endSequence?: number;\n}\n\ninterface MutableRecordedTelemetryEvent {\n\tname: string;\n\tattributes: SpanAttributes;\n}\n\ninterface MutableRecordedTelemetrySpan {\n\tid: number;\n\tparentId: number | null;\n\tname: string;\n\tattributes: SpanAttributes;\n\tevents: MutableRecordedTelemetryEvent[];\n\tstatus: SpanStatus;\n\texplicitStatus: boolean;\n\tsettled: boolean;\n\tendSequence?: number;\n}\n\ninterface InMemoryTelemetryState {\n\tspans: MutableRecordedTelemetrySpan[];\n\tnextSpanId: number;\n\tnextEndSequence: number;\n}\n\nfunction copyAttributeValue(value: AttributeValue): AttributeValue {\n\treturn Array.isArray(value) ? ([...value] as AttributeValue) : value;\n}\n\nfunction copyAttributes(attributes?: SpanAttributes): SpanAttributes {\n\tconst copy: SpanAttributes = {};\n\tif (!attributes) return copy;\n\tfor (const [name, value] of Object.entries(attributes)) {\n\t\tif (value !== undefined) copy[name] = copyAttributeValue(value);\n\t}\n\treturn copy;\n}\n\nfunction mergeAttributes(current: SpanAttributes, attributes: SpanAttributes): SpanAttributes {\n\tconst merged = copyAttributes(current);\n\tfor (const [name, value] of Object.entries(attributes)) {\n\t\tif (value !== undefined) merged[name] = copyAttributeValue(value);\n\t}\n\treturn merged;\n}\n\nfunction copyStatus(status: SpanStatus): SpanStatus {\n\tif (status.status === \"ok\") return { status: \"ok\" };\n\treturn status.error\n\t\t? { status: \"error\", error: { name: status.error.name, message: status.error.message } }\n\t\t: { status: \"error\" };\n}\n\nfunction automaticErrorStatus(error: unknown): SpanStatus {\n\ttry {\n\t\tif (error instanceof Error) {\n\t\t\treturn { status: \"error\", error: { name: error.name, message: error.message } };\n\t\t}\n\t} catch {\n\t\t// Error inspection is passive. Fall through to an error status without details.\n\t}\n\treturn { status: \"error\" };\n}\n\nfunction settleSpan(\n\tstate: InMemoryTelemetryState,\n\tspan: MutableRecordedTelemetrySpan,\n\tfailed: boolean,\n\terror?: unknown,\n): void {\n\tif (span.settled) return;\n\tif (failed && !span.explicitStatus) span.status = automaticErrorStatus(error);\n\tspan.settled = true;\n\tspan.endSequence = state.nextEndSequence++;\n}\n\nfunction createSpan(\n\tstate: InMemoryTelemetryState,\n\tparent: MutableRecordedTelemetrySpan | undefined,\n\toptions: SpanOptions,\n): MutableRecordedTelemetrySpan {\n\tconst name = options.name;\n\tconst attributes = copyAttributes(options.attributes);\n\treturn {\n\t\tid: state.nextSpanId++,\n\t\tparentId: parent?.id ?? null,\n\t\tname,\n\t\tattributes,\n\t\tevents: [],\n\t\tstatus: { status: \"ok\" },\n\t\texplicitStatus: false,\n\t\tsettled: false,\n\t};\n}\n\nfunction startInMemorySpan<T>(\n\tstate: InMemoryTelemetryState,\n\tparent: MutableRecordedTelemetrySpan | undefined,\n\toptions: SpanOptions,\n\tcallback: (span: TelemetrySpan) => T | Promise<T>,\n): Promise<T> {\n\tif (parent?.settled) return NOOP_TELEMETRY_CONTEXT.startSpan(options, callback);\n\n\tlet recordedSpan: MutableRecordedTelemetrySpan;\n\ttry {\n\t\trecordedSpan = createSpan(state, parent, options);\n\t\tstate.spans.push(recordedSpan);\n\t} catch {\n\t\treturn NOOP_TELEMETRY_CONTEXT.startSpan(options, callback);\n\t}\n\n\tconst span: TelemetrySpan = {\n\t\tstartSpan: <Result>(\n\t\t\tchildOptions: SpanOptions,\n\t\t\tchildCallback: (child: TelemetrySpan) => Result | Promise<Result>,\n\t\t) => startInMemorySpan(state, recordedSpan, childOptions, childCallback),\n\t\taddEvent(name, attributes) {\n\t\t\tif (recordedSpan.settled) return;\n\t\t\ttry {\n\t\t\t\trecordedSpan.events.push({ name, attributes: copyAttributes(attributes) });\n\t\t\t} catch {\n\t\t\t\t// Recording is passive. Ignore malformed or unreadable telemetry payloads.\n\t\t\t}\n\t\t},\n\t\tsetAttributes(attributes) {\n\t\t\tif (recordedSpan.settled) return;\n\t\t\ttry {\n\t\t\t\trecordedSpan.attributes = mergeAttributes(recordedSpan.attributes, attributes);\n\t\t\t} catch {\n\t\t\t\t// Recording is passive. Ignore malformed or unreadable telemetry payloads.\n\t\t\t}\n\t\t},\n\t\tsetStatus(status) {\n\t\t\tif (recordedSpan.settled) return;\n\t\t\ttry {\n\t\t\t\trecordedSpan.status = copyStatus(status);\n\t\t\t\trecordedSpan.explicitStatus = true;\n\t\t\t} catch {\n\t\t\t\t// Recording is passive. Ignore malformed or unreadable telemetry payloads.\n\t\t\t}\n\t\t},\n\t};\n\n\tlet result: T | Promise<T>;\n\ttry {\n\t\tresult = callback(span);\n\t} catch (error) {\n\t\tsettleSpan(state, recordedSpan, true, error);\n\t\treturn Promise.reject(error);\n\t}\n\n\treturn Promise.resolve(result).then(\n\t\t(value) => {\n\t\t\tsettleSpan(state, recordedSpan, false);\n\t\t\treturn value;\n\t\t},\n\t\t(error: unknown) => {\n\t\t\tsettleSpan(state, recordedSpan, true, error);\n\t\t\tthrow error;\n\t\t},\n\t);\n}\n\n/**\n * Backend-neutral reference implementation that records spans in process memory.\n * Create a fresh instance to isolate tests or independent recording scopes.\n */\nexport class InMemoryTelemetryContext implements TelemetryContext {\n\tprivate readonly state: InMemoryTelemetryState = {\n\t\tspans: [],\n\t\tnextSpanId: 1,\n\t\tnextEndSequence: 1,\n\t};\n\n\tstartSpan<T>(options: SpanOptions, callback: (span: TelemetrySpan) => T | Promise<T>): Promise<T> {\n\t\treturn startInMemorySpan(this.state, undefined, options, callback);\n\t}\n\n\t/** Returns detached snapshots in span-start order. */\n\tgetSpans(): readonly RecordedTelemetrySpan[] {\n\t\treturn this.state.spans.map((span) => ({\n\t\t\tid: span.id,\n\t\t\tparentId: span.parentId,\n\t\t\tname: span.name,\n\t\t\tattributes: copyAttributes(span.attributes),\n\t\t\tevents: span.events.map((event) => ({\n\t\t\t\tname: event.name,\n\t\t\t\tattributes: copyAttributes(event.attributes),\n\t\t\t})),\n\t\t\tstatus: copyStatus(span.status),\n\t\t\tsettled: span.settled,\n\t\t\t...(span.endSequence === undefined ? {} : { endSequence: span.endSequence }),\n\t\t}));\n\t}\n}\n"]}
|
package/dist/noop.d.ts
ADDED
|
@@ -0,0 +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","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"]}
|
package/dist/noop.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
function startNoopSpan(_options, callback) {
|
|
2
|
+
try {
|
|
3
|
+
return Promise.resolve(callback(noopTelemetrySpan));
|
|
4
|
+
}
|
|
5
|
+
catch (error) {
|
|
6
|
+
return Promise.reject(error);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
const noopTelemetrySpan = {
|
|
10
|
+
startSpan: startNoopSpan,
|
|
11
|
+
addEvent: () => { },
|
|
12
|
+
setAttributes: () => { },
|
|
13
|
+
setStatus: () => { },
|
|
14
|
+
};
|
|
15
|
+
Object.freeze(noopTelemetrySpan);
|
|
16
|
+
/** Shared telemetry context used when an application does not provide one. */
|
|
17
|
+
export const NOOP_TELEMETRY_CONTEXT = noopTelemetrySpan;
|
|
18
|
+
//# sourceMappingURL=noop.js.map
|
package/dist/noop.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"noop.js","sourceRoot":"","sources":["../src/noop.ts"],"names":[],"mappings":"AAEA,SAAS,aAAa,CAAI,QAAqB,EAAE,QAAiD,EAAc;IAC/G,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;AAAA,CACD;AAED,MAAM,iBAAiB,GAAkB;IACxC,SAAS,EAAE,aAAa;IACxB,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAC,CAAC;IAClB,aAAa,EAAE,GAAG,EAAE,CAAC,EAAC,CAAC;IACvB,SAAS,EAAE,GAAG,EAAE,CAAC,EAAC,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"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { TelemetryAdapterConformanceCase, TelemetryAdapterFixtureFactory } from "./types.ts";
|
|
2
|
+
/** Creates runner-independent cases for the callback telemetry adapter contract. */
|
|
3
|
+
export declare function createTelemetryAdapterConformance(factory: TelemetryAdapterFixtureFactory): readonly TelemetryAdapterConformanceCase[];
|
|
4
|
+
//# sourceMappingURL=conformance.d.ts.map
|
|
@@ -0,0 +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","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"]}
|