---
title: "When thresholds fail | Grafana Labs"
description: "Threshold failures in the terminal, CI exit codes, and a regression example"
---

> For a curated documentation index, see [llms.txt](/llms.txt). For the complete documentation index, see [llms-full.txt](/llms-full.txt).

## Failure signals in the terminal

**✓** passed that line; **✗** failed the threshold on that line.

When all thresholds pass:

text ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```text
✓ http_req_duration..............: avg=186ms  p(95)=312ms
✓ http_req_failed................: 0.00%
✓ checks.........................: 100.00%
```

When a threshold fails:

text ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```text
✗ http_req_duration..............: avg=743ms  p(95)=1247ms
                                   ✗ { p(95)<500 }
✓ http_req_failed................: 0.42%
✓ checks.........................: 99.80%
```

## Exit codes and early stop

| Exit code | Meaning                         | CI/CD behavior          |
|-----------|---------------------------------|-------------------------|
| **0**     | All thresholds passed           | Pipeline continues      |
| **99**    | One or more thresholds breached | Pipeline fails the step |

Add `abortOnFail` to end the run immediately on a critical breach:

JavaScript ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```javascript
thresholds: {
  http_req_duration: [
    { threshold: 'p(95)<500', abortOnFail: true },
  ],
}
```

## Example: regression caught in CI

A change ships with passing unit tests; the baseline gate runs last. **p(95)=683ms** vs **p(95)&lt;500** → **exit 99**, deploy blocked.

text ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```text
running (2m01.3s), 00/20 VUs, 1847 complete iterations
     ✓ status is 200
     ✓ body is not empty

     ✗ http_req_duration..............: avg=512ms  p(95)=683ms
                                        ✗ { p(95)<500 }
     ✓ http_req_failed................: 0.00%
     ✓ checks.........................: 100.00%

ERRO threshold breached: http_req_duration p(95)<500, got 683.21ms
```

| Metric     | Last passing                   | This run           |
|------------|--------------------------------|--------------------|
| p95        | 318 ms                         | 683 ms             |
| Throughput | 15.3 requests per second (RPS) | 15.1 RPS (similar) |
| Errors     | 0%                             | 0%                 |

Latency jumps while throughput is flat usually means **per-request work** got heavier (for example synchronous database work). Fix the hot path, re-run, pipeline goes green.
