alertmanager报警webhook实现
目录:
AlertManager配置如下
global:
resolve_timeout: 5m
...
route:
receiver: webhook
group_by:
- alertname
- cluster
group_wait: 10s
group_interval: 10s
repeat_interval: 45s
receivers:
- name: alert
webhook_configs:
- send_resolved: true
http_config: {}
url: http://webhook.default.svc:9999/createalert
templates: []
接收报警的数据接口
type SendRequest struct {
// alertmanager配置,就是上边的route.receiver
// webhook
Receiver string `json:"receiver"`
// 状态:报警和恢复
// firing和resolved
Status string `json:"status"`
// 分组汇聚的报警信息
Alerts []AlertsInfo `json:"alerts"`
GroupLabels GroupLabelsInfo `json:"groupLabels"`
// AlertManager地址
// http://alertmanager-5bcc459cf7-p8shq:9093
ExternalURL string `json:"externalURL"`
Version string `json:"version"`
// route.group_by,可以单独使用struct来接收
GroupKey string `json:"groupKey"`
}
alert配置为
groups:
- name: container-alert-rules
rules:
- alert: Container_Cpu_Used_Percent
expr: Container_Cpu_Used_Percent > 85
for: 2m
labels:
extend: '{"server": "容器基础监控", "for": "2m"}'
receiver: why
level: P1
annotations:
description: "{{ $labels.pod }} cpu利用率大于85%; 当前值为: {{ $value }}"
AlertsInfo详解
type AlertsInfo struct {
Status string `json:"status"`
// 所有label,包括prometheus采集到的label和alert配置的label
Labels LabelsInfo `json:"labels"`
// alert配置的Annotations
Annotations AnnotationsInfo `json:"annotations"`
StartsAt time.Time `json:"startsAt"`
EndsAt time.Time `json:"endsAt"`
// 可以用于查询的url,不过是使用的kubernetes的svc
// http://prometheus.default.svc:9090/graph?g0.expr=log_metric%7Bcode%3D%22exception%22%2Cserver%3D%22api.default.svc%22%7D+%3E+0&g0.tab=1
// tab 0是console,1是graph
GeneratorURL string `json:"generatorURL"`
}
// 每个label进行序列计划
type LabelsInfo struct {
Alertname string `json:"alertname"`
Cluster string `json:"cluster"`
Instance string `json:"instance"`
Deployment string `json:"deployment"`
Endpoints string `json:"endpoints"`
Pod string `json:"pod"`
Job string `json:"job"`
Receiver string `json:"receiver"`
Level string `json:"level"`
Code string `json:"code"`
Extend string `json:"extend"`
}
type AnnotationsInfo struct {
Description string `json:"description"`
Summary string `json:"summary"`
}
还有GroupLabelsInfo是不会很重要
type GroupLabelsInfo struct {
Alertname string `json:"alertname"`
}
获取的数据直接放到channel
var schan chan *SendRequest
func SendLogic(ctx context.Context, req SendRequest) error {
schan <- &req
return nil
}
channel读取处理
func Consumption(ctx context.Context) {
for {
select {
case req := <-schan:
if err := alert(ctx, *req); err != nil {
log.ErrorfCtx(ctx, "alert err:%s", err)
}
}
}
}
然后就能实现自己的报警数据处理和报警逻辑了,调用企业微信、飞书、短信和电话等接口