文档 · 2020年3月27日 0

Prometheus+Grafana+Alertmanager实现监控+告警通知

先简单了解一下 prometheus

普罗米修斯的主要特点是:
  • 多维数据模型,通过公制名称和密钥/值对识别时间系列数据
  • PromQL,一种灵活的查询语言,利用这种维度
  • 不依赖分布式存储;单个服务器节点是自主的
  • 时间系列集合通过 Http 的拉动模型发生
  • 推时间系列通过中间网关支持
  • 通过服务发现或静态配置发现目标
  • 图形和仪表板支持的多种模式
结构及原理

此图说明了普罗米修斯的结构及其一些生态系统组成部分:

普罗米修斯建筑

图片来源:概述|普罗 米修斯 (prometheus.io)

更多详细信息可以去prometheus官方文档查看:概述|普罗 米修斯 (prometheus.io)

接下来开始安装使用prometheus

环境准备

服务器:Centos 7.6 IP:192.168.10.10  服务器建议关闭防火墙,需要用到的端口为 9090,9100 ,9093,3000

收集存储组件: Prometheus: prometheus-2.29.1.linux-amd64.tar.gz

展示组件:grafana: 8.1.1

告警组件:alertmanager: alertmanager-0.23.0.linux-amd64.tar.gz

采集组件:node_exporter: node_exporter-1.2.2.linux-amd64.tar.gz

更多组件下载连接:Download | Prometheus

第一步:安装prometheus并修改配置文件
#下载安装包:
wget https://github.com/prometheus/prometheus/releases/download/v2.29.1/prometheus-2.29.1.linux-amd64.tar.gz

#解压:
tar -zxvf prometheus-2.29.1.linux-amd64.tar.gz
mv prometheus-2.29.1.linux-amd64 prometheus

#修改配置文件:
cd /prometheus
vim prometheus.yml
# my global config
global:
  scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# 此处可以配置prometheus收集的监控数据存储到外置数据库,默认存储在自带的sqlite中.
#remote_write:
#  - url: "http://localhost:8086/api/v1/prom/write?db=prometheus"
#remote_read:
#  - url: "http://localhost:8086/api/v1/prom/read?db=prometheus"

# Alertmanager configuration
# alertmanager 告警配置
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          - "localhost:9093"

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
# 定义alertmanager告警规则
rule_files:
  - "/volumes01/prometheus/rules/*.yaml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.

scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  #- job_name: "prometheus"

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    #static_configs:
    #  - targets: ["localhost:9090"]

   - job_name: 'linux'
     file_sd_configs:     #引入外部配置文件,当添加被监控的主机时能够动态刷新配置的功能
     - files:
       - "/volumes01/prometheus/node/node-linux.yaml"   #外部配置文件路径,文件内容如下
       refresh_interval: 5s    # 多久刷新一次配置
# 保存退出
-------------------------------------------------------------------------------------------
# 创建job监听文件
mkdir node
vim node/node-linux.yaml         #配置被监控主机信息
- targets:
  - "192.168.10.10:9100"
  labels:
    instance: "192.168.10.10"
    role: "linux"
    item: "XXX系统"
# 保存退出
-------------------------------------------------------------------------------------------
# 创建告警规则
mkdir rules
vim rules/linux.yaml
groups:
- name: ECS-Alert
  rules:
  - alert: 内存使用率过高
    expr: 100-(node_memory_Buffers_bytes+node_memory_Cached_bytes+node_memory_MemFree_bytes)/node_memory_MemTotal_bytes*100 > 90
    for: 3m                     # 告警持续时间,超过这个时间才会发送给alertmanager
    labels:
      severity: warning
    annotations:
      summary: "{{ $labels.job }} 内存使用率过高"
      description: "{{$labels.job}}的{{ $labels.instance }}服务器内存使用率超过90%,当前使用率[{{ $value }}]."

  - alert: cpu使用率过高
    expr: (1 - avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance)) * 100 > 90
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "{{ $labels.job }} cpu使用率过高"
      description: "{{$labels.job}}的{{ $labels.instance }}服务器cpu使用率超过90%,当前使用率[{{ $value }}]."

  - alert: 硬盘空间不足
    expr: max((node_filesystem_size_bytes{fstype=~"ext.?|xfs|nfs"}-node_filesystem_free_bytes{fstype=~"ext.?|xfs|nfs"}) *100/(node_filesystem_avail_bytes {fstype=~"ext.?|xfs|nfs"}+(node_filesystem_size_bytes{fstype=~"ext.?|xfs|nfs"}-node_filesystem_free_bytes{fstype=~"ext.?|xfs|nfs"})))by(instance) > 90
    for: 10m
    labels:
      severity: warning
    annotations:
      summary: "{{ $labels.job }} 硬盘空间不足"
      description: "{{$labels.job}}的{{ $labels.instance }}服务器硬盘使用率超过90%,挂载点 {{ $labels.mountpoint }},当前使用率[{{ $value }}]."

  - alert: 服务器宕机
    expr: up == 0
    for: 10s
    labels:
      severity: error
    annotations:
      summary: "{{ $labels.job }} 服务器宕机"
      description: "{{$labels.job}}的{{ $labels.instance }}服务器已宕机,请进行检查."

# 保存退出
第二步:安装node_exporter
# 下载安装包
wget https://github.com/prometheus/node_exporter/releases/download/v1.2.2/node_exporter-1.2.2.linux-amd64.tar.gz

# 解压
tar -zxvf node_exporter-1.2.2.linux-amd64.tar.gz 
mv node_exporter-1.2.2.linux-amd64 node_exporter

# 启动
nohup ./node_exporter &

# 可以加入系统服务文章末尾会统一说明
第三步:安装alertmanager,配置告警模板
# 下载安装包
wget https://github.com/prometheus/alertmanager/releases/download/v0.23.0/alertmanager-0.23.0.linux-amd64.tar.gz

# 解压
tar -zxvf alertmanager-0.23.0.linux-amd64.tar.gz
mv alertmanager-0.23.0.linux-amd64 alertmanager

# 修改配置文件
cd alertmanager
vim alertmanager.yml
# 全局配置项
global:
  resolve_timeout: 5m #处理超时时间,默认为5min
  smtp_from: '13591899785@163.com'
  smtp_smarthost: 'smtp.163.com:465'
  smtp_auth_username: '13591899785@163.com'
  smtp_auth_password: '此处不是邮箱的密码,是生成的终端登录密码'
  smtp_require_tls: false

# 定义模板信息
templates:
  - 'template/*.tmpl'

# 定义路由树信息
route:
  group_by: ['ECS'] # 报警分组依据
  group_wait: 10s # 最初即第一次等待多久时间发送一组警报的通知
  group_interval: 10s # 在发送新警报前的等待时间
  repeat_interval: 6h # 发送重复警报的周期 对于email配置中,此项不可以设置过低,否则将会由于邮件发送太多频繁,被smtp服务器拒绝
  receiver: 'email' # 发送警报的接收者的名称,以下receivers name的名称

# 定义警报接收者信息
receivers:
  - name: 'email' # 警报
    email_configs: # 邮箱配置
    - to: '13591899785@163.com'  # 接收警报的email配置
      html: '{{ template "email.message" . }}' # 设定邮箱的内容模板
      headers: { Subject: "[WARN] 报警邮件"} # 接收邮件的标题
      send_resolved: true #是否发送恢复通知

  #- name: 'wechat'  微信告警
  #  wechat_configs:   
  #  - send_resolved: true
  #    api_secret: 'RThYKZpaqfclgoTgSCh3BqE' 
  #    corp_id: 'ww2a818c8f5'
  #    agent_id: '1000001'
  #    to_party: '2'
  #    message: '{{ template "wechat.message" . }}'
    # webhook_configs: # webhook配置
    # - url: 'http://127.0.0.1:5001'
    # send_resolved: true #是否发送恢复通知
#保存退出
-------------------------------------------------------------------------
# 定义告警模板
mkdir template
vim template/linux.tmpl
{{ define "email.message" }}
{{- if gt (len .Alerts.Firing) 0 -}}
{{- range $index, $alert := .Alerts -}}
{{- if eq $index 0 -}}
**********告警通知**********
告警类型: {{ $alert.Labels.alertname }}
告警级别: {{ $alert.Labels.severity }}
{{- end }}
=====================
告警主题: {{ $alert.Annotations.summary }}
告警详情: {{ $alert.Annotations.description }}
故障时间: {{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
{{ if gt (len $alert.Labels.instance) 0 -}}故障实例: {{ $alert.Labels.instance }}{{- end -}}
{{- end }}
{{- end }}

{{- if gt (len .Alerts.Resolved) 0 -}}
{{- range $index, $alert := .Alerts -}}
{{- if eq $index 0 -}}
**********恢复通知**********
告警类型: {{ $alert.Labels.alertname }}
告警级别: {{ $alert.Labels.severity }}
{{- end }}
=====================
告警主题: {{ $alert.Annotations.summary }}
告警详情: {{ $alert.Annotations.description }}
故障时间: {{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
恢复时间: {{ ($alert.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
{{ if gt (len $alert.Labels.instance) 0 -}}故障实例: {{ $alert.Labels.instance }}{{- end -}}
{{- end }}
{{- end }}
{{- end }}

# 保存退出
第四步:启动

启动方式可以选择直接nohup 启动或者将服务注册到系统服务中使用systemctl 控制启动二选一即可。

1.nohup启动
# 启动prometheus 默认端口 9090
cd /prometheus
nohup ./prometheus &

# 启动node_exporter  默认端口 9100
cd /node_exporter
nohup ./node_exporter &

# 启动alertmanager 默认端口 9093
cd alertmanager
nohup ./alertmanager &
2.注册系统服务
# 注册prometheus服务
[root@prometheus-01 /]# vim /usr/lib/systemd/system/prometheus.service

[Unit]
Description=prometheus

[Service]
Restart=on-failure
ExecStart=/prometheus/prometheus  --config.file=/prometheus/prometheus.yml

[Install]
WantedBy=multi-user.target
---------------------------------------------------------------------
# 注册alertmanager服务
[root@prometheus-01 /]# vim /usr/lib/systemd/system/alertmanager.service 

[Unit]
Description=alertmanager

[Service]
Restart=on-failure
ExecStart=/alertmanager/alertmanager  --config.file=/alertmanager/alertmanager.yml

[Install]
WantedBy=multi-user.target
---------------------------------------------------------------------
# 注册node_exporter服务
[root@prometheus-01 /]# vim /usr/lib/systemd/system/node_exporter.service 

[Unit]
Description=node_exporter

[Service]
Restart=on-failure
ExecStart=/volumes01/node_exporter/node_exporter  

[Install]
WantedBy=multi-user.target
---------------------------------------------------------------------
# 刷新daemon
systemctl daemon-reload

# 启动服务
[root@prometheus-01 /]# systemctl start prometheus node_exporter alertmanager

# 检查启动状态
[root@prometheus-01 /]# systemctl status prometheus node_exporter alertmanager
---------------------------------------------------------------------
# 加入开机自启动
[root@prometheus-01 /]# systemctl enable node_exporter prometheus alertmanager
Created symlink from /etc/systemd/system/multi-user.target.wants/node_exporter.service to /usr/lib/systemd/system/node_exporter.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/prometheus.service to /usr/lib/systemd/system/prometheus.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/alertmanager.service to /usr/lib/systemd/system/alertmanager.service.
第五步:验证状态
  • 浏览器访问:prometheus ———————— http://192.168.10.10:9090
  • 浏览器访问:alertmanager ———————- http://192.168.10.10:9093
  • 浏览器访问:node_exporter ——————— http://192.168.10.10:9100/metrics
第六步:安装grafana

官方文档:Install on RPM-based Linux | Grafana Labs

配置yum源:

[root@prometheus-01 /]# vim /etc/yum.repos.d/grafana.repo
[grafana]
name=grafana
baseurl=https://packages.grafana.com/enterprise/rpm
repo_gpgcheck=1
enabled=1
gpgcheck=1
gpgkey=https://packages.grafana.com/gpg.key
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt

# 安装grafana
[root@prometheus-01 /]# yum install -y grafana

# 启动grafana
[root@prometheus-01 /]# systemctl start grafana-server
[root@prometheus-01 /]# systemctl enable grafana-server

第七步:访问grafana并配置展示监控数据

访问grafana默认端口:3000 ————-192.168.10.10:3000

grafana默认用户名密码: admin/admin    第一次登陆需要修改密码。

1.登录成功后配置数据源:

选择prometheus

配置数据源

配置完成后点击save & test 成功后即可

数据源配置完成后导入监控模板

模板ID :8919

然后点击导入就可以使用啦。

效果图展示

推荐一个告警规则的模板,包含各种常见的组件告警规则:https://awesome-prometheus-alerts.grep.to/rules#

至此本篇文章就结束了,有任何问题欢迎留言反馈。

打赏
 
Prometheus+Grafana+Alertmanager实现监控+告警通知