发送至Alertmanager的自定义告警未在Grafana中显示
问题分析与解决
核心原因
Grafana默认展示的告警数据来自Prometheus,而非直接从Alertmanager获取。你通过Go程序直接POST到Alertmanager的告警,不会进入Prometheus的指标库,因此现有对接Prometheus的Grafana告警面板无法查询到这条测试告警。
解决方法
方法1:让Grafana直接对接Alertmanager数据源
如果希望在Grafana中查看Alertmanager的所有告警(包括直接发送的自定义告警),可以添加Alertmanager作为Grafana的数据源:
- 登录Grafana,进入「配置」→「数据源」→「添加数据源」
- 选择「Alertmanager」类型,填入Alertmanager的访问地址(集群内可使用服务名,例如
http://alertmanager-operated:9093) - 保存数据源后,使用适配Alertmanager的Dashboard(比如官方的Alertmanager监控面板)即可查看所有告警。
方法2:将自定义告警接入Prometheus(适配现有Grafana面板)
如果想继续使用现有对接Prometheus的Grafana告警面板,需要让自定义告警进入Prometheus的告警流程:
步骤1:部署并使用Pushgateway
kube-prometheus-stack可通过Helm开启Pushgateway:
helm upgrade -n monitoring kube-prometheus-stack prometheus-community/kube-prometheus-stack --set pushgateway.enabled=true
步骤2:修改Go程序推送指标到Pushgateway
调整代码,将告警状态作为指标推送到Pushgateway,示例如下:
package main import ( "fmt" "net/http" "strings" ) func main() { // Pushgateway地址,集群内使用服务名 url := "http://pushgateway.monitoring.svc.cluster.local:9091/metrics/job/test_alerts" // 推送指标:test_alert_firing 1表示告警触发,0表示恢复 metrics := `test_alert_firing{alertname="testAlert",severity="critical"} 1` req, err := http.NewRequest("POST", url, strings.NewReader(metrics)) if err != nil { fmt.Println(err) return } req.Header.Set("Content-Type", "text/plain") client := &http.Client{} resp, err := client.Do(req) if err != nil { fmt.Println(err) return } defer resp.Body.Close() fmt.Printf("Push status: %s\n", resp.Status) }
步骤3:在Prometheus中添加告警规则
添加一条告警规则,当推送的指标为1时触发告警:
groups: - name: custom_alerts rules: - alert: testAlert expr: test_alert_firing == 1 for: 1m labels: severity: critical annotations: summary: "This is a test alert."
将该规则添加到Prometheus的告警规则配置中(kube-prometheus-stack可通过additionalPrometheusRulesMap参数配置),这样Prometheus会生成告警并发送到Alertmanager,同时Grafana可通过ALERTS指标查到这条告警。
额外检查点
- 确认你的Go程序中
EndsAt字段设置为未来时间,否则Alertmanager会很快将告警标记为resolved,影响查看。 - 检查Grafana面板的查询语句,确认是否是基于Prometheus的
ALERTS指标,若是则必须让告警进入Prometheus流程。
内容的提问来源于stack exchange,提问作者quenting
相关产品推荐
相关产品推荐

