Monitors
A monitor checks one target on a schedule, from the locations you pick, and alerts when the check keeps failing. Monitors are listed under Synthetics → Monitors.
Monitors List
| Column | Description |
|---|---|
| Name | Monitor name, with icons for an open outage, a monitor outside its active hours, restricted access, GitOps-managed monitors and tag-policy violations |
| Service | The monitor's service label. Click to filter |
| Type | Check type |
| Target | URL, host or domain checked, with a copy button |
| Status | Up, Down, Degraded, No data, Pending or Paused |
| Uptime / p95 | Uptime and 95th-percentile response time over the time range picked in the top bar |
| Last run / Last runs | Time of the latest run, and a bar of the recent runs |
| Labels, Probes, Owner, Every | Labels, the locations or agents it runs on, its owner and its interval |
- The state strip above the table filters by state with one click.
- The search bar filters by
status,type,location,probe,owner,enabled,tag_policyand any label key; plain text searches names. - The filter panel on the left offers the same filters as facets: Status, Type, Location, Probe, Team, Env, Service, Owner, Enabled, Tag policy and other labels.
Click a row to open the monitor's details.
Row and bulk actions
Each row's menu has Edit, Duplicate, Run now, Pause / Resume and Delete. Deleting a monitor also removes its results and outages.
Select rows to get the bulk bar: Run now, Pause, Resume, Add to maintenance window, Export CSV, Export selected (YAML or JSON) and Delete. Monitors you can only view are skipped by run, pause, resume and delete.
Export
Export above the table exports every monitor that matches the filters:
- Export as YAML —
SyntheticMonitorresources, ready forkubectl applyor for import. - Export as JSON — the API representation.
- Download CSV — the table's columns for the selected time range.
Secrets are exported as {{ secret:<name>/<key> }} placeholders, never as values.
Creating a Monitor
Click Create Monitor. Pick how to start:
| Option | Description |
|---|---|
| Start from scratch | A blank monitor of any check type |
| From a template | A prefilled monitor for a common check: health endpoints, JSON APIs, security headers, CORS, cookies, certificate expiry, DNS, gRPC health, open or closed ports, login flows, browser journeys, MCP servers, Kubernetes deployments and more. Filter by test type and feature, or search |
| From an APM service | HTTP monitors for a traced service's busiest endpoints (needs access to Traces). Pick the service and a base URL, select endpoints, and review: each monitor gets a latency assertion of 2 × the endpoint's p95 and the service label |
| Import from YAML, JSON or Terraform | See Import Monitors |
The editor has six steps. Next checks the current step; you can go back to any step at any time.
Step 1 — Define
| Field | Description |
|---|---|
| Name | Required, up to 200 characters |
| Check type | See Check Types. It cannot change after the monitor is created |
| Target | URL, host, domain or resource, labelled for the type. For multistep and browser tests it is informational: shown in lists and notifications, never checked |
| Description | What the monitor covers and who to call |
| Team / Service | Stored as the team and service labels |
| Labels | Key/value labels. They drive filters, maintenance windows, agent targeting and the labels on alert series |
If a tag policy is set, a banner lists the required or recommended tags.
Step 2 — Request (or Steps)
The type's settings: the HTTP method, headers, body and authentication, the DNS record type, the TCP port, and so on. For multistep and browser tests the step is called Steps and holds the test's steps. Every field is described in Check Types.
Fields accept variables as {{ NAME }}, for example Authorization: Bearer {{ API_TOKEN }}.
Step 3 — Assertions
Every assertion must pass for a run to succeed. Click Add assertion and pick what to check (status code, response time, body, header, certificate and so on, depending on the type), an operator and the expected value.
| Operator | Meaning |
|---|---|
| equals / not equals | Exact comparison |
| contains / does not contain | Substring |
| matches regex / does not match regex | RE2 regular expression |
| >, ≥, <, ≤ | Numeric comparison |
| does not exist / is undefined | The header is absent / the path selects nothing |
For a response body, pick JSONPath, XPath or JSON Schema to check part of it. When a path selects several values, choose whether the first value, every value or at least one value must match. For HTTP, Suggest assertions proposes assertions from a live response.
Test <type> → Run test runs the check once from the API server without saving, so you can see the response while you write assertions.
Step 4 — Locations & schedule
| Field | Description |
|---|---|
| Status | Active or Paused. Paused monitors don't run or alert |
| Locations | Pick one or more locations. Each card shows the location's status and its online agents. The monitor runs on the agents of every location picked |
| Advanced: specific agents, agents by label | Run on named agents, or on every agent whose labels match (including agents that join later), e.g. env = prod |
| Location threshold (N-of-M) | Alert when N of the M locations fail. Default 1 |
| Frequency | How often the monitor runs, from 10 seconds to 1 week. Default 1 minute. Browser tests start at 5 minutes (at least 1 minute) |
| Timeout | How long one run may take. Default 10 seconds. Multistep tests have a Run budget for the whole test |
| CI execution rule | How the monitor behaves in CI batches: Blocking (a failure fails the batch), Non-blocking (reported only) or Skipped. No effect on scheduled runs |
| Fast retries | Re-run a failed attempt up to 3 times before recording the result; only the final attempt counts for alerting and uptime. Default 2 retries, 300 ms apart (none for multistep and browser tests) |
| Active hours | 24/7, or Only during set hours: a timezone and day/time windows (presets Business hours and Weekends). Outside these hours the monitor does not run, does not alert on missing data and does not count toward uptime |
Step 5 — Alerting
| Field | Default | Description |
|---|---|---|
| Failure threshold | 3 | Consecutive failed runs before the monitor is Down |
| Alert only after failing for | off | Also require the failure to last this long |
| Recovery threshold | 2 | Consecutive passing runs before it is Up again |
| No-data timeout | — | Alert as No data when no result arrives for this long. 0 disables |
| Degraded above | off | A passing run slower than this (ms) makes the monitor Degraded |
| Re-notify while DOWN | Never | Repeat the notification every 5 minutes to 24 hours while down |
| Stop after … re-notifications | 0 | Cap the repeats. 0 repeats until recovery |
| Priority | None | P1 to P5, carried on the alert |
| Notification content | Show everything | Hide the type and target, hide @-mentions, or send the message only |
| Flap detection | off | Treat more than N state changes within M minutes as flapping, and notify once |
| Notify channels | Settings defaults | KubeSense notification channels to send to |
| Notification message | — | Markdown message with {{ }} variables, e.g. {{#is_alert}}…{{/is_alert}}. Preview renders it for a saved monitor |
How alerts are created and delivered is described in Alerts & Maintenance.
Step 6 — Review & test
A summary of the monitor (for example Every 1m from 2 locations · 24/7 · alerts after 3 failures to Slack), with an Edit link per section. When editing, Changes lists every field you changed.
Test before saving → Run test runs the monitor once from the API server, without saving. Click Create monitor (or Save changes).
note: Defaults for new monitors (frequency, timeout, retries, locations, labels, thresholds and channels) come from Settings → Defaults & usage.
Editing, Duplicating and Deleting
- Edit opens the same steps; Skip to review jumps to the summary. Every save records a version in the monitor's History tab, from which an earlier version can be restored.
- Duplicate opens a copy named Copy of …, with the original's secrets.
- Pause stops runs and alerts without deleting anything; Resume starts them again.
- Delete removes the monitor, its results and its outages.
Monitors created from a SyntheticMonitor Kubernetes resource carry a GitOps badge. Change them in the resource; their access follows Kubernetes RBAC.
Import Monitors
Click Create Monitor → Import from YAML, JSON or Terraform, or Import monitors on an empty list.
- Upload files (
.yaml,.yml,.json,.tf) or paste their content. The format is detected:- Kubernetes YAML or JSON — a KubeSense export (
kind: SyntheticMonitor); - Terraform —
kubesense_synthetics_monitorresources; - Datadog Terraform —
datadog_synthetics_testtests anddatadog_synthetics_global_variablevariables (the variables are created too).
- Kubernetes YAML or JSON — a KubeSense export (
- Choose what happens If a monitor already exists: Report an error, Skip it or Replace it.
- Optionally, Copy secrets from an existing monitor, and map Secret placeholders → global variables.
- Click Validate. Nothing is written yet: the result lists what would be created, updated or skipped, and any issues.
- Click Import.
Imported monitors are managed from the web app and API. To manage monitors as code instead, apply the YAML with kubectl or the Terraform with the KubeSense provider.
Access
Each monitor has an owner. Editors can open Access on a monitor to set what everyone else gets — No access, Viewer or Editor — and to transfer ownership. A viewer can see the monitor and its results but not run, change or delete it.
Roles control the rest: Synthetics (monitors, suites, results, alerts, maintenance windows), Synthetics locations, Synthetics variables and Synthetics settings each have their own read and write permissions (see Role Access). Without write permission, the buttons that change things are disabled, while viewing and exporting still work.