Skip to content

feat(logging): tag logs with a per-session ID - #1073

Open
aqandrew wants to merge 7 commits into
mainfrom
aqandrew/devex-661-session-logger
Open

feat(logging): tag logs with a per-session ID#1073
aqandrew wants to merge 7 commits into
mainfrom
aqandrew/devex-661-session-logger

Conversation

@aqandrew

@aqandrew aqandrew commented Aug 11, 2026

Copy link
Copy Markdown

What

Introduce a per-session identifier and make the extension tag every log line
with it, so all logs for a session can be correlated by searching a single ID.

This is Phase 1 of 3 for
DEVEX-661 — "VS Code: add
session_id to all requests, logs, existing telemetry, and CLI invocations".

Changes

  • Add SessionLogger (src/logging/sessionLogger.ts) — a Logger that wraps
    the Coder output channel and prefixes every message with [<sessionId>].
  • Generate the session ID once in ServiceContainer (reusing the existing
    newSessionId() that already backs the telemetry session, so logs, telemetry,
    requests, and the CLI all share one ID), and expose it via getSessionId()
    for the later phases.

Because every service already receives Logger by injection, session-tagged
logging propagates with no call-site changes.

Design notes

The code owner (Ehab) suggested composing the session ID and the VS Code logger
inside container.ts's ServiceContainer; this PR follows that approach. The
telemetry sessionId from newSessionId() is the RFC session_id (confirmed
with Ehab — reuse it rather than minting a second ID).

Testing

  • pnpm typecheck, targeted pnpm lint, and pnpm test:extension (full suite:
    2108 passing).
  • New unit tests for SessionLogger prefixing and argument forwarding.
Implementation plan (DEVEX-661)

Thread a single per-session identifier (16-byte / 32-char lowercase hex) so that
logs, API requests, existing telemetry, and the CLI ssh invocation the
extension drives can all be correlated by one session_id.

In-scope RFC requirements

Req Summary Where
1 Generate 16-byte / 32-hex session ID Reuse existing newSessionId()
2 Session ID on every client log Phase 1 (this PR)
3 session_id on every API request via baggage Phase 2
4.2 session_id on VS Code telemetry Phase 2 (already covered by reusing the ID)
5.2/5.3 CODER_TRACE_SESSION_ID via process.env + terminal env collection Phase 2
7 Log workspace/agent/lifecycle state changes at info Phase 3
16 Default --log-dir + old-log cleanup Already implemented — verify only

Out of scope: coderd tracing middleware (req 6), agent/coordination-protocol
changes and the CLI ssh subcommand behavior (reqs 8–15) live in coder/coder.
Req 13 (in-memory log buffer flushed on connection failure) is deferred to a
follow-up.

Key decisions

  • D1 (resolved): the telemetry sessionId is the RFC session_id — one ID,
    generated once in ServiceContainer.
  • D2: session scope is per activation; Remote-SSH opens each workspace in a fresh
    activation, so container-scoped ≈ per-connection.
  • D3 (resolved): prefix every log line with the full 32-hex ID as
    [<sessionId>] <message>.
  • D4: baggage: session_id=<hex> header.

Phases

  1. Session ID + SessionLogger composition in the container (this PR).
  2. Thread the ID to API requests (baggage), telemetry (already covered), and the
    CLI via CODER_TRACE_SESSION_ID on process.env + the terminal env
    collection.
  3. Log workspace / agent / lifecycle state transitions at info.

🤖 Generated by Coder Agents.

Add SessionLogger, which wraps the Coder output channel and prefixes
every message with the activation's session ID so all log lines for a
session can be correlated by a single ID. Generate the ID once in the
ServiceContainer, reuse it as the telemetry session ID, and expose it
via getSessionId() for downstream consumers.
@linear-code

linear-code Bot commented Aug 11, 2026

Copy link
Copy Markdown

DEVEX-661

@aqandrew
aqandrew force-pushed the aqandrew/devex-661-session-logger branch from 615ea3b to 445ab75 Compare August 12, 2026 22:00
Comment thread src/core/container.ts Outdated
Comment thread src/logging/sessionLogger.ts Outdated
Comment thread src/logging/sessionLogger.ts Outdated
Comment on lines +15 to +17
private prefix(message: string): string {
return `[${this.sessionId}] ${message}`;
}

@EhabY EhabY Aug 13, 2026

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we use shortId for the session ID? This is very verbose now and conflict is extremely unlikely to happen

Image

Also I'm not sure if this is clear that the first number is the session ID while the second number is the request ID

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah we definitely should use shortId. What do you think of wrapping both the session id and request id in square brackets, and labeling them? So the top line would become

2026-08-13 14:53:01.305 [trace] [session ece5f89f] ← [request 38b0a2b4] 200 GET /api/v2/workspaces?q=owner%3Ame (158 kB) 1.35s

@aqandrew
aqandrew force-pushed the aqandrew/devex-661-session-logger branch from 445ab75 to 615ea3b Compare August 13, 2026 18:46
Replace the SessionLogger class with a prefixLogger(inner, prefix) factory
that wraps a Logger and prefixes every message, and rename the module to
prefixLogger.ts. The prefix is now generic (a session ID, a workspace name,
etc.); the caller passes the bracketed session prefix. Addresses review
feedback on #1073.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants