@vymalo/opencode-otel 0.12.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.
@@ -0,0 +1,546 @@
1
+ import { ROOT_CONTEXT, SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
2
+ import { SeverityNumber } from "@opentelemetry/api-logs";
3
+ import { createInstruments, detectLanguage } from "./instruments.js";
4
+ /**
5
+ * Translates the OpenCode event stream and hook callbacks into OTel signals.
6
+ *
7
+ * Deliberately holds no content: lengths, counts, durations and outcomes only.
8
+ * See `plans/otel.md` → "No content capture in v1".
9
+ */
10
+ export class TelemetryRecorder {
11
+ deps;
12
+ instruments;
13
+ now;
14
+ sessions = new Map();
15
+ chats = new Map();
16
+ tools = new Map();
17
+ /** Terminal tool outcomes already recorded, so the hook and the part update cannot double-count. */
18
+ finishedTools = new Set();
19
+ /** Assistant messages already finalized — `message.updated` fires repeatedly with cumulative totals. */
20
+ finalizedMessages = new Set();
21
+ /** Pending permission prompts, so `permission.replied` can name the tool it resolved. */
22
+ permissions = new Map();
23
+ /**
24
+ * Last-seen cumulative diff per `sessionID\0file`. `session.diff` reports the
25
+ * session's whole diff each time, so only the delta may be counted.
26
+ */
27
+ diffs = new Map();
28
+ constructor(deps) {
29
+ this.deps = deps;
30
+ this.now = deps.now ?? Date.now;
31
+ this.instruments = deps.providers.meter ? createInstruments(deps.providers.meter) : undefined;
32
+ }
33
+ // ---------------------------------------------------------------- helpers
34
+ /**
35
+ * Session id as a *metric* attribute — omitted unless `includeSessionId`,
36
+ * because it is unbounded cardinality and metric backends bill per series.
37
+ * Logs and spans always carry it.
38
+ */
39
+ metricSession(sessionID) {
40
+ return this.deps.config.includeSessionId ? { "gen_ai.conversation.id": sessionID } : {};
41
+ }
42
+ emit(name, attributes, severity = SeverityNumber.INFO, context) {
43
+ this.deps.providers.otelLogger?.emit({
44
+ timestamp: this.now(),
45
+ severityNumber: severity,
46
+ severityText: severity >= SeverityNumber.ERROR ? "ERROR" : "INFO",
47
+ body: name,
48
+ attributes: { "event.name": name, ...attributes },
49
+ context
50
+ });
51
+ }
52
+ session(sessionID) {
53
+ let state = this.sessions.get(sessionID);
54
+ if (!state) {
55
+ // A session we never saw created (the plugin loaded mid-session, or the
56
+ // host replayed history) still gets a state so its metrics are not lost.
57
+ state = {
58
+ context: ROOT_CONTEXT,
59
+ startedAt: this.now(),
60
+ requests: 0,
61
+ cost: 0,
62
+ inputTokens: 0,
63
+ outputTokens: 0
64
+ };
65
+ this.sessions.set(sessionID, state);
66
+ }
67
+ return state;
68
+ }
69
+ // ----------------------------------------------------------------- events
70
+ onEvent(event) {
71
+ try {
72
+ this.dispatch(event);
73
+ }
74
+ catch (error) {
75
+ // Telemetry must never break the host. Swallow, but say so.
76
+ this.deps.logger.warn("otel_event_failed", {
77
+ type: event?.type,
78
+ error: error instanceof Error ? error.message : String(error)
79
+ });
80
+ }
81
+ }
82
+ dispatch(event) {
83
+ switch (event.type) {
84
+ case "session.created":
85
+ this.onSessionCreated(event.properties.info);
86
+ return;
87
+ case "session.idle":
88
+ this.onSessionIdle(event.properties.sessionID);
89
+ return;
90
+ case "session.status":
91
+ this.onSessionStatus(event.properties.sessionID, event.properties.status);
92
+ return;
93
+ case "session.compacted":
94
+ this.onCompacted(event.properties.sessionID);
95
+ return;
96
+ case "session.error":
97
+ this.onSessionError(event.properties.sessionID, event.properties.error);
98
+ return;
99
+ case "session.diff":
100
+ this.onSessionDiff(event.properties.sessionID, event.properties.diff);
101
+ return;
102
+ case "message.updated":
103
+ this.onMessageUpdated(event.properties.info);
104
+ return;
105
+ case "message.part.updated":
106
+ this.onPartUpdated(event.properties.part);
107
+ return;
108
+ case "permission.updated":
109
+ this.permissions.set(event.properties.id, {
110
+ type: event.properties.type,
111
+ sessionID: event.properties.sessionID
112
+ });
113
+ return;
114
+ case "permission.replied":
115
+ this.onPermissionReplied(event.properties.sessionID, event.properties.permissionID, event.properties.response);
116
+ return;
117
+ case "command.executed":
118
+ this.onCommandExecuted(event.properties.sessionID, event.properties.name);
119
+ return;
120
+ default:
121
+ return;
122
+ }
123
+ }
124
+ onSessionCreated(info) {
125
+ const kind = info.parentID ? "child" : "root";
126
+ const startedAt = this.now();
127
+ const span = this.deps.providers.tracer?.startSpan("invoke_agent opencode", {
128
+ kind: SpanKind.INTERNAL,
129
+ startTime: startedAt,
130
+ attributes: {
131
+ "gen_ai.operation.name": "invoke_agent",
132
+ "gen_ai.agent.name": "opencode",
133
+ "gen_ai.conversation.id": info.id,
134
+ "opencode.session.kind": kind
135
+ }
136
+ }, ROOT_CONTEXT);
137
+ const context = span ? trace.setSpan(ROOT_CONTEXT, span) : ROOT_CONTEXT;
138
+ this.sessions.set(info.id, {
139
+ span,
140
+ context,
141
+ startedAt,
142
+ requests: 0,
143
+ cost: 0,
144
+ inputTokens: 0,
145
+ outputTokens: 0
146
+ });
147
+ this.instruments?.sessions.add(1, {
148
+ "opencode.session.kind": kind,
149
+ ...this.metricSession(info.id)
150
+ });
151
+ this.emit("opencode.session_start", {
152
+ "gen_ai.conversation.id": info.id,
153
+ "opencode.session.kind": kind,
154
+ ...(info.parentID ? { "opencode.session.parent_id": info.parentID } : {}),
155
+ ...(info.directory ? { "opencode.directory": info.directory } : {})
156
+ }, SeverityNumber.INFO, context);
157
+ }
158
+ onSessionStatus(sessionID, status) {
159
+ const state = this.session(sessionID);
160
+ if (status.type === "busy") {
161
+ state.busySince ??= this.now();
162
+ return;
163
+ }
164
+ if (status.type === "retry") {
165
+ this.emit("opencode.api_error", {
166
+ "gen_ai.conversation.id": sessionID,
167
+ "error.type": "retry",
168
+ "opencode.error.retryable": true,
169
+ ...(typeof status.attempt === "number"
170
+ ? { "opencode.retry.attempt": status.attempt }
171
+ : {})
172
+ }, SeverityNumber.WARN, state.context);
173
+ return;
174
+ }
175
+ this.settleActiveTime(sessionID, state);
176
+ }
177
+ settleActiveTime(sessionID, state) {
178
+ if (state.busySince === undefined) {
179
+ return;
180
+ }
181
+ const seconds = Math.max(0, (this.now() - state.busySince) / 1000);
182
+ state.busySince = undefined;
183
+ this.instruments?.activeTime.add(seconds, this.metricSession(sessionID));
184
+ }
185
+ onSessionIdle(sessionID) {
186
+ const state = this.sessions.get(sessionID);
187
+ if (!state) {
188
+ return;
189
+ }
190
+ this.settleActiveTime(sessionID, state);
191
+ this.emit("opencode.session_idle", {
192
+ "gen_ai.conversation.id": sessionID,
193
+ "opencode.session.duration_ms": this.now() - state.startedAt,
194
+ "opencode.session.request_count": state.requests,
195
+ "opencode.cost.usage": state.cost,
196
+ "gen_ai.usage.input_tokens": state.inputTokens,
197
+ "gen_ai.usage.output_tokens": state.outputTokens
198
+ }, SeverityNumber.INFO, state.context);
199
+ if (state.span) {
200
+ state.span.setAttribute("opencode.session.request_count", state.requests);
201
+ state.span.setAttribute("opencode.cost.usage", state.cost);
202
+ state.span.end();
203
+ }
204
+ this.sessions.delete(sessionID);
205
+ // A short CLI invocation may exit right after idle, so drain now rather
206
+ // than waiting for the batch interval.
207
+ void this.deps.providers.forceFlush().catch(() => {
208
+ /* best-effort */
209
+ });
210
+ }
211
+ onCompacted(sessionID) {
212
+ const state = this.session(sessionID);
213
+ this.instruments?.compactions.add(1, this.metricSession(sessionID));
214
+ this.deps.providers.tracer
215
+ ?.startSpan("session_compaction", { startTime: this.now() }, state.context)
216
+ .end();
217
+ this.emit("opencode.compaction", { "gen_ai.conversation.id": sessionID }, SeverityNumber.INFO, state.context);
218
+ }
219
+ onSessionError(sessionID, error) {
220
+ const named = error;
221
+ const state = sessionID ? this.session(sessionID) : undefined;
222
+ this.emit("opencode.api_error", {
223
+ ...(sessionID ? { "gen_ai.conversation.id": sessionID } : {}),
224
+ "error.type": named?.name ?? "UnknownError",
225
+ ...(typeof named?.data?.statusCode === "number"
226
+ ? { "http.response.status_code": named.data.statusCode }
227
+ : {}),
228
+ ...(typeof named?.data?.isRetryable === "boolean"
229
+ ? { "opencode.error.retryable": named.data.isRetryable }
230
+ : {})
231
+ }, SeverityNumber.ERROR, state?.context);
232
+ }
233
+ onSessionDiff(sessionID, diff) {
234
+ const state = this.session(sessionID);
235
+ for (const entry of diff) {
236
+ const key = `${sessionID}${entry.file}`;
237
+ const previous = this.diffs.get(key) ?? { additions: 0, deletions: 0 };
238
+ // Cumulative source → count only what is new since the last report.
239
+ const added = Math.max(0, (entry.additions ?? 0) - previous.additions);
240
+ const removed = Math.max(0, (entry.deletions ?? 0) - previous.deletions);
241
+ this.diffs.set(key, {
242
+ additions: entry.additions ?? 0,
243
+ deletions: entry.deletions ?? 0
244
+ });
245
+ if (added === 0 && removed === 0) {
246
+ continue;
247
+ }
248
+ const language = detectLanguage(entry.file);
249
+ const languageAttr = language ? { "code.language": language } : {};
250
+ if (added > 0) {
251
+ this.instruments?.linesOfCode.add(added, {
252
+ "opencode.change.type": "added",
253
+ ...languageAttr,
254
+ ...this.metricSession(sessionID)
255
+ });
256
+ }
257
+ if (removed > 0) {
258
+ this.instruments?.linesOfCode.add(removed, {
259
+ "opencode.change.type": "removed",
260
+ ...languageAttr,
261
+ ...this.metricSession(sessionID)
262
+ });
263
+ }
264
+ this.emit("opencode.file_edited", {
265
+ "gen_ai.conversation.id": sessionID,
266
+ ...languageAttr,
267
+ "opencode.file.additions": added,
268
+ "opencode.file.deletions": removed
269
+ }, SeverityNumber.INFO, state.context);
270
+ }
271
+ }
272
+ onMessageUpdated(info) {
273
+ const message = info;
274
+ if (message.role !== "assistant" || this.finalizedMessages.has(message.id)) {
275
+ return;
276
+ }
277
+ const session = this.session(message.sessionID);
278
+ const baseAttributes = {
279
+ "gen_ai.operation.name": "chat",
280
+ "gen_ai.conversation.id": message.sessionID,
281
+ ...(message.modelID ? { "gen_ai.request.model": message.modelID } : {}),
282
+ ...(message.providerID ? { "gen_ai.provider.name": message.providerID } : {}),
283
+ ...(message.mode ? { "gen_ai.agent.name": message.mode } : {})
284
+ };
285
+ let chat = this.chats.get(message.id);
286
+ if (!chat) {
287
+ chat = {
288
+ sessionID: message.sessionID,
289
+ span: this.deps.providers.tracer?.startSpan(`chat ${message.modelID ?? "unknown"}`, {
290
+ kind: SpanKind.CLIENT,
291
+ startTime: message.time?.created ?? this.now(),
292
+ attributes: baseAttributes
293
+ }, session.context)
294
+ };
295
+ this.chats.set(message.id, chat);
296
+ }
297
+ if (message.time?.completed === undefined) {
298
+ return;
299
+ }
300
+ this.finalizeMessage(message, chat, session, baseAttributes);
301
+ }
302
+ finalizeMessage(message, chat, session, baseAttributes) {
303
+ this.finalizedMessages.add(message.id);
304
+ this.chats.delete(message.id);
305
+ const created = message.time?.created ?? this.now();
306
+ const completed = message.time?.completed ?? this.now();
307
+ const durationSeconds = Math.max(0, (completed - created) / 1000);
308
+ const errorType = message.error?.name;
309
+ const metricAttributes = {
310
+ "gen_ai.operation.name": "chat",
311
+ ...(message.modelID ? { "gen_ai.request.model": message.modelID } : {}),
312
+ ...(message.providerID ? { "gen_ai.provider.name": message.providerID } : {}),
313
+ ...(message.mode ? { "gen_ai.agent.name": message.mode } : {}),
314
+ ...this.metricSession(message.sessionID)
315
+ };
316
+ // Real USD, straight from the host — no price table to drift out of date.
317
+ const cost = typeof message.cost === "number" ? message.cost : 0;
318
+ if (cost > 0) {
319
+ this.instruments?.cost.add(cost, metricAttributes);
320
+ }
321
+ const tokens = message.tokens;
322
+ if (tokens) {
323
+ const byType = [
324
+ ["input", tokens.input],
325
+ ["output", tokens.output],
326
+ ["reasoning", tokens.reasoning],
327
+ ["cache_read", tokens.cache?.read ?? 0],
328
+ ["cache_write", tokens.cache?.write ?? 0]
329
+ ];
330
+ for (const [type, value] of byType) {
331
+ // Cache and reasoning tokens are recorded as first-class types: on a
332
+ // cached agentic session cache-read is routinely the majority of
333
+ // tokens, so summing input+output alone measures the wrong thing.
334
+ if (typeof value === "number" && value > 0) {
335
+ this.instruments?.tokens.record(value, {
336
+ ...metricAttributes,
337
+ "gen_ai.token.type": type
338
+ });
339
+ }
340
+ }
341
+ }
342
+ this.instruments?.requests.add(1, metricAttributes);
343
+ this.instruments?.duration.record(durationSeconds, {
344
+ ...metricAttributes,
345
+ ...(errorType ? { "error.type": errorType } : {})
346
+ });
347
+ session.requests += 1;
348
+ session.cost += cost;
349
+ session.inputTokens += tokens?.input ?? 0;
350
+ session.outputTokens += tokens?.output ?? 0;
351
+ const usageAttributes = {
352
+ ...baseAttributes,
353
+ "gen_ai.usage.input_tokens": tokens?.input ?? 0,
354
+ "gen_ai.usage.output_tokens": tokens?.output ?? 0,
355
+ "gen_ai.usage.reasoning_tokens": tokens?.reasoning ?? 0,
356
+ "gen_ai.usage.cache_read_tokens": tokens?.cache?.read ?? 0,
357
+ "gen_ai.usage.cache_write_tokens": tokens?.cache?.write ?? 0,
358
+ "opencode.cost.usage": cost,
359
+ "opencode.response.duration_ms": completed - created,
360
+ ...(message.finish ? { "gen_ai.response.finish_reasons": [message.finish] } : {}),
361
+ ...(errorType ? { "error.type": errorType } : {})
362
+ };
363
+ if (chat.span) {
364
+ chat.span.setAttributes(usageAttributes);
365
+ if (errorType) {
366
+ chat.span.setStatus({ code: SpanStatusCode.ERROR, message: errorType });
367
+ }
368
+ chat.span.end(completed);
369
+ }
370
+ this.emit("opencode.assistant_response", usageAttributes, errorType ? SeverityNumber.ERROR : SeverityNumber.INFO, session.context);
371
+ if (message.error) {
372
+ this.onSessionError(message.sessionID, message.error);
373
+ }
374
+ }
375
+ onPartUpdated(part) {
376
+ const typed = part;
377
+ if (typed.type !== "tool" || !typed.callID || !typed.state) {
378
+ return;
379
+ }
380
+ const status = typed.state.status;
381
+ if (status !== "completed" && status !== "error") {
382
+ return;
383
+ }
384
+ const time = typed.state.time;
385
+ const durationMs = time?.end !== undefined && time?.start !== undefined
386
+ ? Math.max(0, time.end - time.start)
387
+ : undefined;
388
+ this.finishTool(typed.callID, {
389
+ tool: typed.tool ?? "unknown",
390
+ sessionID: typed.sessionID ?? "",
391
+ status: status === "error" ? "error" : "ok",
392
+ durationMs
393
+ });
394
+ }
395
+ onPermissionReplied(sessionID, permissionID, response) {
396
+ const pending = this.permissions.get(permissionID);
397
+ this.permissions.delete(permissionID);
398
+ const state = this.session(sessionID);
399
+ const toolAttr = pending?.type ? { "gen_ai.tool.name": pending.type } : {};
400
+ this.instruments?.permissionDecisions.add(1, {
401
+ "opencode.permission.decision": response,
402
+ ...toolAttr,
403
+ ...this.metricSession(sessionID)
404
+ });
405
+ this.emit("opencode.tool_decision", {
406
+ "gen_ai.conversation.id": sessionID,
407
+ "opencode.permission.decision": response,
408
+ "opencode.permission.id": permissionID,
409
+ ...toolAttr
410
+ }, SeverityNumber.INFO, state.context);
411
+ }
412
+ onCommandExecuted(sessionID, name) {
413
+ const state = this.session(sessionID);
414
+ this.instruments?.commands.add(1, {
415
+ "opencode.command.name": name,
416
+ ...this.metricSession(sessionID)
417
+ });
418
+ this.emit("opencode.command_executed", { "gen_ai.conversation.id": sessionID, "opencode.command.name": name }, SeverityNumber.INFO, state.context);
419
+ }
420
+ // ------------------------------------------------------------------ hooks
421
+ onChatMessage(input, output) {
422
+ const session = this.session(input.sessionID);
423
+ const parts = output?.parts ?? [];
424
+ // Length, not content — see the no-content-capture decision.
425
+ let promptLength = 0;
426
+ const partTypes = {};
427
+ for (const part of parts) {
428
+ const typed = part;
429
+ const type = typed.type ?? "unknown";
430
+ partTypes[type] = (partTypes[type] ?? 0) + 1;
431
+ if (typeof typed.text === "string") {
432
+ promptLength += typed.text.length;
433
+ }
434
+ }
435
+ this.emit("opencode.user_prompt", {
436
+ "gen_ai.conversation.id": input.sessionID,
437
+ "opencode.prompt.length": promptLength,
438
+ "opencode.prompt.part_count": parts.length,
439
+ ...Object.fromEntries(Object.entries(partTypes).map(([type, count]) => [`opencode.prompt.parts.${type}`, count])),
440
+ ...(input.agent ? { "gen_ai.agent.name": input.agent } : {}),
441
+ ...(input.model?.modelID ? { "gen_ai.request.model": input.model.modelID } : {}),
442
+ ...(input.model?.providerID ? { "gen_ai.provider.name": input.model.providerID } : {})
443
+ }, SeverityNumber.INFO, session.context);
444
+ }
445
+ onToolBefore(input) {
446
+ const session = this.session(input.sessionID);
447
+ const filtered = this.deps.config.filteredTools.has(input.tool);
448
+ this.tools.set(input.callID, {
449
+ tool: input.tool,
450
+ sessionID: input.sessionID,
451
+ startedAt: this.now(),
452
+ // Filtered tools still produce metrics; they just skip the span, which is
453
+ // what keeps a `read`-heavy session's trace readable.
454
+ span: filtered
455
+ ? undefined
456
+ : this.deps.providers.tracer?.startSpan(`execute_tool ${input.tool}`, {
457
+ kind: SpanKind.INTERNAL,
458
+ startTime: this.now(),
459
+ attributes: {
460
+ "gen_ai.operation.name": "execute_tool",
461
+ "gen_ai.tool.name": input.tool,
462
+ "gen_ai.tool.call.id": input.callID,
463
+ "gen_ai.conversation.id": input.sessionID
464
+ }
465
+ }, session.context)
466
+ });
467
+ }
468
+ onToolAfter(input, output) {
469
+ this.finishTool(input.callID, {
470
+ tool: input.tool,
471
+ sessionID: input.sessionID,
472
+ status: "ok",
473
+ outputSize: typeof output?.output === "string" ? output.output.length : undefined
474
+ });
475
+ }
476
+ /**
477
+ * Record a tool's terminal outcome exactly once. Both `tool.execute.after`
478
+ * and the tool part reaching a terminal state report it, and which arrives
479
+ * depends on whether the tool succeeded — first writer wins, so a failing
480
+ * tool (no `after` hook) is still counted.
481
+ */
482
+ finishTool(callID, outcome) {
483
+ if (this.finishedTools.has(callID)) {
484
+ return;
485
+ }
486
+ this.finishedTools.add(callID);
487
+ const started = this.tools.get(callID);
488
+ this.tools.delete(callID);
489
+ const tool = started?.tool ?? outcome.tool;
490
+ const sessionID = started?.sessionID || outcome.sessionID;
491
+ const durationMs = outcome.durationMs ?? (started ? Math.max(0, this.now() - started.startedAt) : undefined);
492
+ this.instruments?.toolInvocations.add(1, {
493
+ "gen_ai.tool.name": tool,
494
+ "opencode.tool.status": outcome.status,
495
+ ...this.metricSession(sessionID)
496
+ });
497
+ const attributes = {
498
+ "gen_ai.tool.name": tool,
499
+ "gen_ai.tool.call.id": callID,
500
+ "opencode.tool.status": outcome.status,
501
+ ...(sessionID ? { "gen_ai.conversation.id": sessionID } : {}),
502
+ ...(durationMs !== undefined ? { "opencode.tool.duration_ms": durationMs } : {}),
503
+ ...(outcome.outputSize !== undefined
504
+ ? { "opencode.tool.output.size": outcome.outputSize }
505
+ : {})
506
+ };
507
+ if (started?.span) {
508
+ started.span.setAttributes(attributes);
509
+ if (outcome.status === "error") {
510
+ started.span.setStatus({ code: SpanStatusCode.ERROR });
511
+ }
512
+ started.span.end();
513
+ }
514
+ this.emit("opencode.tool_result", attributes, outcome.status === "error" ? SeverityNumber.ERROR : SeverityNumber.INFO, sessionID ? this.session(sessionID).context : undefined);
515
+ }
516
+ // -------------------------------------------------------------- lifecycle
517
+ /**
518
+ * The context of the single in-flight chat, or `undefined` when zero or more
519
+ * than one is running. Ambiguity yields no trace context rather than a wrong
520
+ * parent — a missing link is recoverable, a fabricated one is not.
521
+ */
522
+ currentChatContext() {
523
+ if (this.chats.size !== 1) {
524
+ return undefined;
525
+ }
526
+ const [chat] = this.chats.values();
527
+ return chat?.span ? trace.setSpan(ROOT_CONTEXT, chat.span) : undefined;
528
+ }
529
+ async shutdown() {
530
+ for (const [sessionID, state] of this.sessions) {
531
+ this.settleActiveTime(sessionID, state);
532
+ state.span?.end();
533
+ }
534
+ this.sessions.clear();
535
+ for (const chat of this.chats.values()) {
536
+ chat.span?.end();
537
+ }
538
+ this.chats.clear();
539
+ for (const tool of this.tools.values()) {
540
+ tool.span?.end();
541
+ }
542
+ this.tools.clear();
543
+ await this.deps.providers.shutdown();
544
+ }
545
+ }
546
+ //# sourceMappingURL=recorder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recorder.js","sourceRoot":"","sources":["../src/recorder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ export type LogLevel = "trace" | "debug" | "info" | "warn" | "error";
2
+ /**
3
+ * Where a signal is sent. `otlp` is OTLP/HTTP-protobuf (the only wire transport
4
+ * this plugin ships — see ADR-0009 for why gRPC is absent); `console` prints to
5
+ * stdout for local debugging; `none` records nothing.
6
+ */
7
+ export type ExporterKind = "otlp" | "console" | "none";
8
+ /** The three OTel signals, independently toggleable. */
9
+ export type SignalName = "traces" | "metrics" | "logs";
10
+ /**
11
+ * Plugin options as written in `opencode.json` (or served through
12
+ * `.well-known/opencode`). Every field is optional and every field has a
13
+ * standard `OTEL_*` environment counterpart that **overrides** it — see
14
+ * `resolveOtelConfig`.
15
+ */
16
+ export interface OtelPluginOptions {
17
+ /** Master switch. `false` returns inert hooks without initializing anything. */
18
+ enabled?: boolean;
19
+ /** OTLP/HTTP base URL, e.g. `http://localhost:4318`. Signal paths are appended. */
20
+ endpoint?: string;
21
+ /** Per-signal endpoint overrides. A full URL including the signal path. */
22
+ endpoints?: Partial<Record<SignalName, string>>;
23
+ /** Headers sent with every OTLP request (auth tokens live here). */
24
+ headers?: Record<string, string>;
25
+ /** Which signals to export. Omitted signals default to `otlp` when an endpoint is set. */
26
+ exporters?: Partial<Record<SignalName, ExporterKind>>;
27
+ /** `service.name` resource attribute. Defaults to `opencode`. */
28
+ serviceName?: string;
29
+ /** Deployment tag, mirroring Codex's `[otel] environment`. Sets `deployment.environment.name`. */
30
+ environment?: string;
31
+ /** Extra resource attributes merged onto the defaults. */
32
+ resourceAttributes?: Record<string, string>;
33
+ /** Metric export interval, ms. Default 60000. */
34
+ metricExportIntervalMs?: number;
35
+ /** Log record export interval, ms. Default 5000. */
36
+ logExportIntervalMs?: number;
37
+ /** Span export interval, ms. Default 5000. */
38
+ traceExportIntervalMs?: number;
39
+ /** `delta` (default) or `cumulative` metric temporality. */
40
+ metricTemporality?: MetricTemporality;
41
+ /**
42
+ * Attach `gen_ai.conversation.id` to **metrics** as well as logs/spans.
43
+ * Off by default: session id is unbounded cardinality and most metric
44
+ * backends bill per series. Logs and spans always carry it.
45
+ */
46
+ includeSessionId?: boolean;
47
+ /** Tool names excluded from span generation. They are still counted in metrics. */
48
+ filteredTools?: string[];
49
+ /**
50
+ * Inject W3C `traceparent` into provider HTTP requests by wrapping
51
+ * `provider.options.fetch`, so gateway-side spans join the session trace.
52
+ * On by default when traces are enabled.
53
+ */
54
+ propagateTraceContext?: boolean;
55
+ }
56
+ export type MetricTemporality = "delta" | "cumulative";
57
+ /** Fully resolved configuration — defaults applied, env overrides folded in. */
58
+ export interface ResolvedOtelConfig {
59
+ enabled: boolean;
60
+ /** True when at least one signal has a live (non-`none`) exporter. */
61
+ active: boolean;
62
+ endpoint?: string;
63
+ endpoints: Partial<Record<SignalName, string>>;
64
+ headers: Record<string, string>;
65
+ exporters: Record<SignalName, ExporterKind>;
66
+ serviceName: string;
67
+ environment?: string;
68
+ resourceAttributes: Record<string, string>;
69
+ metricExportIntervalMs: number;
70
+ logExportIntervalMs: number;
71
+ traceExportIntervalMs: number;
72
+ metricTemporality: MetricTemporality;
73
+ includeSessionId: boolean;
74
+ filteredTools: Set<string>;
75
+ propagateTraceContext: boolean;
76
+ }
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":""}