Warmplane emits structured JSON logs by default, supports distributed trace correlation, and exports distributed traces via OpenTelemetry (OTLP).
This guide covers logging defaults, request correlation, Human-in-the-Loop (HITL) audit logging, idempotency tracking, operation cancellation, catalog change feeds, and OpenTelemetry collector setup.
Warmplane uses the tracing framework and emits machine-parseable JSON logs by default.
server_id: Identifier of the upstream MCP server.capability_id, resource_id, prompt_id: Unique target identifiers.request_id: Server-generated or client-supplied unique request identifier.operation_id, work_item_id, actor_id, grant_id: Multi-tenant request tracing attributes.idempotency_key, retry_classification: Deduplication keys and retry safety markers (safe, unsafe, idempotent).ticket_id, operator, approval_status: HITL governance metadata.trace_id across HTTP response envelopes, stdio logs, and OTLP spans.Configure logging levels with the RUST_LOG environment variable:
export RUST_LOG=info,warmplane=debug
All execution endpoints (/v1/tools/call, /v1/resources/read, /v1/prompts/get) automatically capture and propagate request context.
Warmplane resolves request context from request payload fields or HTTP headers (in order of precedence):
request_idcontext.operation_idcontext.work_item_idcontext.actor_idcontext.grant_idX-Request-IDX-Operation-IDX-Work-Item-IDX-Actor-IDX-Grant-IDThese attributes are injected into active tracing spans and forwarded in OTLP trace context. This provides full request lineage across the agent orchestrator, Warmplane daemon, and upstream MCP servers.
Warmplane provides dedicated observability for security policy enforcement and interactive capability approvals.
When a capability matches policy.requireApproval patterns, Warmplane pauses execution and emits structured audit logs:
approval_requested: Emitted when an approval ticket is created, recording ticket_id, capability_id, server_id, sanitized_args, and request_id.approval_approved: Emitted when an operator approves a ticket, recording ticket_id, operator, and whether arguments were modified (modified_args).approval_rejected: Emitted when an operator rejects a ticket, recording ticket_id, operator, and rejection reason.approval_expired: Emitted when a ticket exceeds policy.approvalTimeoutSecs.If policy.webhook is configured:
X-Warmplane-Signature-256 header.webhook_dispatch events.When requests provide an Idempotency-Key header or payload field:
idempotency_key and state (in_progress vs deduplicated cache hit).POST /v1/operations/:id/cancel or warmplane cancel-operation emit explicit operation_cancelled events with request_id and elapsed runtime.GET /v1/catalog/events emits structured change events (capability_added, capability_removed, capability_updated) for event stream consumers.Hot-reloading daemon state via POST /v1/config/reload or warmplane reload emits audit events:
config_reloaded: Records added, updated, and removed server counts.server_mounted / server_unmounted: Records individual upstream connection lifecycle transitions.Warmplane records execution events into a Write-Once-Read-Many (WORM) append-only log with linear SHA-256 cryptographic hash chaining.
GET /v1/audit/verify to perform automated cryptographic chain integrity checks.GET /v1/audit/export?format=csv or GET /v1/audit/export?format=jsonl.OpenTelemetry trace export is optional and controlled by environment variables.
| Variable | Default | Description |
|---|---|---|
WARMPLANE_OTEL_ENABLED |
false |
Enables OpenTelemetry trace export when set to true. |
OTEL_EXPORTER_OTLP_ENDPOINT |
http://127.0.0.1:4317 |
Target OTLP gRPC collector endpoint (standard). |
WARMPLANE_OTEL_ENDPOINT |
http://127.0.0.1:4317 |
Fallback OTLP endpoint if OTEL_EXPORTER_OTLP_ENDPOINT is unset. |
WARMPLANE_SERVICE_NAME |
warmplane |
Service identifier tag injected into emitted trace spans. |
export WARMPLANE_OTEL_ENABLED=true
export OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector.internal:4317
export WARMPLANE_SERVICE_NAME=warmplane-prod
warmplane daemon --config mcp_servers.json
Sample otel-collector-config.yaml:
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
processors:
batch:
timeout: 1s
send_batch_size: 256
exporters:
logging:
verbosity: normal
service:
pipelines:
traces:
receivers: [otlp]
processors: [batch]
exporters: [logging]
trace_id, request_id, and operation_id.When debugging a failed capability execution:
trace_id, request_id, and error.code from the HTTP response envelope or log line.trace_id in your distributed tracing tool (Tempo, Jaeger, Datadog) to inspect span durations and upstream latency.request_id or operation_id to review argument sanitization, policy evaluations, and raw upstream protocol responses.APPROVAL_PENDING, APPROVAL_TIMEOUT, or APPROVAL_REJECTED, look up the ticket in GET /v1/approvals/:id or warmplane approvals get <id>.Verify Retry Governance: Inspect the "retry" object (classification: safe |
unsafe |
idempotent) in the response envelope to determine whether client retries are safe. |
policy.redactKeys (e.g. api_key, password, token) are automatically masked in log events, tracing spans, and webhook payloads.tokenEnv, passwordEnv, secretEnv).127.0.0.1 unless fronted by an authenticated reverse proxy or API gateway.X-Warmplane-Signature-256 HMAC signature on receiving webhook endpoints.