Investigating a problem
The pages in ObserveKit connect to each other. This is how to walk from a symptom to a root cause instead of staring at one page.
How the signals link up
- `trace_id` ties a log line to its span, and a span to every other span in the same request. It's the pivot between Logs and Traces.
- `service_name` ties spans to the Services RED metrics and the Service Map.
- `exception_fingerprint` groups repeated stack traces on the Exceptions page.
- Deployment markers (Deployments) put a "what changed" line on your charts.
Runbook: a latency spike
- Services → find the service with the raised p99. Open it.
- Sort its recent traces by duration; open the slowest.
- In the trace's span tree, find the span with the long bar — that's where the time went (a slow DB call, a downstream service, etc.).
- Copy the span's
trace_id, then in Logs filtertrace_id = <id>(or SQLWHERE trace_id = '<id>') to read exactly what that request logged.
Runbook: an error spike
- Overview → the error-rate donut or the Errors tile → jump to Logs filtered to
level = error. - If it's an exception, open Exceptions — the fingerprint grouping shows you which stack trace is spiking and how often.
- From a log line or exception, pivot via
trace_idto the trace to see the full request path and which service actually failed.
Runbook: a crash-looping pod
- Infrastructure → find the pod with climbing restarts.
- Open its logs (or Logs filtered by
pod_name) and read the last lines before each restart. - If it's crashing on an exception, the Exceptions page will have the grouped stack trace.
Runbook: did the deploy cause it?
- Deployments → find the marker near when the symptom started.
- Compare the error rate / latency just before vs after the marker (the marker overlays the charts).
- Drill from the marker into Logs for that source and window to see the first failures after the rollout.
Runbook: everything about one request
You have a trace_id (from a log, a trace, or a customer report):
-- the request's full span tree SELECT name, service_name, duration_ns/1e6 AS ms, status_code FROM spans WHERE trace_id = '<trace-id>' ORDER BY start_time; -- every log line the request produced SELECT timestamp, level, message FROM logs WHERE trace_id = '<trace-id>' ORDER BY timestamp;
When you're not sure where to start
Ask Kit (the assistant) a plain-language question — "why is checkout slow in the last hour?" — to get pointed at the right service/logs, then drill in with the runbooks above. And if a signal is missing entirely, it's a setup issue, not an investigation one: see Troubleshooting: I see no data.