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

# Checkly synthetic monitoring with OpenTelemetry

> Export Checkly check results to Bronto as OpenTelemetry traces, and follow each synthetic check run into your backend traces.

[Checkly](https://www.checklyhq.com) runs synthetic checks against your sites and APIs from locations around the world. With [trace export](https://www.checklyhq.com/docs/resolve/traces/how-it-works), Checkly sends every check result to an OpenTelemetry backend as a span. Bronto's ingestion endpoint accepts these spans directly, so you don't need a Collector or any code changes.

Checkly also adds a W3C `traceparent` header to the HTTP requests its checks make. If the service under test is instrumented with OpenTelemetry and sends its traces to Bronto, each check run becomes the **root of one trace** in Bronto: from the Checkly location, through your edge and functions, down to the slowest span.

> [!NOTE]
>
> This page was verified on **October 22, 2026** with an API check on a Checkly Team trial. Trace export is part of Checkly Traces. Check which Checkly plans include it in [Checkly's pricing](https://www.checklyhq.com/pricing).

## Prerequisites

* A Checkly account with Traces. You need permission to change the account settings.
* A Bronto API key with the **Ingestion** role. See [API Keys](/Account-Management/API-Keys.md#create-a-new-api-key).
* Your Bronto region: `eu` or `us`.

## Send check results to Bronto

1. In Checkly, open **Account settings**, then **Traces** under **Integrations** in the settings sidebar.

2. Scroll down to **Export Traces** and fill in the form:

   | Field | Value |
   | - | - |
   | **Enable exporting traces** | Selected |
   | **Endpoint** | `https://ingestion.eu.bronto.io/v1/traces` or `https://ingestion.us.bronto.io/v1/traces` |
   | **Headers** | Click **Add header**. Name `x-bronto-api-key`, value your Bronto API key |

   Enter the full URL, including `/v1/traces`. Checkly sends the spans to exactly this URL.

   <video src="https://mintcdn.com/bronto/i0B05RgkML54V4Qt/images/integrations/checkly-export-traces-setup.mp4?fit=max&auto=format&n=i0B05RgkML54V4Qt&q=85&s=578319c9fcebc866923c8fef17da489c" poster="/images/integrations/checkly-export-traces-setup.png" aria-label="Exporting Checkly traces to Bronto: Account settings, Traces, Export Traces with endpoint https://ingestion.eu.bronto.io/v1/traces and header x-bronto-api-key, then a check run's trace in Bronto Tracing, with the check run as the root span of the app's trace and its checkly.* attributes" controls playsInline preload="metadata" />

   The whole setup in under a minute, from Checkly's account settings to a check run's trace in Bronto

3. Click **Save**.

4. Run any check, for example with **Run request** in the check editor or **Schedule now** on a saved check. Runs from the editor are exported too.

Shortly after, the check run shows up in [Explore Traces](/tracing/explore-traces.md). Every span from Checkly carries `service.name = checkly`, and its operation is the check's name.

## Connect check runs to your backend traces

For API, browser, and multistep checks, Checkly adds two headers to each HTTP request the check makes:

* `traceparent`, with the trace ID and the check run's span ID
* `tracestate: checkly=true`

A service instrumented with OpenTelemetry reads `traceparent` with the default W3C trace-context propagator and continues the trace. If that service sends its traces to the same Bronto account, its spans nest under the check run, with no further setup. If a browser check or Playwright Check Suite sets its own `extraHTTPHeaders`, Checkly's default trace headers are replaced. Add `traceparent` and `tracestate` from the `CHECKLY_TRACEPARENT` and `CHECKLY_TRACESTATE` environment variables, as shown in [Checkly's Traces setup](https://www.checklyhq.com/docs/resolve/traces/).

## What you'll see in Bronto

### One trace from the check location to your code

An API check against a Next.js app on Vercel produces a single trace with spans from four services: the `checkly` check run, `vercel.edge-network`, `vercel.serverless-runtime`, and the app's own `petclinic-web` spans.

![Bronto trace waterfall for checkly: Petclinic Agent - homepage, with the checkly span as the root, followed by vercel.edge-network, vercel.serverless-runtime, and petclinic-web spans, 20 spans across 4 services](https://mintcdn.com/bronto/i0B05RgkML54V4Qt/images/integrations/checkly-trace-waterfall.png?fit=max\&auto=format\&n=i0B05RgkML54V4Qt\&q=85\&s=b462e06eb6a0c1b1f72d70a9b5f9d23a)

### Span attributes

Each check run is a `CLIENT` span. Its duration is the check's response time, and it carries the check details as attributes:

| Attribute | Example |
| - | - |
| `checkly.check.name` | `Petclinic Agent - homepage` |
| `checkly.check.id` | The check's UUID |
| `checkly.check.type` | `API` |
| `checkly.check.status` | `PASSED` |
| `checkly.check.location` | `eu-west-2` |
| `checkly.check.runtime` | `2026.04` |
| `checkly.check.result.id` / `checkly.check.session.id` | IDs of the check result and the check session in Checkly |
| `checkly.account.id` | Your Checkly account ID |

![Span details of the checkly root span in Bronto: service checkly, duration 856 ms, and span attributes checkly.check.name Petclinic Agent - homepage, checkly.check.status PASSED, checkly.check.type API, checkly.check.location eu-west-2](https://mintcdn.com/bronto/i0B05RgkML54V4Qt/images/integrations/checkly-span-attributes.png?fit=max\&auto=format\&n=i0B05RgkML54V4Qt\&q=85\&s=bf7a244443ac39efc5062ea3d5c26aa4)

### Search and aggregate

Bronto indexes span attributes with a `$` prefix, so you can filter on them as field predicates. For example, all check runs that didn't pass:

```sql theme={"dark"}
"$service.name" = 'checkly' AND "$checkly.check.status" != 'PASSED'
```

Group check runs by `$checkly.check.location` to compare response times across Checkly locations, or by `$checkly.check.name` to see each check over time.

## Troubleshooting

| Symptom | Likely cause |
| - | - |
| No `checkly` spans in Bronto | Check that **Enable exporting traces** is selected and saved, that the header name is exactly `x-bronto-api-key`, and that the key has the Ingestion role. |
| Still no spans | Wrong region: an EU key sent to `ingestion.us.bronto.io` (or the reverse) doesn't land in your account. Also check that the endpoint ends in `/v1/traces`. |
| The check run isn't connected to your backend spans | The service doesn't read the `traceparent` header, or sends its traces to another Bronto account. Check that the W3C trace-context propagator is registered. |

## References

* [Checkly Traces: how it works](https://www.checklyhq.com/docs/resolve/traces/how-it-works)
* [Checkly Traces setup](https://www.checklyhq.com/docs/resolve/traces/)
* [Send Traces to Bronto](/tracing/send-traces.md)
* [Explore Traces](/tracing/explore-traces.md)

***

For assistance or questions, contact [support@bronto.io](mailto:support@bronto.io).


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