@tessar/opentelemetry 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/plugin.js ADDED
@@ -0,0 +1,40 @@
1
+ import { BatchSpanProcessor, SimpleSpanProcessor, } from "@opentelemetry/sdk-trace-base";
2
+ import { createTracing } from "./trace.js";
3
+ import { registerLifecycleHooks } from "./lifecycle.js";
4
+ import { registerModelHooks } from "./models.js";
5
+ import { registerToolHooks } from "./tools.js";
6
+ /** One shared tracing lifecycle with independently mapped export destinations. */
7
+ export class OpenTelemetryPlugin {
8
+ id = "opentelemetry";
9
+ #options;
10
+ constructor(options) {
11
+ if (!Array.isArray(options?.adapters) || !options.adapters.length)
12
+ throw Error("OpenTelemetry requires at least one trace adapter");
13
+ if (options.adapters.some((adapter) => !adapter || typeof adapter.createExporter !== "function"))
14
+ throw Error("A trace adapter must implement createExporter()");
15
+ this.#options = {
16
+ ...options,
17
+ adapters: [...options.adapters],
18
+ tags: options.tags?.slice(),
19
+ };
20
+ }
21
+ async setup(tessar) {
22
+ const processors = [];
23
+ const Processor = this.#options.realtime
24
+ ? SimpleSpanProcessor
25
+ : BatchSpanProcessor;
26
+ try {
27
+ for (const adapter of this.#options.adapters)
28
+ processors.push(new Processor(adapter.createExporter()));
29
+ const tracing = createTracing(this.#options, processors);
30
+ registerLifecycleHooks(tessar, tracing);
31
+ registerModelHooks(tessar, tracing);
32
+ registerToolHooks(tessar, tracing);
33
+ }
34
+ catch (error) {
35
+ await Promise.allSettled(processors.map((processor) => processor.shutdown()));
36
+ throw error;
37
+ }
38
+ }
39
+ }
40
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kBAAkB,EAClB,mBAAmB,GAEpB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,kFAAkF;AAClF,MAAM,OAAO,mBAAmB;IACrB,EAAE,GAAG,eAAe,CAAC;IACrB,QAAQ,CAAuB;IAExC,YAAY,OAA6B;QACvC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM;YAC/D,MAAM,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACnE,IACE,OAAO,CAAC,QAAQ,CAAC,IAAI,CACnB,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,IAAI,OAAO,OAAO,CAAC,cAAc,KAAK,UAAU,CACtE;YAED,MAAM,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACjE,IAAI,CAAC,QAAQ,GAAG;YACd,GAAG,OAAO;YACV,QAAQ,EAAE,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;YAC/B,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE;SAC5B,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,MAAqB;QAC/B,MAAM,UAAU,GAAoB,EAAE,CAAC;QACvC,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ;YACtC,CAAC,CAAC,mBAAmB;YACrB,CAAC,CAAC,kBAAkB,CAAC;QACvB,IAAI,CAAC;YACH,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ;gBAC1C,UAAU,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;YAC3D,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YACzD,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACxC,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACpC,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,CAAC,UAAU,CACtB,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CACpD,CAAC;YACF,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ import { type PluginContext } from "@tessar/core";
2
+ import { type TraceRuntime } from "./trace.js";
3
+ /** Records tool arguments, results, errors and parent Turn relationships. */
4
+ export declare function registerToolHooks(tessar: PluginContext, tracing: TraceRuntime): void;
package/dist/tools.js ADDED
@@ -0,0 +1,53 @@
1
+ import { tool } from "@tessar/core";
2
+ import { update } from "./trace.js";
3
+ /** Records tool arguments, results, errors and parent Turn relationships. */
4
+ export function registerToolHooks(tessar, tracing) {
5
+ const { current, parentTurn, start, end, failure } = tracing;
6
+ tessar.hook(tool.start, (event, context) => {
7
+ const state = current(event);
8
+ if (!state || state.tools.has(event.payload.toolExecutionId))
9
+ return;
10
+ const call = state.calls.get(event.payload.toolCallId);
11
+ const name = event.payload.name ?? call?.name ?? "tool";
12
+ const definition = context.registry.get("tool", name);
13
+ const span = start(name, "tool", event, {
14
+ ...state.identity,
15
+ toolExecutionId: event.payload.toolExecutionId,
16
+ toolCallId: event.payload.toolCallId,
17
+ toolDescription: definition?.description,
18
+ toolParameters: definition?.jsonSchema,
19
+ }, parentTurn(state, event, event.payload.turnId), { input: event.payload.arguments ?? call?.arguments }, event.payload.startedAt);
20
+ state.tools.set(event.payload.toolExecutionId, span);
21
+ });
22
+ tessar.hook(tool.error, (event) => {
23
+ const span = current(event)?.tools.get(event.payload.toolExecutionId);
24
+ if (span)
25
+ failure(span, "tool", event.payload.error);
26
+ });
27
+ tessar.hook(tool.end, (event, context) => {
28
+ const state = current(event);
29
+ if (!state)
30
+ return;
31
+ const call = state.calls.get(event.payload.toolCallId);
32
+ const definition = call && context.registry.get("tool", call.name);
33
+ const active = state.tools.get(event.payload.toolExecutionId);
34
+ const span = active ??
35
+ start(call?.name ?? "tool", "tool", event, {
36
+ ...state.identity,
37
+ toolExecutionId: event.payload.toolExecutionId,
38
+ toolCallId: event.payload.toolCallId,
39
+ }, parentTurn(state, event), { input: call?.arguments });
40
+ update(span, "tool", {
41
+ output: event.payload.result,
42
+ metadata: {
43
+ status: event.payload.status,
44
+ toolDescription: definition?.description,
45
+ toolParameters: definition?.jsonSchema,
46
+ },
47
+ });
48
+ end(span, event, event.payload.endedAt);
49
+ state.tools.delete(event.payload.toolExecutionId);
50
+ state.calls.delete(event.payload.toolCallId);
51
+ });
52
+ }
53
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { type Span } from "@opentelemetry/api";
2
+ import { type SpanProcessor } from "@opentelemetry/sdk-trace-base";
3
+ import type { EventContext, MessageData } from "@tessar/core";
4
+ import type { OpenTelemetryOptions, ObservationType, ObservationAttributes, ExecutionTrace, ThreadTraceState } from "./types.js";
5
+ export declare function update(span: Span, type: ObservationType, attributes: ObservationAttributes): void;
6
+ export declare const time: (event: EventContext, recorded?: string | null) => Date | undefined;
7
+ /** Owns the instance-local tracer, span hierarchy and active execution state. */
8
+ export declare function createTracing(options: OpenTelemetryOptions, spanProcessors: SpanProcessor[]): {
9
+ executions: Map<string, ExecutionTrace>;
10
+ links: Map<string, ThreadTraceState>;
11
+ start: (name: string, type: ObservationType, event: EventContext, identity: Record<string, unknown>, parent?: Span, attributes?: ObservationAttributes, startedAt?: string | null) => Span;
12
+ end: (span: Span, event: EventContext, endedAt?: string | null) => void;
13
+ begin: (event: EventContext, checkpointId?: string, startedAt?: string | null) => ExecutionTrace | undefined;
14
+ current: (event: EventContext) => ExecutionTrace | undefined;
15
+ parentTurn: (state: ExecutionTrace, event: EventContext, id?: string | undefined, index?: number) => Span;
16
+ failure: (span: Span, type: ObservationType, error: {
17
+ message: string;
18
+ }) => void;
19
+ finish: (event: EventContext, status: string, error?: {
20
+ message: string;
21
+ } | null, output?: readonly MessageData[], endedAt?: string | null) => void;
22
+ shutdown: () => Promise<void>;
23
+ };
24
+ export type TraceRuntime = ReturnType<typeof createTracing>;
package/dist/trace.js ADDED
@@ -0,0 +1,211 @@
1
+ import { createHash } from "node:crypto";
2
+ import { ROOT_CONTEXT, diag, SpanStatusCode, trace, } from "@opentelemetry/api";
3
+ import { BasicTracerProvider, RandomIdGenerator, } from "@opentelemetry/sdk-trace-base";
4
+ import { resourceFromAttributes } from "@opentelemetry/resources";
5
+ import { observationAttributes } from "./attributes.js";
6
+ export function update(span, type, attributes) {
7
+ if (span.isRecording())
8
+ span.setAttributes(observationAttributes(type, attributes));
9
+ }
10
+ export const time = (event, recorded) => recorded || event.timestamp
11
+ ? new Date(recorded ?? event.timestamp)
12
+ : undefined;
13
+ const hash = (seed) => createHash("sha256").update(seed).digest("hex");
14
+ /** Owns the instance-local tracer, span hierarchy and active execution state. */
15
+ export function createTracing(options, spanProcessors) {
16
+ const random = new RandomIdGenerator();
17
+ let nextTraceId;
18
+ const provider = new BasicTracerProvider({
19
+ spanProcessors,
20
+ resource: options.serviceName
21
+ ? resourceFromAttributes({ "service.name": options.serviceName })
22
+ : undefined,
23
+ idGenerator: {
24
+ generateSpanId: () => random.generateSpanId(),
25
+ generateTraceId: () => nextTraceId ?? random.generateTraceId(),
26
+ },
27
+ });
28
+ const tracer = provider.getTracer("@tessar/opentelemetry");
29
+ const executions = new Map();
30
+ const links = new Map();
31
+ const starts = new WeakMap();
32
+ const start = (name, type, event, identity, parent, attributes = {}, startedAt) => {
33
+ const observed = time(event) ?? new Date();
34
+ let startTime = time(event, startedAt) ?? observed;
35
+ const parentStart = parent && starts.get(parent);
36
+ // A resumed logical task can predate this segment. Its new observation
37
+ // starts at this notification, never before its fresh parent root.
38
+ if (parentStart !== undefined && startTime.getTime() < parentStart)
39
+ startTime = new Date(Math.max(parentStart, observed.getTime()));
40
+ const span = tracer.startSpan(name, {
41
+ startTime,
42
+ attributes: observationAttributes(type, {
43
+ ...attributes,
44
+ metadata: {
45
+ ...identity,
46
+ ...attributes.metadata,
47
+ recordStartedAt: startedAt,
48
+ },
49
+ }),
50
+ }, parent ? trace.setSpan(ROOT_CONTEXT, parent) : ROOT_CONTEXT);
51
+ starts.set(span, startTime.getTime());
52
+ if (event.sessionId)
53
+ span.setAttribute("session.id", event.sessionId);
54
+ if (event.threadId)
55
+ span.setAttribute("gen_ai.conversation.id", event.threadId);
56
+ if (event.agentId)
57
+ span.setAttribute("gen_ai.agent.id", event.agentId);
58
+ if (type === "tool")
59
+ span.setAttribute("gen_ai.tool.name", name);
60
+ span.setAttribute("tessar.trace.name", options.traceName ??
61
+ (event.sessionId
62
+ ? `${event.agentId ?? "agent"} / ${event.threadId}`
63
+ : (event.agentId ?? "agent")));
64
+ if (options.tags?.length)
65
+ span.setAttribute("tessar.trace.tags", [...options.tags]);
66
+ return span;
67
+ };
68
+ const end = (span, event, endedAt) => {
69
+ const observed = time(event) ?? new Date();
70
+ const started = starts.get(span) ?? observed.getTime();
71
+ const recorded = time(event, endedAt) ?? observed;
72
+ if (endedAt)
73
+ span.setAttribute("tessar.metadata.recordEndedAt", JSON.stringify(endedAt));
74
+ span.end(new Date(Math.max(started, recorded.getTime() < started
75
+ ? observed.getTime()
76
+ : recorded.getTime())));
77
+ };
78
+ const begin = (event, checkpointId, startedAt) => {
79
+ if (!event.streamId)
80
+ return;
81
+ const existing = executions.get(event.streamId);
82
+ if (existing)
83
+ return existing;
84
+ const identity = Object.fromEntries(Object.entries({
85
+ controllerId: event.controllerId,
86
+ agentId: event.agentId,
87
+ sessionId: event.sessionId,
88
+ threadId: event.threadId,
89
+ streamId: event.streamId,
90
+ checkpointId,
91
+ scope: event.scope,
92
+ }).filter(([, value]) => value !== undefined));
93
+ const link = links.get(event.streamId);
94
+ // Each invocation or continuation segment owns a fresh, recording root.
95
+ nextTraceId = hash(JSON.stringify([
96
+ event.controllerId,
97
+ event.agentId,
98
+ event.threadId,
99
+ event.streamId,
100
+ checkpointId,
101
+ ])).slice(0, 32);
102
+ let root;
103
+ try {
104
+ root = start(event.agentId ?? "agent", "agent", event, identity, undefined, { output: [] }, startedAt);
105
+ }
106
+ finally {
107
+ nextTraceId = undefined;
108
+ }
109
+ const state = {
110
+ root,
111
+ link,
112
+ identity,
113
+ output: [],
114
+ turns: new Map(),
115
+ models: new Map(),
116
+ tools: new Map(),
117
+ calls: new Map(),
118
+ firstOutputs: new Set(),
119
+ };
120
+ executions.set(event.streamId, state);
121
+ return state;
122
+ };
123
+ const current = (event) => event.streamId ? executions.get(event.streamId) : undefined;
124
+ const parentTurn = (state, event, id = state.currentTurn, index) => {
125
+ if (!id)
126
+ return state.root;
127
+ let turn = state.turns.get(id);
128
+ if (!turn) {
129
+ let number = index === undefined ? undefined : index + 1;
130
+ if (state.link?.turnId === id)
131
+ number = state.link.turnCount;
132
+ const span = start(number === undefined ? "turn" : `turn ${number}`, "span", state.currentTurn === id && state.turnStartedAt
133
+ ? { ...event, timestamp: state.turnStartedAt }
134
+ : event, {
135
+ ...state.identity,
136
+ turnId: id,
137
+ ...(index === undefined ? {} : { index }),
138
+ turnNumber: number,
139
+ }, state.root, { output: [] }, state.turnStartedAt);
140
+ turn = { span, output: [] };
141
+ state.turns.set(id, turn);
142
+ }
143
+ return turn.span;
144
+ };
145
+ const failure = (span, type, error) => {
146
+ if (!span.isRecording())
147
+ return;
148
+ span.setStatus({ code: SpanStatusCode.ERROR, message: error.message });
149
+ span.recordException(error.message);
150
+ update(span, type, {
151
+ level: "ERROR",
152
+ statusMessage: error.message,
153
+ metadata: { error },
154
+ });
155
+ };
156
+ const finish = (event, status, error, output, endedAt) => {
157
+ const state = current(event);
158
+ if (!state)
159
+ return;
160
+ for (const [spans, type] of [
161
+ [state.models, "generation"],
162
+ [state.tools, "tool"],
163
+ [[...state.turns.values()].map((turn) => turn.span), "span"],
164
+ ]) {
165
+ for (const span of spans.values()) {
166
+ if (error)
167
+ failure(span, type, error);
168
+ update(span, type, {
169
+ level: error ? "ERROR" : "WARNING",
170
+ metadata: {
171
+ status: status === "completed" ? "interrupted" : status,
172
+ },
173
+ });
174
+ end(span, event);
175
+ }
176
+ }
177
+ if (error)
178
+ failure(state.root, "agent", error);
179
+ update(state.root, "agent", {
180
+ // Stream outcomes include earlier suspended segments; this root owns
181
+ // only the messages published during its current continuation.
182
+ output: state.identity.checkpointId
183
+ ? state.output
184
+ : (output ?? state.output),
185
+ metadata: { status },
186
+ ...(status === "suspended" ||
187
+ status === "cancelled" ||
188
+ status === "interrupted"
189
+ ? { level: "WARNING" }
190
+ : {}),
191
+ });
192
+ end(state.root, event, endedAt);
193
+ executions.delete(event.streamId);
194
+ links.delete(event.streamId);
195
+ };
196
+ return {
197
+ executions,
198
+ links,
199
+ start,
200
+ end,
201
+ begin,
202
+ current,
203
+ parentTurn,
204
+ failure,
205
+ finish,
206
+ shutdown: () => provider.shutdown().catch((error) => {
207
+ diag.error("Tessar trace export shutdown failed", error);
208
+ }),
209
+ };
210
+ }
211
+ //# sourceMappingURL=trace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.js","sourceRoot":"","sources":["../src/trace.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import type { Span } from "@opentelemetry/api";
2
+ import type { SpanExporter } from "@opentelemetry/sdk-trace-base";
3
+ import type { JsonObject, MessageData, ModelUsage } from "@tessar/core";
4
+ export interface TraceAdapter {
5
+ createExporter(): SpanExporter;
6
+ }
7
+ export interface OpenTelemetryOptions {
8
+ adapters: readonly TraceAdapter[];
9
+ /** Export each completed span immediately instead of batching. Defaults to false. */
10
+ realtime?: boolean;
11
+ /** OTel service.name resource attribute. */
12
+ serviceName?: string;
13
+ /** Override the shared trace name; individual tool/model names are unchanged. */
14
+ traceName?: string;
15
+ /** Application-defined tags propagated to every observation. */
16
+ tags?: readonly string[];
17
+ }
18
+ export type ObservationType = "agent" | "span" | "generation" | "tool";
19
+ export interface ObservationAttributes {
20
+ input?: unknown;
21
+ output?: unknown;
22
+ metadata?: Record<string, unknown>;
23
+ model?: string;
24
+ modelParameters?: Record<string, string | number>;
25
+ usage?: ModelUsage;
26
+ completionStartTime?: Date;
27
+ level?: "ERROR" | "WARNING";
28
+ statusMessage?: string;
29
+ }
30
+ interface TurnTrace {
31
+ span: Span;
32
+ output: MessageData[];
33
+ }
34
+ export type ThreadTraceState = {
35
+ turnCount: number;
36
+ turnId: string;
37
+ };
38
+ export interface ExecutionTrace {
39
+ root: Span;
40
+ link?: ThreadTraceState;
41
+ turns: Map<string, TurnTrace>;
42
+ output: MessageData[];
43
+ models: Map<string, Span>;
44
+ tools: Map<string, Span>;
45
+ calls: Map<string, {
46
+ name: string;
47
+ arguments: JsonObject;
48
+ }>;
49
+ firstOutputs: Set<string>;
50
+ currentTurn?: string;
51
+ turnStartedAt?: string;
52
+ identity: Record<string, unknown>;
53
+ }
54
+ export {};
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,52 @@
1
1
  {
2
2
  "name": "@tessar/opentelemetry",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.1.0",
4
+ "license": "Apache-2.0",
5
+ "description": "OpenTelemetry tracing for Tessar with OTLP, Langfuse and Laminar adapters.",
6
+ "keywords": [
7
+ "tessar",
8
+ "ai-agent",
9
+ "opentelemetry",
10
+ "otlp",
11
+ "tracing",
12
+ "llm",
13
+ "langfuse",
14
+ "laminar",
15
+ "typescript"
16
+ ],
17
+ "type": "module",
18
+ "files": [
19
+ "dist"
20
+ ],
21
+ "engines": {
22
+ "node": ">=24.22.1"
23
+ },
24
+ "repository": {
25
+ "type": "git",
26
+ "url": "git+https://github.com/tessar-ai/tessar.git",
27
+ "directory": "packages/opentelemetry"
28
+ },
29
+ "homepage": "https://github.com/tessar-ai/tessar#readme",
30
+ "publishConfig": {
31
+ "access": "public",
32
+ "registry": "https://registry.npmjs.org/"
33
+ },
34
+ "exports": {
35
+ ".": {
36
+ "types": "./dist/index.d.ts",
37
+ "import": "./dist/index.js"
38
+ }
39
+ },
40
+ "dependencies": {
41
+ "@opentelemetry/api": "1.9.0",
42
+ "@opentelemetry/core": "2.12.0",
43
+ "@opentelemetry/sdk-trace-base": "2.12.0",
44
+ "@opentelemetry/exporter-trace-otlp-http": "0.223.0",
45
+ "@opentelemetry/resources": "2.12.0",
46
+ "@tessar/core": "0.1.5"
47
+ },
48
+ "scripts": {
49
+ "build": "tsc -p tsconfig.json",
50
+ "typecheck": "tsc --noEmit -p tsconfig.json"
51
+ }
6
52
  }