> ## Documentation Index
> Fetch the complete documentation index at: https://docs.use.observer/llms.txt
> Use this file to discover all available pages before exploring further.

# Manual metrics

> When the agent can't measure it, set the status explicitly.

Most Observer metrics are probed: an agent runs a probe on a schedule
and reports the result. Manual metrics are the escape hatch for
signals that have no automation, or where the operator wants to
control the status surface explicitly.

## When to use a manual metric

* A signal that has no observability today (a third-party SaaS
  outage, a vendor dependency, an internal system without
  instrumentation).
* A high-level rollup that should follow operator judgment, not a
  noisy underlying measurement.
* A service whose status is gated on a contract with a vendor (where
  Observer should reflect what the vendor says, not what we measure).

## What is different

| Aspect | Probed metric | Manual metric |
| - | - | - |
| `source_type` | `prometheus`, `http`, `tcp`, etc. | `manual` |
| Agent involvement | Agent runs the probe and pushes status. | Agent never sees the metric (filtered at definitions endpoint). |
| Status transitions | Thresholds and confirmation time against the measured value. | Explicit set via API or incident. |
| Webhook events | `metric.status_changed` on flips. | No `metric.status_changed`; each change is recorded in the audit log with its source (`api` or `incident`). |

## How status flips

Two paths set status on a manual metric:

1. **API**: `POST /api/v1/metrics/{id}/status` with
   `{"status": "unhealthy"}`. Scope: `write:metrics`.
2. **Incident impact**: when an open incident lists a service with an
   SLO on a manual metric, that metric auto-flips to mirror the
   incident severity (minor to `degraded`, major or critical to
   `unhealthy`). On resolve, it is set to `healthy`.

## Threshold model

Manual metrics carry no thresholds. Status is set directly. The
`healthy_*` / `unhealthy_*` columns on the metric definition are
ignored.

> [!NOTE]
>
> **Audit**
>
> Every manual transition that changes the status writes an audit log row of action
> `metric.status.set_manually` with the actor, source, and old →
> new status. Useful when reconstructing why a public page rendered
> a particular status at a given time.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.