Prometheus + Grafana + Alertmanager + Consul 实现服务器监控,钉钉告警

2,676

1. 实现原理及使用的组件介绍

组件介绍:

  • node_exporter 负责采集服务器的数据并将监控数据暴露在9100端口
  • prometheus 通过服务器ip:9100 拉取监控数据,并提供接口给其他组件查询
  • grafana 数据可视化,已更好看的界面展示监控数据,提供简单的告警
  • consul 服务发现,实现各监控服务器的自动注册服务 (如果只检测一台设备,可以不用consul, 直接在prometheus配置文件配置)
  • alertmanager 定义更详细的告警规则,告警后将告警信息转发给 prometheus-webhook-dingtalk 的web服务
  • prometheus-webhook-dingtalk 负责告警消息的美化及钉钉转发

2. prometheus 安装及配置

安装:

# 下载
wget https://github.com/prometheus/prometheus/releases/download/v2.7.2/prometheus-2.7.2.linux-amd64.tar.gz
# 解压
tar -xzf prometheus-2.7.2.linux-amd64.tar.gz

# 基础配置 prometheus.yml 

配置文件:

global:
  scrape_interval:     15s #每15s采集一次数据
  evaluation_interval: 15s #每15s 评估一次规则

# 告警,这里配置为使用了Alertmanager的配置方法
alerting:
  alertmanagers:
  - static_configs:
    - targets: ['localhost:9093']


# 告警规则配置文件目录
rule_files: [ 'rules.yml' ]

scrape_configs:
  - job_name: 'prometheus-server'  
    static_configs:
      - targets: ['localhost:9100']
    
  # 下边为使用了consul自动注册服务的配置
  - job_name: 'node'
    consul_sd_configs:
      - server: '127.0.0.1:8500'
        services: []
    relabel_configs:
      - source_labels: [__meta_consul_tags]
        regex: .*prometheus-target.*
        action: keep
      # 将instance中的ip 替换成consul服务中的机器名
      - source_labels: [ __meta__consul_service ]
        target_label: instance

启用:

./prometheus &

浏览器访问,http://ip:9090/targets 中可以看到当前有哪些服务器在线,哪些离线

浏览器中输入http://ip:9090,可以看到prometheus的图形界面, 我们选择一个指标,node_load1,来看一下是否有数据吧:

3. node_exporter 的安装

# 下载压缩包
wget https://github.com/prometheus/node_exporter/releases/download/v0.18.1/node_exporter-0.18.1.linux-amd64.tar.gz
# 解压
tar -xzf node_exporter-0.18.1.linux-amd64.tar.gz

# 启用
`./node_exporter &`

4. Grafana 安装

# 官网下载包
wget https://dl.grafana.com/oss/release/grafana_6.2.5_amd64.deb     #版本按需更改
# 
sudo apt-get install -y adduser libfontconfig1
# 安装
sudo dpkg -i grafana_6.2.5_amd64.deb 

# 启用
- `sudo service grafana-server start`
# 开机启用
`sudo update-rc.d grafana-server defaults`

# 默认开启3000端口, 默认账户名密码为 admin/admin 

grafana 官方安装指导及使用

prometheus, node_exporter, grafana 安装之后, 可以打开浏览器输入ip:3000 使用admin登陆grafana 网页, 首次登陆时会强制要求更改密码,

进入grafana界面后 添加prometheus数据源

点击齿轮 => Data Sources => Add data source,如下图:

添加prmetheus数据源

数据源添加后,你就可以自定义自己的仪表盘啦, 贴一张我的

5. Consul 安装

安装:

# docker安装
# 拉取镜像
docker pull consul
# 运行 并绑定端口
docker run --name consul -d -p 8500:8500 consul

# 压缩包安装
# 下载安装包
wget https://releases.hashicorp.com/consul/1.5.2/consul_1.5.2_linux_arm64.zip
# 解压
unzip consul_1.0.0_linux_amd64.zip
# 复制consul到bin
cp consul /usr/local/bin/
# 启动
consul agent -server -ui -bootstrap-expect 1 -data-dir /tmp/consul -bind=192.168.50.19 -client 0.0.0.0 2>&1 &   
# -bind=>服务器ip -client=> 能够访问的ip

prometheus.yml 中新增配置

- job_name: 'consul-prometheus'
    consul_sd_configs:
    #consul 地址
      - server: 'xx.xx.xx.xx:8500'    #
        services: []
    relabel_configs:
      - source_labels: [__meta_consul_tags]
        regex: .*prometheus-target.*
        action: keep

注册服务:

{
  "id": "prometheus-server",
  "name": "prometheus-node",
  "address": "192.168.50.19",   #要注册服务的ip
  "port": 9100, 
  "tags": ["prometheus-target"],
  "checks": [
      {
          "http": "http://www.baidu.com",   # 健康检查的网址
          "interval": "15s"         # 健康检查间隔
      }
  ]
}

将上面的配置文件保存成一个json文件, 利用json文件注册:

curl --request PUT --data @regitor.json http://localhost:8500/v1/agent/service/register

解除服务:

向http://localhost:8500/v1/agent/service/deregister发送PUT请求,后边跟服务名

curl --request PUT http://localhost:8500/v1/agent/service/deregister/userService1   #userService1为删除的服务名

6. Alertmanager 安装配置

安装:

# 下载安装包
wget https://github.com/prometheus/alertmanager/releases/download/v0.17.0/alertmanager-0.17.0.linux-amd64.tar.gz

# 解压
tar -xfz alertmanager-0.17.0.linux-amd64.tar.gz

# 启动
./alertmanager

alertmanager.yml 配置文件配置:

global:
  resolve_timeout: 5m

route:
  group_by: ['alertname']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 1h   #发送的频率
  receiver: 'webhook'   #使用的通知渠道 webhook为 钉钉机器人
receivers:
- name: 'webhook'
  webhook_configs:
  - url: 'http://localhost:8060/dingtalk/ops_dingding/send'     # 这里使用的是向prometheus-webhook-dingtalk服务发消息,prometheus-webhook-dingtalk实现转发
    send_resolved: true         # 告警解除后是否发送通知
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']

prometheus.yml 中新增配置:

rule_files: [ 'rules.yml' ]

rules.yml 配置示例:

groups:
  - name: host_monitoring
    rules:
    - alert: 内存报警
      expr: ((node_memory_MemFree_bytes)  + (node_memory_Cached_bytes) + (node_memory_Buffers_bytes)) / 1024 / 1024 < 500
      for: 2m
      labels:
        team: node
      annotations:
       # Alert_type: 内存报警
       # Server: '{{$labels.instance}}'
        #summary: "{{$labels.instance}}: High Memory usage detected"
        explain: "可用内存 < 500MB,value:{{ $value }}MB"
        #description: "{{$labels.instance}}: Memory usage is above 80% (current value is: {{ $value }})"
    - alert: 磁盘报警
      expr: (max(node_filesystem_avail_bytes{device=~"/dev.*"}) by (instance)) / 1024 / 1024 < 1024
      for: 2m
      labels:
        team: node
      annotations:
        #Alert_type: 磁盘报警
        #Server: '{{$labels.instance}}'
        explain: "磁盘可用容量小于 1 GiB,value:{{ $value }}GiB"
    - alert: 服务告警
      expr: up == 0
      for: 2m
      labels:
        team: node
      annotations:
        #Alert_type: 服务报警
        #Server: '{{$labels.instance}}'
        explain: "node_exporter服务已断开"

配置完成后,可以在ip:9090/alerts 界面看到正在监控规则,如图:

7. prometheus-webhook-dingtalk 安装配置

因为prometheus-webhook-dingtalk使用golang编写 所以我们要先安装golang:

# golang安装配置

# 下载源码
wget https://dl.google.com/go/go1.10.3.linux-amd64.tar.gz

# 解压
tar -C /usr/local -xzf go1.10.3.linux-amd64.tar.gz

# 添加二进制文件加入PATH
vim /etc/profile
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin
source /etc/profile

prometheus-webhook-dingtalk 安装配置:

# golang的src目录下新建,并且cd /usr/local/go/src/github.com/timonwong
# clone 项目 并编译

git clone https://github.com/timonwong/prometheus-webhook-dingtalk.git
cd prometheus-webhook-dingtalk
make

启动

nohup ./prometheus-webhook-dingtalk --ding.profile=“ops_dingding=dingding_webhook” 2>&1 1>dingding.log &  
  
# 启动8060端口, 启动后可 netstat -a | grep 8060 看下服务服务示范正常启动

到这里,所有的配置都已经结束,当服务器有告警时,钉钉机器人会自动发送消息,消息样式如下:

~~~ OVER ~~~