# Threshold line and region > A flat metric has a line it must not cross, and the chart should show where that line is. - Canonical: https://patterns.konigi.com/dashboards/threshold-line - Group: Visual representation - Level: implementation - Status: published - Updated: September 10, 2026 - Also called: SLO line, alert threshold, alarm limit --- ## Problem The line is at 340ms and climbing. Whether that matters depends entirely on a number the viewer either has memorised or doesn't have at all, and the chart is the obvious place to put it. ## Solution Draw the limit on the same axes as the data. Once it's there, "is this bad" becomes a question about geometry rather than recall, and it can be answered from across a room. Grafana's implementation is worth reading as a spec. Thresholds come in two modes: **Absolute**, "defined by a number", and **Percentage**, "defined relative to minimum or maximum". Out of the box a panel arrives with **Base = green** and **80 = red** in **Absolute** mode, which is the single most consequential default in the product, because a threshold at 80 is meaningful for CPU percentage and arbitrary for everything else. Plenty of dashboards ship with it untouched and a red panel that means nothing. The display options are more interesting than they look. **Show thresholds** offers Off, **As lines**, **As lines (dashed)**, **As filled regions**, **As filled regions and lines**, and the dashed variant of that. The choice between a line and a filled region is not decoration. A line says "here is the limit". A filled region says "this whole zone is bad", which reads faster at a distance and costs contrast against the series itself. Dashed says "this is annotation, not data", which is exactly the distinction a viewer needs when the threshold sits close to the line it's judging. The harder question is what the number is doing there. A threshold on a chart is a claim that someone decided what "too much" means. If that decision lives only in the panel's JSON, it will be wrong within a quarter and nobody will know. Error budgets are the version of this pattern that keeps its provenance: the limit derives from a stated objective, and the display shows consumption against it rather than a bare line. ## Use when There is a real limit and crossing it means something: an SLO, a capacity ceiling, a contractual latency, a safety limit. Especially useful on a chart someone monitors rather than explores. ## Don't use when The limit is aspirational. A line drawn at a number nobody agreed to teaches viewers that lines on charts are decorative, which then costs you the next one that matters. ## Trade-offs A threshold is a single number standing in for a judgement, and it hides the judgement. It also invites binary reading of a continuous quantity: 79 and 81 are nearly identical states rendered as opposite colours. Static thresholds age badly, because traffic grows and the limit doesn't. They fire constantly on noisy metrics unless the alert behind them has hysteresis the chart never shows. And a filled region competes for the same visual channel as the data, so a busy chart can end up with the warning zone more prominent than the series crossing into it. ## Checklist - Who set this number, when, and against what? - Is it absolute or relative to the axis range, and does the panel say which? - Is this still the default 80, and if so, is 80 meaningful for this metric? - Line or region, and does the choice suit the reading distance? - Is the threshold visually distinguishable from the data series? - Does crossing it trigger anything, or is it decorative? - Does the alert behind it use the same number the chart draws? - How does a metric that hovers at the line render, and does it flicker? - If this is an SLO, does the panel show budget consumed rather than only the current value? - What happens to the threshold when the y-axis autoscales past it? ## Compare **Grafana** ships thresholds as a field property with a colour ramp, six display styles and a default that survives into production more often than it should, so the pattern is everywhere in Grafana dashboards and correct in fewer of them. **Honeycomb** replaces the bare line with an error budget: the objective is declared, and the chart shows how much of the allowance has been spent and how fast, which answers "should I act now" rather than only "am I over". **Datadog** ties the drawn limit to the monitor definition, so the line on the chart and the condition that pages someone are the same object rather than two numbers that drift apart. **Netdata** ships alarm limits with its collectors, so the thresholds arrive pre-set by whoever wrote the integration, which is a good default and a bad excuse not to revisit them. ## Related Anomaly band is the answer when there is no fixed limit and "normal" depends on the hour. Alert rule is what should be attached to the line if it means anything. Metric targets is where the number ought to be defined and owned. Semantic status color decides what crossing it looks like. Time series is the chart this pattern is drawn on. ## Examples ### Grafana (Grafana Labs) The reference implementation for panel grids, template variables, and stat panels; most other tools are defined by how they differ from it. **Examples / Gauge** — captured September 10, 2026, Grafana Play (signed out; no version string exposed). analytical, medium density, dark theme, desktop-web. Nine gauges, and the page makes Few's argument against them without meaning to. The panel at bottom left holds seven arcs reading 30.6, 30.8, 30.8, 30.9, 30.9, 31.0 and 31.3 GB. Seven squares, seven needles, to say that seven disks are all about the same. The same seven values as a bullet graph would be seven short bars in a fraction of the height, and the one that was different would be obvious rather than requiring you to read each label. What the gauges do carry is a bounded range where the endpoints mean something, which is the case the pattern survives: these are percentages and capacities, not rates. The panel beside them is where it stops working—three circular gauges at 40.8, 20 and 48.6 GB, all with a red arc, so a value and another value two and a half times larger get the same verdict. Hotspots in this capture: - [Gauge and dial](https://patterns.konigi.com/dashboards/gauge) — Seven arcs to report that seven disks agree. This is the area argument in one panel. - [Sparkline](https://patterns.konigi.com/dashboards/sparkline) — A sparkline inside the arc: the same series encoded twice in one square. - [Sequential and diverging scales](https://patterns.konigi.com/dashboards/sequential-and-diverging-scales) — The arc runs pink through green with no perceptual order, so position on it means nothing without the number. - [Semantic status color](https://patterns.konigi.com/dashboards/semantic-status-color) — 40.8, 20 and 48.6 all arc red. The threshold fires for everything, so it says nothing. - [Threshold line and region](https://patterns.konigi.com/dashboards/threshold-line) *(this pattern)* — The coloured band around the rim is the threshold, drawn as a region rather than a line. **Examples / State timeline and Status history** — captured September 10, 2026, Grafana Play (signed out; no version string exposed). operational, medium density, dark theme, desktop-web. The most useful thing on this page is an accident of layout: the third panel down the left column draws three series as state bands, and the panel directly underneath draws the identical query as an ordinary time series. Same data, stacked one above the other. The line chart is three tangled traces oscillating between 57 and 64, and reading it means picking a series, tracing it, and thresholding it in your head. The state timeline above has already done that and shows the conclusion, and the blue stretches—below fifty—are findable without being looked for. That is the whole argument for the encoding, and Grafana has put the before and after in adjacent panels. Worth noticing too that every coloured region here carries its word inside it. LOW, HIGH, NORMAL, CRITICAL, True, False. Colour is never the only carrier on this page. Hotspots in this capture: - [Status history](https://patterns.konigi.com/dashboards/status-history) — Continuous regions with the state name written inside each one. - [Threshold line and region](https://patterns.konigi.com/dashboards/threshold-line) *(this pattern)* — Thresholds turning a numeric series into discrete bands: under 50, 50, 300. - [Time series](https://patterns.konigi.com/dashboards/time-series) — The same query as the panel above, untranslated. Three traces you have to threshold yourself. - [Sequential and diverging scales](https://patterns.konigi.com/dashboards/sequential-and-diverging-scales) — One mark per sample, green through red by temperature—so green here means cold, not good. - [Semantic status color](https://patterns.konigi.com/dashboards/semantic-status-color) — A closed set of two, both labelled. The clearest case on the page of colour plus a word. ## Related patterns - [Anomaly band](https://patterns.konigi.com/dashboards/anomaly-band) — A metric is moving, and the person watching it can't tell whether the movement is normal for this hour on this weekday or the start of an incident. - [Alert rule attached to panel](https://patterns.konigi.com/dashboards/alert-rule) — The chart shows the line to watch; the viewer wants to be told when it's crossed. - [Metric targets](https://patterns.konigi.com/dashboards/metric-targets) — The viewer wants the dashboard to know what 'good' is. - [Semantic status color](https://patterns.konigi.com/dashboards/semantic-status-color) — State has to be readable before the number is. - [Time series](https://patterns.konigi.com/dashboards/time-series) — The viewer needs to see how a value changed over time and spot the moment it changed. ## Sources - [Grafana, Configure thresholds](https://grafana.com/docs/grafana/latest/visualizations/panels-visualizations/configure-thresholds/) - [Honeycomb, SLOs That Tell the Whole Story](https://www.honeycomb.io/blog/service-level-objectives-reducing-mttr) - [Bach et al., Dashboard Design Patterns](https://dashboarddesignpatterns.github.io/patterns.html) --- Screenshots on patterns.konigi.com are reproduced for commentary and criticism. Product names and marks belong to their owners.