非常简单的一个直观演示prometheus案例,个人感觉远比官方random那个好多了!
覆盖功能组件全,监测内容完全可控,而且更加直观。当然有几个PromQL其实都大同小异。
1.使用node_exporters监控文件夹,文件夹内部文件由用户自己输入,为方便看prometheus的图表效果,写了个自动生成脚本gen.sh
,用于每隔固定时间生成一个记录。
2.用户开始测试时,手动输入metrics,用于演示alter从 inactive->Pending->Firing
同时,可以演示在altermanager中接收到alter告警。
3.altermanager接收到告警后如何处理,本文没有实现,其实要测试很简单,将默认altermanager.yml中http改为随便一台nc-lk port
主机,如文中发送XXX:9002,那么在XXX主机上nc -lk 9002
即可,即可接收到altermanager发来的完整json数据。
g
下载安装go环境略,也可以使用docker来测,相关版本:
主机:host01
版本:
linux: centos7
go: go version go1.13.8 linux/amd64
# 目录过长建立链接
ln -s /opt/k8s/node_exporter-0.18.1.linux-amd64 /opt/node_exporter
# 关闭其他监控,默认全部都是开启,导致node_exporter/metrics下指标太多,不直观
./node_exporter --collector.textfile.directory="/opt/node_exporter/statistic" \
--no-collector.arp \
--no-collector.bcache \
--no-collector.bonding \
--no-collector.conntrack \
--no-collector.cpu \
--no-collector.cpufreq \
--no-collector.diskstats \
--no-collector.edac \
--no-collector.entropy \
--no-collector.filefd \
--no-collector.filesystem \
--no-collector.hwmon \
--no-collector.infiniband \
--no-collector.ipvs \
--no-collector.loadavg \
--no-collector.mdadm \
--no-collector.meminfo \
--no-collector.netclass \
--no-collector.netdev \
--no-collector.netstat \
--no-collector.nfs \
--no-collector.nfsd \
--no-collector.pressure \
--no-collector.sockstat \
--no-collector.stat \
--no-collector.time \
--no-collector.timex \
--no-collector.uname \
--no-collector.vmstat \
--no-collector.xfs \
--no-collector.zfs
3.手动输入metrics
# 写入数据 ,可直接修改文件,必须.prom后缀
echo 'demo{date="20200304"} 1' > /opt/node_exporter/statistic/demo.prom
4.脚本自动生成数据
# 用脚本每隔5s生成记录
[root@host01 node_exporter]# vim gen.sh
#!/bin/bash
function rand(){
min=$1
max=$(($2-$min+1))
num=$(($RANDOM+1000000000))
echo $(($num%$max+$min))
}
rnd=$(rand 400000 500000)
while :
do
sleep 5
rnd=$(rand 40 200)
echo 'demo{date="20200304"}'+${rnd} > /opt/node_exporter/statistic/demo.prom
done
exit 0
5.增加prometheus监控节点
# 修改prometheus.yml,增加监控对象
- job_name: 'demo_job'
scrape_interval: 3s
static_configs:
- targets: ['host01:9100']
6.增加prometheus告警规则
# 修改prometheus.yml,新增告警规则
rule_files:
- 'demo.rules.yml'
告警规则具体内容
# 告警规则内容,监控demo指标是否大于等于140,如果大于则判断3是否持续30秒
[root@host01 prometheus-2.16.0.linux-amd64]# cat demo.rules.yml
groups:
- name: demo-alert
rules:
- alert: demo-monitor
expr: demo > 140
for: 3m
labels:
bp: hypertension
annotations:
company: "demo"
desc: "current value:{{ $value }}"
7.altermanager安装
altermanager告警处理配置
global:
resolve_timeout: 5m
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 1h
receiver: 'web.hook'
receivers:
- name: 'web.hook'
webhook_configs:
- url: 'http://host03:9002/'
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
prometheus server端 ,增加altermanager节点监控
# 修改prometheus.yml,新增alertmanager
alerting:
alertmanagers:![在这里插入图片描述](https://img-blog.csdnimg.cn/20200306092831160.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L21hcl9samg=,size_16,color_FFFFFF,t_70)
static_configs:
- targets: ['host01:9093']
8.完整prometheus server配置文件
# 完整server配置
[root@host01 prometheus-2.16.0.linux-amd64]# cat 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 # 每15s处理下是否metrics满足rule_files配置的条件
external_labels:
monitor: 'demo-monitor'
rule_files:
- 'demo.rules.yml'
scrape_configs:
# The job name is added as a label `job=` to any timeseries scraped from this config.
- job_name: 'prometheus'
scrape_interval: 5s # 覆盖全局的抓取数据配置
static_configs:
- targets: ['host01:9090']
- job_name: 'demo_job'
scrape_interval: 3s
static_configs:
- targets: ['host01:9100']
alerting:
alertmanagers:
- static_configs:
- targets: ['host01:9093']
9.演示:
最初没有告警:
当出现告警:进入pending状态,等待配置的for时长三分钟,进入Firing状态并发送给altermanager
三分钟后altermanager接收到告警: