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
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 ~~~