[Windows] Cowork OpenTelemetry exporter does not initialize - zero events emitted to any destination, including loopback

Status Closed — not planned
Maintainer reply None cached
Activity 5 comments · opened May 28, 2026 · closed Aug 26, 2026

Summary

On Windows 11 Enterprise with Claude Desktop 1.9255.2, configuring Cowork OpenTelemetry monitoring in the admin console (per the official docs) results in zero OTLP events being emitted by Cowork sessions, regardless of destination form (hostname, IP, loopback), regardless of network egress allowlist contents, and regardless of any other admin-side setting. Host-side log analysis indicates the OTel exporter code path is not being executed at all inside the Cowork VM on Windows.

This is filed as a separate issue from #39471 (currently platform:macos-labeled) because:

  1. The bug reproduces on Windows independently of the macOS thread, with distinct evidence.
  2. A community workaround that reportedly works on macOS (pointing OTLP at 127.0.0.1 and running a relay on the host) does not work on Windows — see the loopback test below.
  3. The on-host log evidence narrows the Windows failure to exporter-initialization, not egress filtering, which appears to be a different code path than the macOS reports.

I have also posted three comments on #39471 with progressively narrower evidence; this issue consolidates that into a single Windows-focused report for triage.

Environment

  • Claude Desktop: 1.9255.2 (1dc8f7) — well past the 1.1.4173 minimum stated in the docs
  • Platform: Windows 11 Enterprise
  • Plan: Enterprise
  • Cowork status: Enabled for org in admin console
  • Allow network egress (Cowork section): Toggled ON
  • Domain allowlist mode: "Package managers only" + a custom additional allowed domain

Baseline: the same machine emits OTel cleanly via Claude Code CLI

To rule out environmental issues, the same Windows laptop was first verified end-to-end with the Claude Code CLI OTel exporter against the same collector:

  • Self-hosted Vector 0.43.0 OTLP relay at http://<internal-host>:4318 (and at http://<internal-ip>:4318).
  • Relay forwards to a downstream SIEM via webhook.
  • Claude Code CLI events (claude_code.user_prompt, claude_code.api_request, claude_code.tool_result, etc.) flow through Vector to the SIEM with full attribution: user.email, prompt.id, cost_usd, model, tokens, and resources flattened correctly.
  • Vector's internal counters confirm 154+ events received and forwarded with zero drops over the test period.

So the network path, the collector, and OTel reception are all known-good from this laptop for non-Cowork OTel traffic. Whatever is preventing Cowork events from arriving is Cowork-specific, not environmental.

Reproduction

  1. Configure Cowork OTLP per the docs:
  • OTLP endpoint: http://<internal-host>:4318
  • OTLP protocol: http/protobuf
  • OTLP headers: empty
  • Resource attributes: deployment.environment=pilot,surface=cowork,pilot.user=<user>
  1. Save the admin form.
  2. Fully quit Claude Desktop (tray icon → Quit, not just close window).
  3. Reopen Claude Desktop and start a fresh Cowork session that exercises tools and file access.
  4. Wait several minutes.

Result: Zero events with service.name=cowork arrive at the collector. The same collector continues to receive Claude Code CLI events from the same laptop without issue during the same time window.

All destinations tested on Windows — all return zero events

| OTLP endpoint form | Allowlist behavior | Events arrive? |
|---|---|---|
| External hostname (e.g. <internal-host>:4318) | No admin-UI auto-add message; manually adding the hostname under "Additional allowed domains" accepts but has no effect | No |
| External IP (e.g. <internal-ip>:4318) | Admin UI displays inline message: "&lt;internal-ip&gt; will be automatically added to Cowork's network egress allowlist." | No |
| Hostname manually added under "Additional allowed domains" | UI accepts the entry; allowlist panel reflects it | No |
| localhost:4318 (loopback inside Cowork VM, local Vector relay running on host) | n/a — destination is inside the VM | No |

The last row is the decisive datapoint. A community comment on #39471 reported that on macOS, the Cowork MITM egress proxy blocks external destinations but allows traffic to 127.0.0.1 (the in-VM loopback reaches the host loopback through the macOS bridging path), making "Cowork → localhost relay → external collector" a viable workaround.

To test this on Windows, Vector 0.43.0 was installed locally on the laptop, configured with an OTLP/HTTP source bound to 127.0.0.1:4318 (and :4317 gRPC) and a sink to the same downstream collector. The local Vector ran cleanly: healthcheck passed, listener bound, OTLP/HTTP endpoint verified responsive by a direct loopback probe (curl -X POST http://127.0.0.1:4318/v1/logs returns HTTP 200). Cowork's admin form was then updated to http://localhost:4318, Claude Desktop fully quit and reopened, and a fresh Cowork session was run that exercised tools.

Result: Local Vector's cowork_otlp source receivedEventsTotal counter remained at 0.0 for the entire Cowork session. Not a single OTLP request, connection attempt, or HTTP probe reached the loopback listener — including TCP SYN packets that would precede any blocked-by-proxy condition.

Implication: the "MITM proxy blocks external destinations" hypothesis is ruled out on Windows. If the bug were egress-filtering, loopback would have bypassed it. Since loopback also sees nothing, the Cowork OTel exporter is not emitting at all from the Windows Cowork VM, regardless of destination.

Host-side log analysis

Cowork's host-side VM service logs corroborate this. Logs inspected:

  • Event Viewer → Application log, CoworkVMService provider (VM start/stop events)
  • C:\ProgramData\Claude\Logs\cowork-service.log — host-side VM lifecycle
  • C:\ProgramData\Claude\Logs\coworkd\user-S-1-5-21-…log — per-session Cowork daemon activity

What the per-session coworkd log shows during a real Cowork session

The Cowork VM starts cleanly:

  • HCS-backed VM starts; TAP device + vsock bridge configured (tap=tap0, ip=172.16.10.3/24, gw=172.16.10.1)
  • MITM proxy starts at /var/run/mitm-proxy.sock with ephemeral CA cert installed in guest trust store
  • Network status: CONNECTED; reachability check against api.anthropic.com passes
  • 69 Windows CA certificates loaded into guest trust store
  • Per-session srt-settings file written with domains=5 parentProxy=false
  • OAuth token added to approved-tokens list by the proxy
  • The claude agent binary spawns with a long args list (model, allowed tools, etc.)
  • Plan9 file shares mounted for user session paths

What the log does NOT show — and this is the diagnostic signal

A grep -i 'otel\|otlp\|exporter\|telemetry' against the user log over a complete Cowork session lifetime (from VM start through agent process exit) returns zero matches. Specifically:

  • No "starting OTel exporter" or equivalent initialization line
  • No attempted POST to the configured OTLP endpoint
  • No proxy blocked-by-allowlist line (which would be expected if the exporter were running but being denied by the proxy)
  • No connection error to the OTLP endpoint
  • No mention of the OTLP endpoint hostname or IP anywhere in the log

The proxy is otherwise quite verbose — it logs OAuth token additions, MTU configuration, certificate installation, mount setup, srt-settings writes, etc. The complete absence of any OTel-related log entries during a full Cowork session is conspicuous.

Suspected bug location

Combining the loopback test (rules out egress-filtering) and the coworkd log analysis (no exporter activity in the verbose proxy log), the bug location on Windows narrows to the OTel exporter code path not being executed inside the Windows Cowork VM. Candidate root causes:

  1. Admin → in-VM agent config propagation: the admin-side OTel settings are accepted by the form and persisted, but not delivered to the in-VM claude agent on Windows.
  2. OTel exporter initialization in the in-VM binary: the config is delivered but a Windows-specific code path (or its absence) prevents the exporter from registering / starting.
  3. Platform-conditional gate: an if platform == "linux" || "darwin"-style check disables OTel emission on the Windows Cowork VM.

A single line of debug logging from the in-VM agent at exporter-init time would let anyone reproducing this distinguish (1) from (2)/(3) immediately.

Notable side observation: cosmetic admin-UI behavior

When the OTLP endpoint field is set to an IP form, the admin UI displays an inline message:

"&lt;internal-ip&gt; will be automatically added to Cowork's network egress allowlist."

No equivalent message appears for hostname-form endpoints. The visible domain allowlist panel never reflects an auto-added entry for either form. Because IP-form testing also produces zero events, the auto-add message appears to be cosmetic on Windows — whatever allowlist-mutation code path it implies either isn't executed or doesn't affect the actual egress filtering. (This may or may not be related to the main bug.)

Related issues

  • #39471 — Cowork OTLP monitoring not emitting events despite correct configuration (currently platform:macos-labeled; three of my comments on that thread cover the Windows reproduction)
  • #30112 — Cowork network egress allowlist not working
  • #30861 — Cowork MITM egress proxy blocks non-API domains regardless of allowlist (closed invalid, but the underlying behavior appears reproducible per #39471 thread)

Available diagnostic data on request

  • Full coworkd per-session log (redacted for paths) covering a complete Cowork session
  • Vector internal-metrics screenshots showing the loopback listener at receivedEventsTotal=0.0
  • Vector logs from the APP-host relay showing Claude Code CLI traffic landing cleanly in the same time window (baseline)
  • Admin console screenshots of the Cowork Monitoring and Allow-Network-Egress panels
  • Host-side packet capture from a Cowork session showing whether any TCP traffic to port 4317/4318 leaves the laptop (negative result anticipated based on the above evidence)

Happy to test diagnostic builds, debug-logging-enabled builds, or any other instrumentation the team would find useful.

What would unblock us

This is blocking firmwide AI audit / compliance deployment at an Enterprise customer where Cowork is the primary Claude surface. We have everything on our side built and verified. The next useful step on our end is whatever Anthropic Engineering needs to triage — a debug build, a config flag to enable verbose exporter logging, instructions to dump the in-VM agent config, or just an ack that this is being looked at.

View original on GitHub ↗

4 Comments

jadams4411 · 3 months ago

Tested the CLAUDE_CODE_ENABLE_TELEMETRY=1 workaround from the macOS thread on #39471. It does not work on Windows. Adding this as evidence narrowing the bug.

Setup

  • Same Windows 11 Enterprise + Claude Desktop 1.9255.2 (1dc8f7) environment from the original report
  • Set CLAUDE_CODE_ENABLE_TELEMETRY=1 at User scope via [Environment]::SetEnvironmentVariable("CLAUDE_CODE_ENABLE_TELEMETRY","1","User"), verified persisted in the user env table
  • Fully quit Claude Desktop (tray → Quit, all 9 Claude.exe MSIX processes terminated). Verified via Task Manager / Get-Process filtered to WindowsApps\Claude_*.
  • Relaunched Claude Desktop fresh (new process start time post-env-var). Confirmed all child processes started AFTER the env var was set, so they inherited the User env table on launch.
  • Ran a real Cowork session with tool use (file reads, Bash, multi-turn conversation).
  • Vector collector on the same host was instrumented with a filter to drop service.name=claude-code events at the transform stage, so the only events reaching the downstream sink would be non-CLI events (i.e. anything Cowork emits).

Result

  • Vector sink receivedEventsTotal = 0 for the entire test window. Zero non-claude-code events received.
  • Sanity-checked the filter by tapping cowork_otlp.logs and flatten_and_redact — claude-code CLI events (from another tooling session) are flowing through the source and being correctly dropped at the transform; nothing else is reaching the sink.

Host-side coworkd log confirms Cowork session actually ran

The per-session coworkd VM log for the test window shows the Cowork session spawned and ran for ~51 seconds with full tool wiring:

2026/05/28 19:00:38 [coworkd] SDK binary v2.1.154 already installed, skipping
2026/05/28 19:00:38 [proxy] added approved OAuth token (hash: 736b2d...)
2026/05/28 19:00:38 [process:e5a5fa5e-...] spawn: name=wizardly-pensive-ritchie
   cmd=/usr/local/bin/claude args=[--output-format stream-json --verbose ...
   mcp__cowork__present_files, mcp__cowork__propose_skills, mcp__cowork__list_artifacts,
   mcp__Framebuffer__*, ... --include-partial-messages --replay-user-messages ...]
2026/05/28 19:00:38 [process:e5a5fa5e-...] mounted .../skills, outputs, uploads, .claude
2026/05/28 19:00:38 [process:e5a5fa5e-...] wrote srt-settings (domains=27 parentProxy=false)
2026/05/28 19:00:38 [process:e5a5fa5e-...] started PID 5475
2026/05/28 19:01:29 [process:e5a5fa5e-...] sending SIGKILL to PID 5475

The MCP tools (mcp__cowork__*) and Cowork-specific flags (--replay-user-messages, --permission-mode bypassPermissions) confirm this is a Cowork session, not Claude Code CLI.

The diagnostic signal

A grep -iE 'otel|otlp|exporter|telemetry|CLAUDE_CODE_ENABLE' across the entire coworkd log (including the session above and all prior sessions on this machine) returns zero matches. With the env var set, with admin-side allowlist configured, with a real Cowork session running tool-use for ~51 seconds — there is no log evidence the in-VM agent ever attempted OTel initialization.

One adjacent observation: admin-side config DOES propagate partially

Compared to earlier sessions on this machine where srt-settings was written with domains=5, this session's srt-settings now shows domains=27. So the admin-side allowlist additions (Cowork "Additional allowed domains") are propagating from the admin console into the per-session VM config correctly. The propagation path that's broken is specifically the one carrying OTel-enable. Allowlist config and OTel config appear to be on different propagation channels, and only the OTel channel is failing on Windows.

Updated test matrix on Windows

| Test | Result |
|---|---|
| OTLP destination = external hostname | 0 events |
| OTLP destination = external IP (with admin-UI auto-add message) | 0 events |
| OTLP destination = hostname manually added to "Additional allowed domains" | 0 events |
| OTLP destination = localhost:4318 (loopback inside Cowork VM) | 0 events |
| CLAUDE_CODE_ENABLE_TELEMETRY=1 set at User scope + Claude Desktop restart | 0 events |

Where this narrows the bug

The combination of (a) the host env var not propagating into the in-VM agent's emission code path, (b) allowlist config propagating successfully alongside it, and (c) zero log evidence of any OTel initialization attempt anywhere in the verbose coworkd log strongly suggests the bug is in the in-VM claude binary on Windows itself — either:

  1. The binary's OTel-enable check looks at a value that's not being populated from the host on Windows (whereas it apparently is on macOS, where this same env var workaround works), OR
  2. There's a Windows-specific code path that short-circuits before OTel initialization is even attempted.

A debug build of the in-VM agent that logged at exporter-init time would settle this in one session. Happy to test against any diagnostic build the team produces.

jadams4411 · 3 months ago

One more triangulation datapoint to close this out: also tested against a commercial managed OTLP intake (a major LLM observability SaaS, configured per their direct OTLP-without-agent setup docs with the correct site URL, API key header, and resource attributes). Verified the receiver was healthy via the vendor's ingest metrics dashboard.

Result: zero OTLP packets received during a fresh Cowork session on Windows with tool use. Confirmed via the vendor's ingest-bytes-received metric (not a UI view that depends on schema), so this is a network-level "no traffic arrived" signal — independent of whether the events would have rendered in any particular product UI.

This is the 5th independent OTLP destination ruled out for Cowork on Windows. Combined with the host-side coworkd log evidence (zero otel|otlp|exporter|telemetry matches across every Cowork session ever run on this machine), the diagnosis appears locked: the in-VM claude agent on Windows does not initialize the OTel exporter at all, regardless of admin-side configuration, env vars, or destination.

Final updated test matrix on Windows:

| Destination | Result |
|---|---|
| External hostname | 0 events |
| External IP (with admin-UI auto-add) | 0 events |
| Hostname manually added to "Additional allowed domains" | 0 events |
| localhost:4318 (loopback inside Cowork VM, local Vector relay on host) | 0 events |
| CLAUDE_CODE_ENABLE_TELEMETRY=1 set at User scope + Claude Desktop restart | 0 events |
| Commercial managed OTLP SaaS intake (verified healthy via vendor ingest metrics) | 0 events |

The next move that would actually unblock this is on the Anthropic side: either a debug-logged build of the in-VM agent that confirms or denies exporter init on Windows, or a code-path inspection of whatever Windows-conditional check is preventing the exporter from running. Happy to validate any fix candidate quickly — we have full reproduction and a working pipeline ready to receive.

ADH-ICT · 2 months ago

Requesting a status update — still fully reproducible on Claude Desktop v1.15962.1, Windows 11 Enterprise.
We're an Enterprise customer with a production OTLP pipeline (Azure Container App, Application Insights) that is verified healthy but receives zero events from Cowork. The coworkd per-session logs show no OTel initialization activity across all sessions.

#67657 appears to describe the same root cause: managed-settings env vars are read after OTEL SDK initialization, so they have no effect. If that's what's affecting Cowork on Windows too, a fix there would unblock us. Could we get confirmation that #67657 covers this case, or whether Cowork has a separate code path that needs its own fix?
This is blocking org-wide Cowork rollout. Happy to test any diagnostic build.

popmatik · 1 month ago

Reproduced on macOS (Apple Silicon), latest Claude Desktop — collector proven healthy, zero events from Cowork

Adding another independent macOS confirmation with an end-to-end verified receiver.

Environment

  • macOS (Apple Silicon), Claude Desktop 1.18286.0 (259c3f) (updated specifically to test the reported fix)
  • Team plan, Cowork enabled
  • OTLP destination: a dedicated OpenTelemetry Collector (EDOT) on Google Cloud Run, receiving on /v1/logs

Setup — receiver verified working before testing Cowork

  • Configured Admin → Cowork → Monitoring: http/protobuf, Authorization=Bearer <token>, endpoint = the collector URL
  • Added the collector host to Admin → Capabilities → network egress → Additional allowed domains (the default "Package managers only"
  • **Proved the collector end-to-end synthetic OTLP protobuf log POSTedto the collector with the same Bearer token returns HTTP 200 and is indexed downstream in Elasticsearch. So endpoint, auth, egress domain, and backend are all confirmed healthy.

Result

  • Fresh Cowork sessions after full quit + relaunch, running real tool-use prompts (~1 min of activity).
  • Zero requests reach the collector from Cowork — not a single POST. Cloud Run request loonly my own curl health checks; nor appears.
  • No error surfaces anywhere; the config UI looks completely healthy. Tested the `CLAUDE_CODE_ENABLE_TELOT work here
  • Set via launchctl setenv CLAUDE_CODE_ENABLE_TELEMETRY 1 (so GUI-launched Claude Desktop inherits it), fully quit all Claude processes, relaunched fresh, ran a tool-use Cowork session. - Still zero events. The macOS e help others in this thread did notchange the outcome for us. Test matrix (macOS)

| Test | Result ||---|---|| Admin-UI OTLP config → external co
| Collector host added to "Additional allowed domains" | 0 events | | Synthetic curl OTLP POST to same00, indexed ✅ |
| CLAUDE_CODE_ENABLE_TELEMETRY=1 (launchctl) + full restart | 0 events | Summary
The receiving side is provably correct (a control request lands and indexes), and the networkallowlist propagates (the domain addits nothing and the env-varworkaround doesn't help on macOS latM agent never attempting OTelinitialization (as detailed in the Windows analysis in #63171). Happy to test against any diagnostic build.

Showing cached comments. Read the full discussion on GitHub ↗