Monitoring API
The Prometheus-format metrics endpoint: issuing a key, every metric it exposes, and pointing CheckMK, Prometheus, Grafana or Zabbix at it.
GET /api/monitoring/metrics returns your fleet's current state in Prometheus exposition
format. It is the pull half of Monitoring > Integrations, and it is the whole
machine-readable API surface aethercert exposes to your own tooling.
Requires the Pro plan or an MSP tier.
Issuing a key
Create a key under Monitoring > Integrations. It is shown once, in the form
<key-id>.<secret>, and is sent as a bearer token:
curl -H "Authorization: Bearer <key-id>.<secret>" \
https://api.aethercert.com/api/monitoring/metricsA key is scoped to the organization that issued it and can be revoked at any time; revoking takes effect immediately. Only the hash is stored, so a lost key is replaced rather than recovered.
Authentication is rate-limited per key id - 240 requests per 5 minutes, sized for a 15-to-60-second scrape interval. The response is never cached; a scrape sees the fleet's current state.
Wiring it up
CheckMK ships a built-in Prometheus special agent, so pointing that at this URL with the
key as its bearer token is the entire CheckMK setup - there is no plugin to install. The
same endpoint works unchanged with Grafana, Datadog's OpenMetrics check, Zabbix's HTTP
agent, or a plain prometheus.yml scrape config:
scrape_configs:
- job_name: aethercert
scheme: https
metrics_path: /api/monitoring/metrics
authorization:
credentials: "<key-id>.<secret>"
static_configs:
- targets: ["api.aethercert.com"]Your monitoring server needs outbound HTTPS to api.aethercert.com. Nothing has to be
opened on the agent side for this.
What it exposes
| Metric | Type | Labels |
|---|---|---|
aethercert_agents_total | gauge | status - enrolled agents by effective status |
aethercert_certificates_total | gauge | status |
aethercert_certificates_expiring_within_days | gauge | days - 7, 14 and 30 |
aethercert_jobs_total | gauge | status, type |
aethercert_organization_info | gauge | plan - always 1, for joining |
aethercert_renewals_due | gauge | Managed certificates currently due for renewal |
aethercert_job_leases_active | gauge | Jobs currently claimed by an agent |
aethercert_job_leases_expired | gauge | Claimed jobs whose lease expired and awaits recovery |
aethercert_last_agent_heartbeat_seconds | gauge | Seconds since the most recent heartbeat across the fleet. Absent until one exists |
aethercert_oldest_queued_job_seconds | gauge | Age of the oldest queued job. Absent when nothing is queued |
aethercert_agent_poll_requests_total | counter | Job polls the fleet has made |
aethercert_agent_poll_no_change_total | counter | Heartbeats answered with no work queued |
aethercert_agent_poll_jobs_returned_total | counter | Jobs handed out across every poll |
aethercert_worker_job_duration_seconds | histogram | Claim to terminal state, most recent attempt only |
aethercert_agent_updates_total | counter | component, result - self-update cycles |
aethercert_release_rollout_percent | gauge | component, version, channel |
aethercert_notification_email_sent_total | counter | Issuance notification emails sent |
aethercert_notification_email_failed_total | counter | Notifications that exhausted their retries |
aethercert_notification_email_retry_total | counter | Retry attempts beyond the first |
What it deliberately does not expose
The endpoint reports aggregate counts, never per-certificate or per-agent detail. A certificate's common name is not visible to a metrics scraper, and no metric carries an agent id or a job id as a label - an unbounded label set would be a cardinality problem as well as a disclosure one. For per-entity detail, use the dashboard.
Alerting on it
Three rules cover most of what goes wrong:
groups:
- name: aethercert
rules:
- alert: AethercertCertificateExpiringSoon
expr: aethercert_certificates_expiring_within_days{days="14"} > 0
for: 1h
- alert: AethercertJobsFailing
expr: aethercert_jobs_total{status="failed"} > 0
for: 15m
- alert: AethercertAgentsOffline
expr: aethercert_agents_total{status="offline"} > 0
for: 30mFor event-driven alerting rather than polling, use the push integrations instead.
Monitoring integrations
Push alert-worthy events to a webhook, a syslog/CEF collector or an SNMP trap receiver - payload shape, signing, and what is delivered.
Dashboard reference
Every screen in the aethercert dashboard and every setting on it, in sidebar order - Build, Manage, Monitoring, MSP, Help and Settings.