Observability
Uplink’s observability is local-first: request capture, access logs, and agent diagnostics all live on your device. Anything an edge reports to a control plane is metadata only — headers and bodies never leave the request path.
Traffic inspector
Capture is enabled per service, two ways:
uplink.yaml— setinspect: off | metadata | fullon a service and runuplink up. The default isoff; a config-declared service opts into capture explicitly.- Interactively — toggle capture per tunnel in the desktop app or the
uplink uiinspector.
A plain uplink serve never enables capture. The modes:
metadatarecords the request line, status, timing, sizes, and client IP — no headers or bodies.fullalso records headers and bounded payloads.
Captures land in the device-local inspector store; browse them in the desktop app or
uplink ui — both read the same local state.
Access logs
uplink logs api # local access log for one served app
uplink logs <app> prints the local access log for a served app; use uplink status
to list known app names.
Agent diagnostics
When the CLI and desktop app seem to disagree, inspect the local serving daemon without starting it:
uplink agent status
uplink agent status --output=json
This reports the state directory, socket path, log path, sidecar path, protocol version, and a live snapshot when the agent is running.
Edge metering
When an edge is connected to a control plane, it pushes metadata-only telemetry: request counts, byte totals, status-class buckets, auth failures, and security events (route misses, disallowed source IPs, policy rejects, firewall monitor/enforce matches, rate limits, saturation). The control plane is observe-only and never sits on the visitor request path. Request headers and bodies stay on the local inspector path and are never exported.
A self-hosted edge does not report into Uplink’s hosted dashboard. Its operator can
set OTEL_EXPORTER_OTLP_ENDPOINT to export the same bounded edge telemetry to an
OTLP collector they control; leaving it unset keeps export inert.
For a self-hosted Compose edge, add the endpoint to the bundle’s .env and
recreate the edge container:
OTEL_EXPORTER_OTLP_ENDPOINT=https://otel.example.com:4317
${EDITOR:-vi} .env
docker compose up -d uplink-edge