Jadpo is experimental and not ready for production. These docs follow the compiler's main branch as of 30 Oct 2026. What's built · Install 0.1.0
jadpo
Reference: Built-in services

Built-in services

Monitoring thresholds

On this page

A threshold says when something your app does is too slow, too frequent or failing too often, such as a route's p95 duration. You declare thresholds in your app's source, in a monitoring file for each domain, so they are reviewed with the code and versioned with each build rather than configured in a monitoring tool. There are two kinds, because only one can be judged by a single process.

Thresholds per request

These judge one request: its duration, its number of queries, whether it failed. The runtime keeps each request's spans in memory until the request ends, then sends:

  • the full trace when a threshold was crossed, the request failed or faulted, or its path is new to this process;
  • otherwise metrics only, plus one sample trace for each path each minute, so there is always a normal request to compare a bad one with.

telemetry: { detail: } sets both (Telemetry): full_traces: names the first list and samples: the second.

A process that crashes loses the requests it hasn't sent yet, and long jobs send on a timeout. This keeps the volume low without losing anything structural: the compiler knows every path, so the number of per-path metrics can't grow without bound.

Thresholds across requests

These judge many requests together: a p95 over a window, an error rate, the oldest waiting delivery. One instance can't judge them for a fleet, so the compiler generates rules for your monitoring tool into build/monitoring/: OpenSLO and Prometheus rules, and other tools' only when asked. The build manifest carries the same thresholds, so a tool that reads it needs no generated rules. The rules are applied when you deploy, and a change made in the tool is overwritten, as with Terraform.

Setting and changing them

  • Starting values come from what the compiler knows, such as the queries on each path from the query report, then from production once the app has run. Local timings aren't production timings, so locally the compiler reports change on the same fixtures: "30% slower", "2 more queries".
  • An agent proposes changes from observed data as an ordinary change to the source, through the MCP server (The developer console and MCP).
  • Loosening needs a person. Raising or removing a threshold is how an agent would silence an alert, so it needs an acceptance and appears in the approval report. Tightening one doesn't.
  • Per build and per flag value. Thresholds belong to a build. Each flag value takes its own branch, so it has its own path and metrics, with no extra tagging.

OpenTelemetry stays the transport; only what is sent changes.

Markdown for agents: /docs/monitoring-thresholds.md.Built from Jadpo main at a707efb.