Dimensions
Understand the Observability dimension. Read more
Unfault can discover Service Level Objectives (SLOs) from your cloud provider and link them to the route handlers in your codebase. This gives you visibility into which routes are covered by SLOs and surfaces gaps in observability.
SLOs define what “healthy” means for your service. But SLOs are typically configured at the service level in your cloud provider’s console, disconnected from the code that actually handles requests.
When an SLO breach happens, you need to trace from the alert back to the code. Unfault bridges this gap by linking SLOs directly to your route handlers.
To discover and link SLOs, run:
unfault review --discover-observabilityUnfault queries your cloud project for existing SLOs and presents them:
We found SLOs in your GCP project that apply to entire services.Which service does this codebase deploy to?
[1] unfault-prod-cloudrun-api-slo └─ 100% Availability - 99.9% over 30d └─ 99% Error Rate - <1% over 30d └─ 99% Latency - 95th < 500ms over 7d [s] Skip (don't link SLOs)
> 1Select the service that matches your codebase. Unfault links the SLOs to your route handlers:
✓ Linked 3 SLO(s) to 375 route handler(s). (Saved to config, won't ask again for this workspace)This mapping is saved to your workspace configuration. Future reviews remember the link.
Once linked, your review output includes observability coverage:
→ Analyzing backend... 7215ms Languages: python Frameworks: fastapi Dimensions: stability · correctness · performance Reviewed: 185 files · parse 81ms · engine 1551ms Cache: 100% Trace: 52924be6
SummaryLooks good overall, with a couple spots that deserve a closer look. Two themeskeep showing up: resilience hardening and other cleanup. Starting point:scripts/create-plan.py (HTTP call to external service in `run` lacks circuitbreaker protec...); then scripts/trigger-throttle.py (HTTP call to externalservice in `run` lacks circuit breaker protec...).
────────────────────────────────────────────────────────────📊 Observability: 3 SLO(s) linked to 125/125 routes (100% coverage)
✓ All your HTTP routes are covered by SLOs. This gives you visibility into how users are experiencing your service.
Tip: use --output full to drill into hotspots.The observability section shows:
Currently supported:
| Provider | SLO Source |
|---|---|
| Google Cloud | Cloud Monitoring SLOs |
SLO discovery requires authentication with your cloud provider. Unfault uses your existing credentials:
Google Cloud: Application Default Credentials (ADC)
gcloud auth application-default loginIf credentials aren’t available, Unfault skips discovery and continues with the review.
After the initial link, the SLO mapping is stored in your workspace. You can view and modify it:
unfault config showTo re-run discovery (useful if you’ve added new SLOs):
unfault review --discover-observabilityTo unlink SLOs and start fresh, remove the slo section from your workspace configuration.
Unfault links SLOs to:
@app.get, @app.post, etc.)@app.route)app.get, router.post, etc.)http.HandleFunc, gorilla/mux, chi)The link is semantic, not syntactic. Unfault understands your routing structure and maps SLOs to the handlers that serve traffic.
If some routes aren’t covered by SLOs, Unfault tells you:
📊 Observability: 2 SLO(s) linked to 118/125 routes (94% coverage)
⚠ 7 routes have no SLO coverage: → POST /internal/sync → GET /internal/health → POST /webhooks/stripe ...
Consider whether these routes need observability.Not every route needs an SLO. Internal health checks and webhook endpoints might be fine without one. The report helps you make that decision consciously.