prometheus+alertmanager+dingtalk监控告警系统

一、prometheus

系统监控和报警系统

1.创建映射文件
  • /xxx/config
  • /xxx/data

config下创建 prometheus.yml、rules.yml

# prometheus.yml
global:
  scrape_interval:     60s #默认抓取周期,可用单位ms,smhdwy 设置每15s采集数据一次,默认一分钟
  evaluation_interval: 60s #估算规则的默认周期 # 每15秒计算一次规则。默认1分钟

# Alertmanager configuration
alerting: 
  alertmanagers: 
  - static_configs: 
    - targets: ["ip:9093"]

rule_files: 
  - "/etc/prometheus/rules.yml"

scrape_configs:
  - job_name: prometheus
    static_configs:
      - targets: ['ip:9090']
        labels:
          instance: prometheus

  - job_name: node
    static_configs:
      - targets: ['ip:9100']
        labels:
          instance: node

  - job_name: cadvisor
    static_configs:
      - targets: ['ip:8888']
        labels:
          instance: cadvisor

  - job_name: mysqld
    static_configs:
      - targets: ['ip:9104']
        labels:
          instance: mysqld

  - job_name: elasticsearch
    static_configs:
      - targets: ['ip:9114']
        labels:
          instance: elasticsearch

  - job_name: kibana
    params:
      module:
      - http_2xx
      target:
      - ip:5601
    metrics_path: /probe
    static_configs:
    - targets: ['ip:9115']
      labels:
        instance: kibana

  - job_name: logstash
    params:
      module:
      - tcp_connect
      target:
      - ip:5044
    metrics_path: /probe
    static_configs:
    - targets: ['ip:9115']
      labels:
        instance: logstash

  - job_name: filebeat
    params:
      module:
      - tcp_connect
      target:
      - ip:5066
    metrics_path: /probe
    static_configs:
    - targets: ['ip:9115']
      labels:
        instance: filebeat
# rules.yml

# name: 指定组的名字,在这个规则文件中必须要唯一。
# alert: 指定告警的名字,在组中需要唯一。
# expr: 告警表达式, 执行结果为true时,表示需要告警。表达式遵循PromQL语法。
# for:代表超过多少时间才认为需要告警(即告警表达式成立需要持续的时间)。
# annotations:描述

groups:
  - name: Node
    rules:
      - alert: NodeMemoryUsage
        expr: 100 - (node_memory_MemFree_bytes + node_memory_Cached_bytes + node_memory_Buffers_bytes) / node_memory_MemTotal_bytes*100 > 80
        for: 1m
        labels:
          level: Warning
        annotations:
          summary: "内存使用率过高"
          description: "{{ $labels.job }}内存使用率大于 80% (当前值: {{ $value }})"

      - alert: NodeCpuUsage
        expr: (1-((sum(increase(node_cpu_seconds_total{mode="idle"}[1m])) by (instance)) / (sum(increase(node_cpu_seconds_total[1m])) by (instance)))) * 100 > 70
        for: 1m
        labels:
          level: Warning
        annotations:
          summary: "CPU使用率过高"
          description: "{{ $labels.job }}CPU使用率大于 70% (当前值: {{ $value }}"

      - alert: NodeDiskUsage
        expr: 100 - node_filesystem_free_bytes{fstype=~"xfs|ext4"} / node_filesystem_size_bytes{fstype=~"xfs|ext4"} * 100 > 80
        for: 1m
        labels:
          level: Warning
        annotations:
          summary: "分区使用率过高"
          description: "{{ $labels.job }}分区使用大于 80% (当前值: {{ $value }}"

      - alert: 产品node
        expr: up {job="node"} == 0
        for: 1m
        labels:
          level: Error
        annotations:
          summary: "服务连接失败"
          description: "监控的目标已丢失,请检查{{ $labels.job }}服务或{{ $labels.job }}_exporeer服务"


      - alert: TCP
        expr: node_netstat_Tcp_CurrEstab > 1000
        for: 1m
        labels:
          level: Warning
        annotations:
          summary: "TCP连接过高"
          description: "{{ $labels.job }}连接大于 1000 (当前值: {{$value}})"

      - alert: IO
        expr: 100 - (avg(irate(node_disk_io_time_seconds_total[1m])) by(instance)* 100) < 60
        for: 1m
        labels:
          level: Warning
        annotations:
          summary: "流入磁盘IO使用率过高"
          description: "{{ $labels.job }}流入磁盘IO大于60%  (当前值:{{$value}})"

  - name: ELFK
    rules:
      - alert: elasticsearch
        expr: elasticsearch_cluster_health_up == 0
        for: 0m
        labels:
          level: Error
        annotations:
          summary: "服务连接失败"
          description: "监控的目标已丢失,请检查{{ $labels.job }}服务或{{ $labels.job }}_exporeer服务"

      - alert: EsCpuUsed
        expr: es_os_cpu_percent > 80
        for: 5m
        labels:
          level: Error
        annotations:
          summary: "CPU使用率过高"
          description: "{{ $labels.job }}CPU使用高于 80%,当前 {{$value}}%"

      - alert: EsJvmHeapMemUsed
        expr: es_jvm_mem_heap_used_percent > 75
        for: 10m
        labels:
          level: Warning
        annotations:
          summary: "Jvm堆内存使用率过高"
          description: "{{ $labels.job }}使用的Jvm堆内存高于 75%,当前 {{$value}}%"

      - alert: EsDiskUsed
        expr: ceil((1 - es_fs_path_available_bytes / es_fs_path_total_bytes) * 100 ) > 90
        for: 5m
        labels:
          level: Warning
        annotations:
          summary: "磁盘使用率过高"
          description: "{{ $labels.job }}磁盘使用率高于 90%,当前 {{$value}}%"

      - alert: kibana
        expr: (up {job = "kibana"} == 1) and (probe_success == 0)
        for: 0m
        labels:
          level: Error
        annotations:
          summary: "服务连接失败"
          description: "监控的目标已丢失,请检查{{ $labels.job }}服务或blackbox-exporter服务"

      - alert: logstash
        expr: (up {job = "logstash"} == 1) and (probe_success == 0)
        for: 0m
        labels:
          level: Error
        annotations:
          summary: "服务连接失败"
          description: "监控的目标已丢失,请检查{{ $labels.job }}服务或blackbox-exporter服务"    

      - alert: filebeat
        expr: (up {job = "filebeat"} == 1) and (probe_success == 0)
        for: 0m
        labels:
          level: Error
        annotations:
          summary: "服务连接失败"
          description: "监控的目标已丢失,请检查{{ $labels.job }}服务或blackbox-exporter服务"

  - name: other
    rules:
      - alert: cadvisor
        expr: up {job="cadvisor"} == 0
        for: 0m
        labels:
          level: Error
        annotations:
          summary: "服务连接失败"
          description: "监控的目标已丢失,请检查{{ $labels.job }}服务"

  - name: mysql
    rules:
      - alert: mysqld
        expr: up {job="mysqld"} == 0
        for: 0m
        labels:
          level: Error
        annotations:
          summary: "服务连接失败"
          description: "监控的目标已丢失,请检查{{ $labels.job }}服务或{{ $labels.job }}_exporter服务"

      - alert: 最大连接数
        expr: mysql_global_status_max_used_connections > mysql_global_variables_max_connections * 0.8
        for: 1m
        labels:
          level: Warning
        annotations:
          summary: "超过80%的最大连接数"
          description: "{{ $labels.job }}使用的连接数已经超过了的最大连接数的80%以上"
2.启动命令
docker run -d --name prometheus --network test--restart=always --privileged=true -e TZ=Asia/Shanghai \
-p 9090:9090 \
-v  /xxx/config/prometheus.yml:/etc/prometheus/prometheus.yml \
-v  /xxx/config/rules.yml:/etc/prometheus/rules.yml \
-v  /xxx/data:/prometheus \
bitnami/prometheus
3.访问地址
# 主页
http://ip:9090/
# 配置文件
http://ip:9090/config
# 监控信息
http://ip:9090/metrics

二、cadvisor

对节点机器上的资源及容器进行实时监控和性能数据采集,包括CPU使用情况、内存使用情况、网络吞吐量及文件系统使用情况

docker run -d --name cadvisor --network test--restart=always --privileged=true -e TZ=Asia/Shanghai \
-p 8888:8080 \
-v /:/rootfs:ro \
-v /var/run:/var/run:rw \
-v /sys/fs/cgroup/cpu,cpuacct:/sys/fs/cgroup/cpuacct,cpu \
-v /sys/fs/cgroup/memory:/sys/fs/cgroup/memory \
-v /var/lib/docker/:/var/lib/docker:ro \
google/cadvisor

访问地址

# 查看prometheus监控指标
http://ip:8888/metrics
# 查看容器信息
http://ip:8888/containers/

三、exporter

探针:是Prometheus的一类数据采集组件的总称。它负责从目标处搜集数据,并将其转化为Prometheus支持的格式。与传统的数据采集组件不同的是,它并不向中央服务器发送数据,而是等待中央服务器主动前来抓取。抓取什么样的数据,就需要什么类型的exporter,比如说抓取mysql状态的数据,就需要mysqld_exporter。

不同服务对应的exporter官网:

https://prometheus.io/docs/instrumenting/exporters/
3.1 mysqld-exporter:
# 连接数据库服务器
mysql -u root -p
# 降低MySQL8 密码规则策略,或者按规则设置密码
set global validate_password.policy=LOW;
# 创建exporter用户,密码为Prometheus,使用max_user_connections参数来限制exporter用户最大连接数,避免监控引起数据库过载
# “%”,表示一组主机,即对所有主机开放权限
CREATE USER 'exporter'@'%' IDENTIFIED BY 'Prometheus' WITH MAX_USER_CONNECTIONS 5;
# 修改密码
ALTER USER 'exporter'@'%' IDENTIFIED WITH mysql_native_password BY 'Prometheus';
# 授权
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'%';
flush privileges;

docker run -d --name mysqld-exporter --network test--restart=always --privileged=true -e TZ=Asia/Shanghai \
-p 9104:9104 \
-e DATA_SOURCE_NAME="exporter:Prometheus@(ip:3306)/" prom/mysqld-exporter
3.2 node-exporter

用于采集类UNIX内核的硬件以及系统指标

docker run -d --name node-exporter  --network test--restart=always --privileged=true -e TZ=Asia/Shanghai  -p 9100:9100  prom/node-exporter

访问地址:

http://ip:9100/metrics
3.3 elasticsearch-exporter

用于采集ES指标

docker run -d --name elasticsearch-exporter --network test--restart=always --privileged=true -e TZ=Asia/Shanghai -p 9114:9114 bitnami/elasticsearch-exporter --es.uri=http://ip:9200

访问地址:

http://ip:9114/metrics
3.4 blackbox-exporter

监听服务器的某个端口是否存在,监听http的请求是否正确

1、创建映射文件
  • /xxx/config

config下创建blackbox.yaml

# 输出就是Prometheus标准的metrics。特别注意最后一个指标probe_succcess,它的值为1或0。
# 当我们向blackbox-exporter发起上述请求时,blackbox-exporter就会去ping ip,
# 如果ping通了,则probe_success的值为1,如果没有ping通,则probe_success的值为0

modules:
  http_2xx: # HTTP的GET请求探测 localhost:9115/probe?module=http_2xx\&target=www.baidu.com
    prober: http
  http_post_2xx:
    prober: http
    http:
      method: POST
  tcp_connect: # TCP端口连通性探测 localhost:9115/probe?module=tcp_connect\&target=www.baidu.com:80
    prober: tcp
  pop3s_banner:
    prober: tcp
    tcp:
      query_response:
      - expect: "^+OK"
      tls: true
      tls_config:
        insecure_skip_verify: false
  ssh_banner: # SSH连通性探测 localhost:9115/probe?module=ssh_banner\&target=localhost:22
    prober: tcp
    tcp:
      query_response:
      - expect: "^SSH-2.0-"
  irc_banner:
    prober: tcp
    tcp:
      query_response:
      - send: "NICK prober"
      - send: "USER prober prober prober :prober"
      - expect: "PING :([^ ]+)"
        send: "PONG ${1}"
      - expect: "^:[^ ]+ 001"
  icmp: # 主机连通性探测 curl localhost:9115/probe?module=icmp\&target=ip
    prober: icmp
2、启动命令
docker run -d --name blackbox-exporter  --network test--restart=always --privileged=true -e TZ=Asia/Shanghai  -p 9115:9115  -v /xxx/config/:/config prom/blackbox-exporter --config.file=/config/blackbox.yaml
3、测试地址
http://ip:9115/probe?module=http_2xx&target=ip:端口

四、grafana

用于监控展示

docker run -d --name grafana  --network test --restart=always --privileged=true -e TZ=Asia/Shanghai  -p 3000:3000  grafana/grafana

默认账号和密码都是admin,登录后会提示是否修改默认密码

访问地址:

http://ip:3000
admin
1qaz!QAZ

五、alertmanager

接收 Prometheus 发送的告警信息,它支持丰富的告警通知渠道(钉钉…)

1.创建映射文件
  • /xxx/config

config下创建alertmanager.yml

# 全局配置
global:
  # 经过此时间后,如果尚未更新告警,则将告警声明为已恢复。(即prometheus没有向alertmanager发送告警了)
  resolve_timeout: 5m

# 所有报警都会进入到这个根路由下,可以根据根路由下的子路由设置报警分发策略
route:
  # 分组就是将多条告警信息聚合成一条发送,这样就不会收到连续的报警了。
  # 将传入的告警按标签分组(标签在prometheus中的rules中定义),例如:
  # 接收到的告警信息里面有许多具有cluster=A 和 alertname=LatencyHigh的标签,这些个告警将被分为一个组。
  # 如果不想使用分组,可以这样写group_by: [...]
  group_by: ['alertname']
  group_wait: 30s       # 第一组告警发送通知需要等待的时间,这种方式可以确保有足够的时间为同一分组获取多个告警,然后一起触发这个告警信息。
  group_interval: 1m    # 发送第一个告警后,等待"group_interval"发送一组新告警。
  # 分组内发送相同告警的时间间隔
  # 收到告警后,一个分组被创建,等待1分钟发送组内告警,如果后续组内的告警信息相同,这些告警会在30分钟后发送
  # 但是30分钟内这些告警不会被发送。
  repeat_interval: 30m
  receiver: 'web.hook' # 接收组名

# 告警接收
receivers:
- name: 'web.hook'
  webhook_configs:
  - url: 'http://ip:8060/dingtalk/webhook1/send'
    send_resolved: true     # 表示服务恢复后会收到恢复告警

# 抑制告警(减少相同原因产生的大量告警)
inhibit_rules:
  - source_match: # 第一条抑制规则
      level: 'Error'
    target_match: # 匹配标签
      level: 'Warning'
    equal: ['alertname','instance'] # 在源和目标中具有相同值的标签
2.启动命令
docker run -d --name alertmanager --network test--restart=always --privileged=true -e TZ=Asia/Shanghai -p 9093:9093 \
-v /xxx/alertmanager.yml:/etc/alertmanager/alertmanager.yml \
prom/alertmanager

六、dingtalk

钉钉告警插件

1.钉钉创建群组机器人

1、钉钉创建一个群聊
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.创建映射文件
  • /xxx/prometheus-webhook-dingtalk

prometheus-webhook-dingtalk下创建config.yml

templates:
  - /etc/prometheus-webhook-dingtalk/templates/templates.tmpl
targets:
  webhook1:
    # 根据实际创建的钉钉机器人添加
    url: https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxx
    # secret: xxxxxxxx  # 加签
    message:
       text: '{{ template "产品" . }}'

prometheus-webhook-dingtalk下创建 /templates/templates.tmpl

{{ define "产品" }}

{{- if gt (len .Alerts.Firing) 0 -}}
{{- range $index, $alert := .Alerts -}}

=========  **监控告警** =========  
**告警名称:**    {{ .Labels.alertname }}        
**告警类型:**    {{ .Annotations.summary }}   
**告警级别:**    {{ .Labels.level }}   
**告警应用:**    {{ .Labels.job }}     
**告警详情:**    {{ .Annotations.description }}        
**故障时间:**    {{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
{{ end }}
{{ end }}


{{- if gt (len .Alerts.Resolved) 0 -}}
{{- range $index, $alert := .Alerts -}}

=========  **告警恢复** =========  
**告警名称:**    {{ .Labels.alertname }}        
**告警类型:**    {{ .Annotations.summary }}   
**告警级别:**    {{ .Labels.level }}   
**告警应用:**    {{ .Labels.job }}     
**告警详情:**    {{ .Annotations.description }}        
**故障时间:**    {{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}  
**恢复时间:**    {{ (.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}  
{{ end }}
{{ end }}
{{- end }}
3.启动命令
docker run -d  --name dingtalk --network test--restart=always --privileged=true -e TZ=Asia/Shanghai -p 8060:8060 \
-v /xxx/prometheus-webhook-dingtalk:/etc/prometheus-webhook-dingtalk \
timonwong/prometheus-webhook-dingtalk
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值