目
目录
录
Prometheus基本概念
Prometheus是一个开源系统监控和报警工具包,最初在SoundCloud构建。自2012年成立以来,许多公司和组织都采用了Prometheus,该项目拥有非常活跃的开发者和用户社区。它现在是一个独立的开源项目,独立于任何公司维护。为了强调这一点,并明确项目的治理结构,Prometheus于2016年加入云原生计算基金会,成为继Kubernetes之后的第二个托管项目。
Prometheus将其指标收集并存储为时间序列数据,即指标信息与记录的时间戳以及称为标签的可选键值对一起来存储。
Prometheus的基本原理就是通过HTTP协议周期性抓取被监控组件的状态,任意组件只要提供对应的HTTP接口就可以接入监控,不需要任何SDK或者其他的集成过程。输出被监控组件信息的HTTP接口被叫做exporter,目前开发常用的组件大部分都有exporter可以直接使用,比如Nginx,MySQL,Linux系统信息等,Mongo,ES等。
特点:
-
- 具有由度量名称和键/值对标识的时间序列数据的多维数据模型
- Prom QL,一种对利用这种维度的灵活查询语音
- 不依赖分布式存储;单个服务器节点是自治的
- 时间序列收集通过HTTP上的拉模型进行
- 通过中间网关支持推送时间序列
- 通过服务发现或静态配置发现目标
- 多种图形模式和仪表板支持
Exporter
Prometheus可以理解为一个数据库+数据抓取工具,工具从各处抓来统一的数据,放入Prometheus者一个数据序列数据中,那如果保证各处的数据格式是统一的呢?就是通过这个exporter,Exporter是一类数据采集组件的总称,Exporter负责从目标处数据数据,并将其转化为Prometheus支持的格式,它开放了一个http接口,(以便Prometheus来抓取数据),与传统的数据采集组件不同的是,Exporter并不向中央服务器发送数据,而是等待中央服务器(如Prometheus等)主动前来抓取。Prometheus · GitHub有很多写好的exporter。可以直接下载使用。
架构
Prometheus Server负责定时在目标上抓取metrics(指标)数据并保存到本地存储里面。Prometheus采用了一种Pull(拉)的方式获取数据,不仅降低客户端的复杂度,客户端只需要采集数据,无需了解服务端情况,而且服务端额可以更加方便的水平扩展。如果监控数据达到告警阈值,Prometheus server会通过HTTP告警发送到告警模块alertmanager,通过告警的抑制后触发邮件或者webhook。Prometheus支持PromQL提供多维度数据模型和灵活的查询,通过监控指标关联多个tag的方式,将监控数据进行维度的组合以及聚合。
服务器规划
IP地址 | 操作系统 | 软件 |
192.168.200.111 | centos7.6 | prometheus、Grafana、AlertManager |
192.168.200.113 | centos7.6 | node_exporter |
192.168.200.113 | centos7.6 | node_exporter |
二、Prometheus部署
Prometheus部署
1.上传软件包
rz prometheus-2.38.0.linux-amd64.tar.gz
2.解压软件包
tar -zxvf prometheus-2.38.0.linux-amd64.tar.gz -C /data/
mv /data/prometheus-2.38.0.linux-amd64 /data/prometheus
3.创建用户和组
groupadd prometheus
useradd -g prometheus -s /sbin/nologin prometheus
5.修改属组
chown -R prometheus:prometheus /data/prometheus/
6.添加至systemd开机自启
vim /etc/systemd/system/prometheus.service
[Unit]
Description=Prometheus
After=network.target
[Service]
ExecStart=/data/prometheus/prometheus --config.file=/data/prometheus/prometheus.yml --storage.tsdb.path=/data/prometheus/data
User=root
[Install]
WantedBy=multi-user.target
[root@k8s-master01 prometheus]# cd /data/prometheus
[root@k8s-master01 prometheus]# vim prometheus.yml
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.
alerting:
alertmanagers:
- static_configs:
- targets:
- 192.168.200.111:9093 #修改成你的alertmanger地址
rule_files:
- "rules/*rules.yml"
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
7.启动服务
systemctl daemon-reload
systemctl enable prometheus
systemctl start prometheus
如果报错查看/data/prometheus/data目录所属用户和组是不是prometheus
浏览器访问:http://192.168.200.111:9090
Node_export部署
1.上传软件包
rz node_exporter-1.4.0-rc.0.linux-amd64.tar.gz
2.解压软件包
tar -zxvf node_exporter-1.4.0-rc.0.linux-amd64.tar.gz -C /usr/local/
cd /usr/local/
mv node_exporter-1.4.0-rc.0.linux-amd64 node_exporter
3.添加至systemd开机自启
vim /usr/lib/systemd/system/node_exporter.service
[Unit]
Description=node_exporter
Documentation=https://prometheus.io/
After=network.target
[Service]
Type=simple
User=root
ExecStart=/usr/local/node_exporter/node_exporter
#StandardOutput=null
Restart=on-failure
[Install]
WantedBy=multi-user.target
4.启动服务
systemctl daemon-reload
systemctl enable node_exporter
systemctl start node_exporter
curl 192.168.200.112/113:9100/metrics
在200.111的机器上
5.添加node-exporter服务发现
cd /data/prometheus
mkdir monitor/sd_config/ -p
vim monitor/sd_config/node_exporter.yml
- targets:
- '192.168.200.111:9100'
- '192.168.200.112:9100'
- '192.168.200.113:9100'
labels:
idc: "bj"
Manufacturer: "联通云"
np: "dage"
在200.111的prometh的yml文件添加自动发现
[root@k8s-master01 ~]# vim /data/prometheus/prometheus.yml
- job_name: "node_exporter" #与上面的- job对齐他们是同一级
file_sd_configs:
- files: ['/data/prometheus/monitor/sd_config/node_exporter.yml']
refresh_interval: 5s
浏览器访问:http://192.168.200.111:9090/targets
Grafana部署
wget https://dl.grafana.com/oss/release/grafana-8.3.3-1.x86_64.rpm
rpm -ivh grafana-8.3.3-1.x86_64.rpm
systemctl daemon-reload
systemctl enable grafana-server
systemctl start grafana-server
浏览器访问:Grafana
2)导入node_exporter dashboard模板
AlertManager部署
AlertManager与Prometheus是相互分离的两个组件。Prometheus服务器根据报警发送给Alertmanger,然后AlertManger将Silencing、inhibition、aggregation等消息通过电子邮件、dingtalk和HipChat发送通知。
实现Prometheus的告警,需要通过alertmanger这个组件;在Prometheus服务端写告警规则,在alertmanger组件配置邮箱
alertmanger处理由例如Prometheus服务器等客户端发来的报警。它负责删除重复数据、分组,并将警报通过路由发送到正确的接收器,比如电子邮件、Slack,dingtalk等。alertmanger还支持groups,silencing和警报抑制的机制
Alertmanger的工作机制
1.上传软件包
rz alertmanager-0.24.0.linux-amd64.tar.gz
2.解压软件包
tar -zxvf alertmanager-0.24.0.linux-amd64.tar.gz -C /usr/local/
mv /usr/local/alertmanager-0.24.0.linux-amd64 /usr/local/alertmanager
3.添加开机自启
vim /usr/lib/systemd/system/alertmanger.service
[Unit]
Description=https://prometheus.io
[Service]
Restart=on-failure
ExecStart=/usr/local/alertmanager/alertmanager --config.file=/usr/local/alertmanager/alertmanager.yml
[Install]
WantedBy=multi-user.target
4.启动服务
systemctl daemon-reload
systemctl enable alertmanger
systemctl start alertmanger
浏览器访问:http://127.0.0.1:9093
systemctl restart prometheus
配置邮件告警
vim /usr/local/alertmanager/alertmanager.yml
global:
resolve_timeout: 5m
smtp_smarthost: 'smtp.163.com:25' # 使用 163 邮箱服务器发邮件
smtp_from: '*******' # 发件人,填写你的邮箱
smtp_auth_username: '********' # 与上面保持一致
smtp_auth_password: '********' # 你邮箱的授权码
smtp_hello: '163.com'
smtp_require_tls: false # 不使用加密认证
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 1h # 1 小时重复一次报警
receiver: 'email'
receivers:
- name: 'email'
email_configs:
- to: '********' ##写你自己的邮箱
send_resolved: true # 故障恢复后发送邮件
inhibit_rules: # 告警抑制规则
- source_match:
serverity: 'critical'
target_match:
serverity: 'warning'
equal: ['alertname','dev','instance']
vim /data/prometheus/prometheus.yml
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.
alerting:
alertmanagers:
- static_configs:
- targets:
- 192.168.200.111:9093
# - alertmanager:9093
rule_files:
- "rules/*rules.yml" ##指定告警文件配置地址
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: "node_exporter"
file_sd_configs:
- files: ['/data/prometheus/monitor/sd_config/node_exporter.yml']
refresh_interval: 5s
[root@k8s-master01 ~]# cd /data/prometheus/
[root@k8s-master01 prometheus]# mkdir rules
[root@k8s-master01 prometheus]# cd rules
[root@k8s-master01 rules]# cat monitor_rules.yml
groups:
- name: node-up
rules:
- alert: node-up
expr: up == 0
for: 15s # 评估等待时间,可选参数。用于表示只有当触发条件持续一段时间后才发送告警。在等待期间新产生告警的状态为 pending
labels: # 自定义标签,允许用户指定要附加到告警上的一组附加标签
severity: 1
team: node
annotations:
summary: "{{$labels.instance}} Instance has been down for more than 15 seconds"
[root@k8s-master01 rules]# cat node_rules.yml
groups:
- name: node-alert
rules:
- alert: disk-full
expr: 100 - ((node_filesystem_avail_bytes{mountpoint="/",fstype=~"ext4|xfs"} * 100) / node_filesystem_size_bytes {mountpoint="/",fstype=~"ext4|xfs"})
for: 1m
labels:
serverity: page
annotations:
summary: "{{ $labels.instance }} disk full "
description: "{{ $labels.instance }} disk > {{ $value }} "
进行宕机测试
[root@k8s-master02 ~]# netstat -lnpt|grep 9100
tcp6 0 0 :::9100 :::* LISTEN 3776/./node_exporte
[root@k8s-master02 ~]#kill -9 3776
配置钉钉告警
软件准备
prometheus-webhook-dingtalk下载地址
1.钉钉配置
1.1创建钉钉群,配置机器人
添加机器人
IP地址写虚拟机公网IP地址
查询命令
[root@k8s-master01 ~]# curl ifconfig.me
复制webhook
2.钉钉插件安装(prometheus-webhook-dingtalk)
因为使用钉钉告警的话,还需要钉钉插件支持,所以我们先来安装一下插件,我们直接下载二进制包。启动的默认端口为8060。
[root@k8s-master01 ~]# mkdir -p app/webhook
[root@k8s-master01 ~]# tar xzf prometheus-webhook-dingtalk-1.4.0.linux-amd64.tar.gz
[root@k8s-master01 ~]# mv prometheus-webhook-dingtalk-1.4.0.linux-amd64 app/webhook/prometheus-webhook-dingtalk
[root@k8s-master01 ~]# cd app/webhook/prometheus-webhook-dingtalk
[root@k8s-master01 prometheus-webhook-dingtalk]# ./prometheus-webhook-dingtalk --ding.profile="ops_dingding=后面跟钉钉的webhook地址" & #注意双引号要有
启动之后注意看输出信息Alertmanager配置文件中的url地址 http://localhost:8060/dingtalk/ops_dingding/send就会出现
了。这个地址要与alertmanager.yml中的一致。
复制自带的模板文件并修改
[root@k8s-master01 prometheus-webhook-dingtalk]# cp config.example.yml config.yml
[root@k8s-master01 prometheus-webhook-dingtalk]# cat config.yml
## Request timeout
# timeout: 5s
## Customizable templates path
# templates:
# - contrib/templates/legacy/template.tmpl
## You can also override default template using `default_message`
## The following example to use the 'legacy' template from v0.3.0
# default_message:
# title: '{{ template "legacy.title" . }}'
# text: '{{ template "legacy.content" . }}'
## Targets, previously was known as "profiles"
targets:
webhook1:
url: https://oapi.dingtalk.com/robot/send?access_token=9084e4facf647b9ca3b5f56d2704f0ec2c8ba610de67621e7194f8ab7561ae8d ##这里是你钉钉的webhook
# secret for signature
secret: SEC000000000000000000000
3.Alertmanager配置
注意格式,还有空格,否则容易报错。
[root@k8s-master01 ~]# cat /usr/local/alertmanager/alertmanager.yml
global:
resolve_timeout: 5m
smtp_smarthost: 'smtp.163.com:25' # 使用 163 邮箱服务器发邮件
smtp_from: '*******' # 发件人,填写你的邮箱
smtp_auth_username: '*********' # 与上面保持一致
smtp_auth_password: 'BAWJHIJAOAPVPPQW' # 你邮箱的授权码
smtp_hello: '163.com'
smtp_require_tls: false # 不使用加密认证
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 1h # 1 小时重复一次报警
# receiver: 'email'
receiver: 'ops_dingding'
receivers:
- name: 'email'
email_configs:
- to: '*********' ##你的邮箱
send_resolved: true # 故障恢复后发送邮件
- name: 'ops_dingding'
webhook_configs:
- url: 'http://192.168.200.111:8060/dingtalk/ops_dingding/send'
send_resolved: true
inhibit_rules: # 告警抑制规则
- source_match:
serverity: 'critical'
target_match:
serverity: 'warning'
equal: ['alertname','dev','instance']
最后进行故障测试