Prometheus and Grafana
If you run Prometheus, it can scrape your workspace's monitors from UpHeron like any other target: status, response times, uptime, certificate and domain expiry, open incidents and vulnerability findings. Grafana then reads them through Prometheus, and the ready dashboard shows them all. It works on every plan, Free included, and a scrape costs nothing beyond the rate limits.
Scrape configuration
Create a token with the read scope in Settings → API tokens (see Authentication), save it in a file Prometheus can read, such as /etc/prometheus/upheron-token, and add a job to prometheus.yml:
scrape_configs:
- job_name: upheron
scheme: https
metrics_path: /api/v1/metrics
scrape_interval: 60s
scrape_timeout: 20s
authorization:
type: Bearer
credentials_file: /etc/prometheus/upheron-token
static_configs:
- targets: ["upheron.com"]
authorization sends the token as Authorization: Bearer; X-API-Key works too, for scrapers that set headers. A scrape every 15 to 60 seconds is fine: the numbers are built at most every 10 seconds per workspace, checks run no faster than every 10 seconds, and four scrapes a minute are far below the 300 reads a token may make. With several Prometheus servers, give each its own token.
To try it first:
curl https://upheron.com/api/v1/metrics -H "Authorization: Bearer $UPHERON_API_KEY"
The answer is the Prometheus text format, or OpenMetrics 1.0 when the scraper prefers it in its Accept header, as Prometheus does.
Metrics
Every series carries the monitor's id, name and kind. Values measured at each location also carry location, the location's code (push for heartbeat and webhook monitors). Times are Unix times in seconds and durations are in seconds, as Prometheus expects.
| Metric | What it is |
|---|---|
upheron_monitor_up |
1 when the monitor is up, 0 when it is down or degraded. Absent until its first check. |
upheron_monitor_status |
1 for the status the monitor is in, 0 for the others: status is degraded, down, pending or up. |
upheron_monitor_paused |
1 when the monitor is paused. |
upheron_monitor_maintenance |
1 while a maintenance window, or an occurrence of a repeating one, covers the monitor. |
upheron_monitor_slo_target_ratio |
The monitor's availability objective, from 0 to 1, for monitors with one; window is its rolling window (7d, 30d or 90d). |
upheron_monitor_error_budget_remaining_ratio |
The share of the objective's error budget left over its window, from 1 (none used) to 0 (used up). |
upheron_monitor_check_interval_seconds |
Seconds between the monitor's checks. |
upheron_monitor_location_up |
1 when the newest check at the location passed, 0 when it failed. |
upheron_monitor_response_time_seconds |
The response time of the newest check at the location. |
upheron_monitor_last_check_timestamp_seconds |
When the newest check at the location ran. |
upheron_monitor_uptime_ratio |
The share of checks that passed, from 0 to 1, over a window: 24h (the last 24 hours), 7d or 30d (the last 7 or 30 UTC days, today included). Absent for a window without checks. |
upheron_monitor_certificate_expiry_timestamp_seconds |
When the TLS certificate expires, where known: certificate monitors, and website monitors that check expiry. |
upheron_monitor_domain_expiry_timestamp_seconds |
When the domain's registration expires, where known: domain monitors, and website monitors that check expiry. |
upheron_monitor_open_incidents |
Incidents that are open or acknowledged, including ones opened by hand that list the monitor. |
upheron_monitor_vulnerabilities |
Open vulnerability findings by severity (critical, high, low, medium), for monitors with vulnerability alerts and code repository monitors. |
Days until a certificate expires are (upheron_monitor_certificate_expiry_timestamp_seconds - time()) / 86400.
Alerting rules
UpHeron already alerts your notification contacts. If you prefer Alertmanager, rules like these work on the metrics:
groups:
- name: upheron
rules:
- alert: MonitorDown
expr: upheron_monitor_up == 0 and on (id) upheron_monitor_paused == 0 and on (id) upheron_monitor_maintenance == 0
for: 2m
annotations:
summary: "{{ $labels.name }} is down"
- alert: CertificateExpiresSoon
expr: (upheron_monitor_certificate_expiry_timestamp_seconds - time()) / 86400 < 14
annotations:
summary: "The certificate of {{ $labels.name }} expires in {{ $value | humanize }} days"
- alert: CriticalVulnerability
expr: upheron_monitor_vulnerabilities{severity="critical"} > 0
annotations:
summary: "{{ $labels.name }} runs software with a critical vulnerability"
Grafana dashboard
Grafana reads UpHeron through Prometheus; there is no separate Grafana data source to install. Download the dashboard, upheron-grafana-dashboard.json, and import it in Grafana under Dashboards → New → Import, or put it in a folder Grafana provisions dashboards from. Choose your Prometheus data source at the top of the dashboard.
It shows how many monitors are up, down, paused and in maintenance, open incidents and critical and high vulnerabilities, a table of every monitor with its status, uptime over 24 hours, 7 and 30 days, response time and days until its certificate and domain expire, a status timeline, response times by location, expiry and vulnerability bars, and uptime over 30 days. Filter it by kind and monitor.