Troubleshooting
Start with the boundary where the failure becomes visible, then follow the request or event through the platform. Capture the request identifier and time range before collecting logs.
| Symptom | First checks | Likely owner |
|---|---|---|
| Gateway returns 403 | Token issuer, route policy, Cerbos decision logs | Identity / platform team |
| Gateway cannot reach a service | Route target, readiness, Service/Endpoint objects | Platform team |
| Service has 5xx responses | Pod logs, traces, dependency health, configuration | Service owner |
| Events do not reach a sink | Broker connection, queue depth, pipeline match, sink credentials | AuditFlow / platform team |
| Payment state does not update | Provider response, verified webhook delivery, payment logs | Payment integration owner |
| Pods remain Pending | Resource requests, node capacity, PVC and scheduling events | Cluster operator |
Fast diagnostic sequence
flowchart TD
A["Record request ID and time"] --> B{"Request or event?"}
B -->|"Request"| C["Check gateway, policy, then service health"]
B -->|"Event"| D["Check producer, broker, pipeline, then sink"]
C --> E["Inspect correlated logs and traces"]
D --> E
E --> F["Apply one scoped fix and verify"]
Useful commands
| Goal | Command |
|---|---|
| List workload health | kubectl get pods -A |
| Inspect a failing workload | kubectl describe pod <pod> -n <namespace> |
| Read service logs | kubectl logs deploy/<service> -n <namespace> --since=15m |
| Check recent events | kubectl get events -A --sort-by=.lastTimestamp |
For local onboarding issues, see the legacy local troubleshooting notes. Keep production fixes narrow, documented, and reversible.