alertmanager报警webhook实现

时间:May 24, 2021 分类:

目录:

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)
            }
        }
    }
}

然后就能实现自己的报警数据处理和报警逻辑了,调用企业微信、飞书、短信和电话等接口