oto_ingest_process_duration_seconds
| Type | histogram |
| Labels | outcome (includes skipped for a batch already processed) |
| Registered in | internal/ingestion/service/metrics.go |
| Alertable | yes, secondary |
| Rule | covered by OtoQueueBacklog; add a p99 rule if you run at volume |
What it observes
Section titled “What it observes”ingest.process_batch: the asynchronous half, after the 202. This is where alerts become
cases, groups are formed and notifications are minted.
What a rise means
Section titled “What a rise means”Nothing is lost when this is slow — the batch is durable — but everything downstream is late: the
Slack message and the timeline. (This used to name “the reminder” as a third; oto sends nothing
unprompted since git-bug bd0fb1d.) And because the ingest queue is where the backlog
accumulates, a rise here is the direct cause of queue_depth shedding on the accept path.
outcome="skipped" is a batch that had already been processed. Non-zero is normal (a retry after a
crash between commit and completion) and needs no response.
What to check
Section titled “What to check”oto_job_queue_depthforqueue="ingest"— is it one slow batch or a thousand queued ones?oto_job_duration_secondsforkind="ingest.process_batch", which is the same work seen by the job runtime and carries the outcome split.- Batch size (see
oto_ingest_alerts_total). A 5 000-alert storm batch is expected to take seconds. - Postgres contention on
alerts,casesandalert_groups.
What to do
Section titled “What to do”- Add
ingestworkers before anything else; the queue is a concurrency boundary precisely so this is a safe dial. - If one org dominates, look for a rule with runaway label cardinality — that is a rule problem upstream, not a capacity problem here.