You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Make the #696 (docker CLI not on PATH) and image/interpreter-mismatch failure
modes visible in the telemetry dashboard instead of guessing.
Feature flags (schema bumped 4 -> 5, additive / forward-compatible):
- docker_isolation_enabled (bool) from cfg.DockerIsolation in
BuildFeatureFlagSnapshot — distinguishes "isolation on, 0 matching servers"
from "isolation off".
- docker_cli_source (enum path|bundled|login_shell|absent) — the direct #696
fleet signal. New shellwrap.ResolveDockerSource reports which resolution
branch found docker (shares the docker-path cache); Runtime.GetDockerCLISource
mirrors IsDockerAvailable. Coarse enum only — never the path string.
Diagnostics (flow into error_code_counts_24h, MCPX-prefix gated/PII-safe):
- MCPX_DOCKER_CLI_NOT_FOUND — isolation requested but docker binary unresolved.
- MCPX_DOCKER_EXEC_NOT_FOUND — in-container interpreter missing (e.g. uvx
absent in python:3.11); previously misclassified as MCPX_STDIO_SPAWN_ENOENT.
- MCPX_DOCKER_OCI_RUNTIME — OCI runtime / exec-format failures.
ClassifierHints gains DockerIsolated; the supervisor threads it from a
side-effect-free mirror of IsolationManager.ShouldIsolate so containerized
ENOENT routes to DOCKER codes. Catalog entries added for all three.
Privacy: all new fields are coarse enums/bools; docker_cli_source canary test
asserts only the 4 enum values ever reach the wire and ScanForPII stays green.
Docs/contracts updated (docs/features/telemetry.md + v2/v3 contract notes).
DASHBOARD HAND-OFF (telemetry.mcpproxy.app, separate service): add panels for
feature_flags.docker_isolation_enabled, the 4-way docker_cli_source breakdown,
and the 3 new MCPX_DOCKER_* rows in the error_code_counts_24h panel.
Related #696
Copy file name to clipboardExpand all lines: docs/features/telemetry.md
+7-1Lines changed: 7 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -4,7 +4,7 @@ MCPProxy collects anonymous usage statistics to help improve the product. This p
4
4
5
5
## What is collected
6
6
7
-
MCPProxy sends a **daily heartbeat** containing only aggregate, non-identifying information. The current schema is **version 3** (`schema_version: 3` in the JSON payload); the schema is forward-compatible so older consumers simply ignore fields they don't recognize.
7
+
MCPProxy sends a **daily heartbeat** containing only aggregate, non-identifying information. The current schema is **version 5** (`schema_version: 5` in the JSON payload); the schema is forward-compatible so older consumers simply ignore fields they don't recognize.
8
8
9
9
| Field | Example | Purpose |
10
10
|-------|---------|---------|
@@ -22,9 +22,15 @@ MCPProxy sends a **daily heartbeat** containing only aggregate, non-identifying
22
22
|`feature_flags.docker_available`|`true`| Fraction of installs with a reachable Docker daemon (schema v3) |
23
23
|`server_protocol_counts`|`{"stdio":3,"http":2,"sse":0,"streamable_http":1,"auto":0}`| Ratio of remote-HTTP vs local-stdio upstreams (schema v3) |
24
24
|`server_docker_isolated_count`|`2`| How many configured servers the runtime actually wraps in Docker isolation (schema v3) |
25
+
|`feature_flags.docker_isolation_enabled`|`true`| Whether global Docker isolation is turned on (schema v5). Lets us tell "isolation on, 0 matching servers" apart from "isolation off" |
26
+
|`feature_flags.docker_cli_source`|`bundled`| How the `docker` CLI was located — fixed enum `path` / `bundled` / `login_shell` / `absent` (schema v5). The direct signal for "Docker installed but not on the spawn PATH" (issue #696). **Never** the path string itself |
25
27
26
28
The `server_protocol_counts` map uses a **fixed enum of keys** (`stdio`, `http`, `sse`, `streamable_http`, `auto`) — server names and URLs are never included. Unknown or misconfigured protocol values are bucketed into `auto`.
27
29
30
+
The `docker_cli_source` field is likewise a **fixed enum** (`path`, `bundled`, `login_shell`, `absent`); the resolved path is never transmitted.
31
+
32
+
Docker isolation failures surface in `error_code_counts_24h` via three stable diagnostic codes (schema v5): `MCPX_DOCKER_CLI_NOT_FOUND` (isolation requested but the `docker` binary is unresolved — issue #696), `MCPX_DOCKER_EXEC_NOT_FOUND` (the image lacks the interpreter the server needs, e.g. `uvx` missing in `python:3.11`), and `MCPX_DOCKER_OCI_RUNTIME` (OCI runtime / architecture-mismatch failures).
0 commit comments