Prometheus 配置报警发送到AlertManager

2019-08-29 0 By admin

Prometheus 服务需要配置好连接 AlertManager 服务的方式和报警事件的规则。这样两者就要可以正常的合作了。

一、Prometheus 连接AlertManager

1.1、发现AlertManager 方式

可以通过 kubernetes_sd_configs 内置的模块自主发现AlertManager 服务,也可以在配置文件中写死连接信息。

global:
  scrape_interval: 30s   #Server端抓取数据的时间间隔
  scrape_timeout: 10s
  evaluation_interval: 30s  #评估报警规则的时间间隔
alerting:
  alertmanagers:
  - kubernetes_sd_configs:
    - role: endpoints
      namespaces:
        names:
        - monitoring
    scheme: http
    path_prefix: /
    timeout: 10s
    api_version: v1
    relabel_configs:
    - source_labels: [__meta_kubernetes_service_name]
      separator: ;
      regex: alertmanager-main
      action: keep
    - source_labels: [__meta_kubernetes_endpoint_port_name]
      separator: ;
      regex: web
      action: keep
rule_files:
- "/etc/prometheus/prometheus.rules" 
#定义告警文件,这个文件是通过configmap映射到容器的etc目录

1.2、发送警报通知

Prometheus可以周期性的发送关于警报状态的信息到Alertmanager实例,然后Alertmanager调度来发送正确的通知。该Alertmanager可以通过-alertmanager.url命令行flag来配置。

二、Prometheus 的报警规则

报警规则允许你定义基于Prometheus语言表达的报警条件,并发送报警通知到外部服务。一般在prometheus的配置文件里面配置。
1、FOR子句使得Prometheus等待第一个传进来的向量元素(例如高HTTP错误的实例),并计数一个警报。如果元素是active,但是没有firing的,就处于pending状态。
2、LABELS(标签)子句允许指定一组附加的标签附到警报上。现有的任何标签都会被覆盖,标签值可以被模板化。
3、ANNOTATIONS(注释)子句指定另一组未查明警报实例的标签,它们被用于存储更长的其他信息,例如警报描述或者链接,注释值可以被模板化。

[root@master-01 prometheus]# cat configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-config
  namespace: kube-system
data:
  prometheus.rules: |-
    groups:
    - name: node-resource  #规则组名称
      rules:
      - alert: InstanceDown #单个规则的名称
        expr: up == 0  
#匹配规则,就是prometheus里面的targets属于down的状态
        for: 1m        #持续时间
        labels:        #标签
          team: node   
# 自定义标签,和前面的alertmanager configmap里面的标签关联起来
        annotations:   # 告警正文
          description: '{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 1 minutes.'
          summary: Instance {{ $labels.instance }} down

2.1、配置示例

二、Prometheus configmap-reloader

修改配置文件后,不需要经过删除Pod 和创建Pod 这个繁琐的过程,可以直接使用reloader 重新加载配置文件。
kubectl apply-f configmap.yaml
curl -X POST "http://localhost:9090/-/reload"