如何基于Prometheus告警数据创建类status.io的状态页?
Short Answer: Yes, Absolutely!
You don’t need external tools outside the Prometheus ecosystem (or a few lightweight add-ons) to create a fully functional status page that matches status.io’s core features—all using your existing Prometheus alert data.
How to Approach It
Core Idea
Prometheus alerts (tracked via Alertmanager or directly via the Prometheus API) give you all the data you need: real-time firing/resolved states, alert details, timestamps, and metadata (like which service/component is affected). The trick is mapping that alert data to status page concepts:
- Map
alertstate="firing"to a "Degraded" or "Down" status - Map
alertstate="resolved"to "Operational" - Use alert labels (like
service,component,environment) to group services on your status page
Tools to Use
1. Grafana (Most Flexible, No Custom Code Needed)
Grafana is the easiest starting point if you already use it with Prometheus:
- Add your Prometheus as a data source
- Use community-built status panel plugins (or even built-in panels like Stat or Text) to create status indicators
- Write PromQL queries to pull current alert states:
# Check if any firing alerts exist for the payment service count(ALERTS{alertstate="firing", service="payment-gateway"}) > 0 - Use annotations to display a timeline of past alert events on your dashboard
2. Lightweight Open-Source Status Page Tools
There are open-source tools built specifically to consume Prometheus data for status pages:
- Tools like
prometheus-status-pagepull directly from the Prometheus API, auto-group alerts by labels, and generate a clean, status.io-style web interface out of the box - These tools usually require minimal configuration—just point them at your Prometheus endpoint and define label mappings for service groups
3. Custom Build (Full Control)
If you want complete control over the UI and features, build a simple web service:
- Use a lightweight framework (Node.js/Express, Python/Flask) to periodically query the Prometheus API
- Convert the alert data into a status page-friendly format (group by service, calculate current status)
- Serve a custom HTML/CSS/JS page that updates in real-time (using WebSockets or auto-refresh)
Key Implementation Steps
- Clean Up Your Alert Labels: Add consistent labels like
service,component,severityto all Prometheus alerts. This makes grouping services on the status page trivial. - Define Status Mapping: Decide how alert states map to status page labels:
severity="critical"+alertstate="firing"→ "Down"severity="warning"+alertstate="firing"→ "Degraded"- No firing alerts → "Operational"
- Handle Historical Data: If you want to show past incidents, either:
- Use Prometheus' built-in metrics like
ALERTS_FOR_STATEto track how long alerts have been firing - Sync alert data to a long-term store (like PostgreSQL) if Prometheus' retention period is too short
- Use Prometheus' built-in metrics like
- Add Maintenance Mode: Tag planned maintenance alerts with a
type="maintenance"label, then exclude these from "Down/Degraded" statuses and display them as a separate maintenance banner on your page.
Mimicking status.io’s Core Features
- Real-Time Status Indicators: Use color-coded badges (green/amber/red) tied to your PromQL query results
- Service Grouping: Organize statuses by business unit (e.g., "Core Services", "Customer Tools") using alert labels
- Incident Timeline: Display a list of recent alerts with timestamps, descriptions, and resolution times
- Subscriptions: Integrate with Alertmanager’s existing notification channels (email, Slack) to let users subscribe to status updates, or build a simple email subscription form in your custom page
- Custom Branding: Tweak Grafana’s theme or your custom UI to match your brand, just like status.io
Pro Tips
- Set up a reverse proxy (like Nginx) to serve your status page on a custom subdomain (e.g.,
status.yourcompany.com) - If using Grafana, restrict access to the status page dashboard to public users (if needed) using Grafana’s auth settings
- Test your setup by firing a test alert in Prometheus to ensure the status page updates correctly
内容的提问来源于stack exchange,提问作者rashidcmb

