[Windows] Cowork OpenTelemetry exporter does not initialize - zero events emitted to any destination, including loopback
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:
- The bug reproduces on Windows independently of the macOS thread, with distinct evidence.
- A community workaround that reportedly works on macOS (pointing OTLP at
127.0.0.1and running a relay on the host) does not work on Windows — see the loopback test below. - 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 the1.1.4173minimum 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 athttp://<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, andresourcesflattened 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
- 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>
- Save the admin form.
- Fully quit Claude Desktop (tray icon → Quit, not just close window).
- Reopen Claude Desktop and start a fresh Cowork session that exercises tools and file access.
- 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: "<internal-ip> 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,
CoworkVMServiceprovider (VM start/stop events) C:\ProgramData\Claude\Logs\cowork-service.log— host-side VM lifecycleC:\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.sockwith ephemeral CA cert installed in guest trust store - Network status: CONNECTED; reachability check against
api.anthropic.compasses - 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
claudeagent 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-allowlistline (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:
- 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
claudeagent on Windows. - 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.
- 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:
"<internal-ip> 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.
Showing cached comments. Read the full discussion on GitHub ↗
4 Comments
Tested the
CLAUDE_CODE_ENABLE_TELEMETRY=1workaround from the macOS thread on #39471. It does not work on Windows. Adding this as evidence narrowing the bug.Setup
1.9255.2 (1dc8f7)environment from the original reportCLAUDE_CODE_ENABLE_TELEMETRY=1at User scope via[Environment]::SetEnvironmentVariable("CLAUDE_CODE_ENABLE_TELEMETRY","1","User"), verified persisted in the user env tableClaude.exeMSIX processes terminated). Verified via Task Manager /Get-Processfiltered toWindowsApps\Claude_*.service.name=claude-codeevents at the transform stage, so the only events reaching the downstream sink would be non-CLI events (i.e. anything Cowork emits).Result
receivedEventsTotal = 0for the entire test window. Zero non-claude-codeevents received.cowork_otlp.logsandflatten_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:
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-settingswas written withdomains=5, this session's srt-settings now showsdomains=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=1set 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
claudebinary on Windows itself — either: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.
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|telemetrymatches across every Cowork session ever run on this machine), the diagnosis appears locked: the in-VMclaudeagent 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=1set 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.
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.
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
/v1/logsSetup — receiver verified working before testing Cowork
http/protobuf,Authorization=Bearer <token>, endpoint = the collector URLPOSTedto 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
curlhealth checks; nor appears.launchctl setenv CLAUDE_CODE_ENABLE_TELEMETRY 1(so GUI-launched Claude Desktop inherits it), fully quit allClaudeprocesses, 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
curlOTLP POST to same00, indexed ✅ ||
CLAUDE_CODE_ENABLE_TELEMETRY=1(launchctl) + full restart | 0 events | SummaryThe 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.