diff options
| author | Kit Langton <[email protected]> | 2026-04-17 21:14:23 -0400 |
|---|---|---|
| committer | GitHub <[email protected]> | 2026-04-17 21:14:23 -0400 |
| commit | 23a2d0128254480e51c630f8cd077af29dc39efa (patch) | |
| tree | 06980ea4110b088122e72bed1d8ff80209db9d5f /packages | |
| parent | 5181f9b4e141fc6c0c3c3d26169721af9e63ca51 (diff) | |
| download | opencode-23a2d0128254480e51c630f8cd077af29dc39efa.tar.gz opencode-23a2d0128254480e51c630f8cd077af29dc39efa.zip | |
fix(observability): standardize session telemetry attrs (#23213)
Diffstat (limited to 'packages')
| -rw-r--r-- | packages/opencode/src/effect/logger.ts | 8 | ||||
| -rw-r--r-- | packages/opencode/src/session/llm.ts | 16 | ||||
| -rw-r--r-- | packages/opencode/src/session/processor.ts | 2 |
3 files changed, 22 insertions, 4 deletions
diff --git a/packages/opencode/src/effect/logger.ts b/packages/opencode/src/effect/logger.ts index 21e0fc43a..0e58b8acb 100644 --- a/packages/opencode/src/effect/logger.ts +++ b/packages/opencode/src/effect/logger.ts @@ -3,6 +3,8 @@ import { Log } from "@/util" type Fields = Record<string, unknown> +const normalizeKey = (key: string) => (key === "sessionID" ? "session.id" : key) + export interface Handle { readonly debug: (msg?: unknown, extra?: Fields) => Effect.Effect<void> readonly info: (msg?: unknown, extra?: Fields) => Effect.Effect<void> @@ -12,7 +14,11 @@ export interface Handle { } const clean = (input?: Fields): Fields => - Object.fromEntries(Object.entries(input ?? {}).filter((entry) => entry[1] !== undefined && entry[1] !== null)) + Object.fromEntries( + Object.entries(input ?? {}) + .filter((entry) => entry[1] !== undefined && entry[1] !== null) + .map(([key, value]) => [normalizeKey(key), value]), + ) const text = (input: unknown): string => { // oxlint-disable-next-line no-base-to-string diff --git a/packages/opencode/src/session/llm.ts b/packages/opencode/src/session/llm.ts index b66e99fc8..b72f873de 100644 --- a/packages/opencode/src/session/llm.ts +++ b/packages/opencode/src/session/llm.ts @@ -74,7 +74,7 @@ const live: Layer.Layer< .clone() .tag("providerID", input.model.providerID) .tag("modelID", input.model.id) - .tag("sessionID", input.sessionID) + .tag("session.id", input.sessionID) .tag("small", (input.small ?? false).toString()) .tag("agent", input.agent.name) .tag("mode", input.agent.mode) @@ -317,6 +317,18 @@ const live: Layer.Layer< const tracer = cfg.experimental?.openTelemetry ? Option.getOrUndefined(yield* Effect.serviceOption(OtelTracer.OtelTracer)) : undefined + const telemetryTracer = tracer + ? new Proxy(tracer, { + get(target, prop, receiver) { + if (prop !== "startSpan") return Reflect.get(target, prop, receiver) + return (...args: Parameters<typeof target.startSpan>) => { + const span = target.startSpan(...args) + span.setAttribute("session.id", input.sessionID) + return span + } + }, + }) + : undefined return streamText({ onError(error) { @@ -390,7 +402,7 @@ const live: Layer.Layer< experimental_telemetry: { isEnabled: cfg.experimental?.openTelemetry, functionId: "session.llm", - tracer, + tracer: telemetryTracer, metadata: { userId: cfg.username ?? "unknown", sessionId: input.sessionID, diff --git a/packages/opencode/src/session/processor.ts b/packages/opencode/src/session/processor.ts index 9ab74ca34..21f9329c6 100644 --- a/packages/opencode/src/session/processor.ts +++ b/packages/opencode/src/session/processor.ts @@ -123,7 +123,7 @@ export const layer: Layer.Layer< reasoningMap: {}, } let aborted = false - const slog = log.clone().tag("sessionID", input.sessionID).tag("messageID", input.assistantMessage.id) + const slog = log.clone().tag("session.id", input.sessionID).tag("messageID", input.assistantMessage.id) const parse = (e: unknown) => MessageV2.fromError(e, { |
