一、原理与特性(功能)
1.主要特性
- 多维数据模型(时序由 metric 名字和 k/v 的labels构成)
- 灵活的查询语言(PromQL)
- 无依赖的分布式存储;单节点服务器都是自治的
- 采用 http 协议,使用pull模式拉取数据,简单易懂
- 监控目标,可以采用服务发现和静态配置方式
- 支持多种统计数据模型和界面展示。可以和Grafana结合展示。
2.架构原理图
图片来自:Overview | Prometheus
二、安装Prometheus
1.安装主要组件如下:
- Prometheus Server
- 被监控对象exporter组件
- 数据可视化工具 Grafana
- 数据上报网关 push gateway
- 告警系统 Alertmanager
2.安装prometheus服务端
官方下载地址:Download | Prometheus
由于官方地址不稳定,不追求最新版可以用我下载好的网盘地址:百度网盘 请输入提取码 8888
#1.通过软件将安装包发到主机
[root@module 1-prometheus]# tar -xf prometheus-2.33.3.linux-amd64.tar.gz #解压软件包
[root@module 1-prometheus]# mv prometheus-2.33.3.linux-amd64/ /usr/local/prometheus #将软件包移动到安装软件的目录并改名
[root@module 1-prometheus]# cd /usr/local/prometheus/ #进入到程序目录
[root@module prometheus]# ./prometheus --version #查看版本
prometheus, version 2.33.3 (branch: HEAD, revision: 56e14463bccfbb6a8facfb663fed5e0ca9f8b387)
build user: root@4ee34e4f7340
build date: 20220211-20:48:21
go version: go1.17.7
platform: linux/amd64
[root@module prometheus]# sed -i '$s/"localhost:/"192.168.1.123:/' prometheus.yml #修改配置文件,IP为本机地址
[root@module prometheus]# ./promtool check config ./prometheus.yml #检查配置文件语法
Checking ./prometheus.yml
SUCCESS: ./prometheus.yml is valid prometheus config file syntax
#2.编写service文件
[root@module prometheus]# vim /usr/lib/systemd/system/prometheus.service #编写service文件,便于之后使用
[Unit]
Description=Prometheus Monitoring System #描述信息
After=network.target #在哪个服务之后启动
[Service]
ExecStart=/usr/local/prometheus/prometheus \ #执行systemctl start需要启动的进程名称
--config.file=/usr/local/prometheus/prometheus.yml \ #配置文件
--storage.tsdb.path=/usr/local/prometheus/data/ \ #数据存储路径
--web.enable-admin-api \ #开启匿名登录
--web.enable-lifecycle #开启热加载
[Install]
WantedBy=multi-user.target
[root@module prometheus]# systemctl daemon-reload #重新加载配置
[root@module prometheus]# systemctl enable prometheus.service --now #启动程序开机自启
[root@module prometheus]# ss -tunlp |grep 9090 #查看服务是否启动,默认端口是9090
注意:如果环境为虚拟机,通过真机上网要确保时间同步,配置NTP
[root@module prometheus]# timedatectl status #确保设备为上海时区
Local time: Thu 2022-02-17 02:51:54 CST
Universal time: Wed 2022-02-16 18:51:54 UTC
RTC time: Wed 2022-02-16 18:51:54
Time zone: Asia/Shanghai (CST, +0800)
NTP enabled: n/a
NTP synchronized: no
RTC in local TZ: no
DST active: n/a
[root@module prometheus]# yum -y install chrony #安装NTP
[root@module prometheus]# vim /etc/chrony.conf #配置时钟源,我用的阿里源
server ntp1.aliyun.com iburst
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
[root@module prometheus]# systemctl enable chronyd --now #启动NTP并开机自启
[root@module prometheus]# date #查看时间已和真机同步
Wed Feb 16 18:56:20 CST 2022
此时通过浏览器访问:IP:9090 ;确保prometheus正常
3.安装prometheus被控端
软件包可官网也可在以上的网盘里,下载到家目录
[root@module ~]# tar -xf node_exporter-1.3.1.linux-amd64.tar.gz
[root@module ~]# mv node_exporter-1.3.1.linux-amd64 /usr/local/node_exporter
[root@module ~]# vim /lib/systemd/system/node_exporter.service #编写service文件
[Unit]
Description=node_exporter
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/node_exporter/node_exporter
[Install]
WantedBy=multi-user.target
[root@module ~]# systemctl daemon-reload
[root@module ~]# systemctl enable node_exporter.service --now #设置服务并开机自启
[root@module ~]# ss -tunlp |grep 9100 #查看服务是否被监听
[root@module ~]# vim /usr/local/prometheus/prometheus.yml #在行尾添加被控端配置
- job_name: "node"
static_configs:
- targets: ["192.168.1.101:9100"]
4.下载安装grafana
[root@module ~]# wget https://dl.grafana.com/enterprise/release/grafana-enterprise-8.3.6-1.x86_64.rpm #下载GRANAFA软件包
[root@module ~]# yum -y install grafana-enterprise-8.3.6-1.x86_64.rpm #安装RPM包
[root@module ~]# systemctl enable grafana-server.service --now #启动程序并设置开机自启
Created symlink from /etc/systemd/system/multi-user.target.wants/grafana-server.service to /usr/lib/systemd/system/grafana-server.service.
[root@module ~]# ss -tunlp | grep grafana #查看端口并确保服务已启动
tcp LISTEN 0 128 :::3000 :::* users:(("grafana-server",pid=4300,fd=10))
问题1:若无法重置密码,也可以开启匿名访问(默认不操作)
[root@module ~]# vim /etc/grafana/grafana.ini
[auth.anonymous]
enabled = true #是否开启匿名登录
org_role = Admin #使用登录身份:Admin代表管理员
问题2:若界面显示连接失败,在服务器端检查prometheus是否启动
5.安装Alertmanager
下载地址可以选择官网或是上边分享的网盘地址
#我选用的是下载好的包,传到虚拟机中
[root@module ~]# tar -xf 1-prometheus/alertmanager-0.23.0.linux-amd64.tar.gz -C /usr/local/ #解压源码包
[root@module ~]# mv /usr/local/alertmanager-0.23.0.linux-amd64/ /usr/local/alertmanager
#修改目录名称方便管理
[root@module ~]# vim /lib/systemd/system/alertmanager.service #编写systemd文件
[Unit]
Description=Alertmanager for Prometheus
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/alertmanager/alertmanager --config.file=/usr/local/alertmanager/alertmanager.yml --storage.path=/usr/local/alertmanager/data/
Restart=on-failur
ExecStop=/bin/kill -9 $MAINPID
[Install]
WantedBy=multi-user.target
[root@module ~]# systemctl enable alertmanager.service --now #启动程序并开机自启
Created symlink from /etc/systemd/system/multi-user.target.wants/alertmanager.service to /usr/lib/systemd/system/alertmanager.service.
6.配置报警规则
在rules目录中添加.yml后缀文件,prometheus会根据这些规则配置文件进行监控报警;
[root@module ~]# mkdir /usr/local/prometheus/rules
#1.实例存活告警
[root@module ~]# vim /usr/local/prometheus/rules/node_alived.yml
groups: #一个配置文件包含多个组
- name: 实例存活告警规则 #组名
rules: #规则
- alert: 实例存活告警 #警告名称
expr: up == 0 #触发规则
for: 1m #触发持续多久发送警告
labels: #告警标签
user: prometheus
severity: warning
annotations: #告警注释
summary: "主机宕机 !!!"
description: "该实例主机已经宕机超过一分钟了。"
#2.内存报警规则
[root@module ~]# vim /usr/local/prometheus/rules/memory_over.yml
groups:
- name: 内存报警规则
rules:
- alert: 内存使用率告警
expr: (1 - (node_memory_MemAvailable_bytes / (node_memory_MemTotal_bytes))) * 100 > 50
for: 1m
labels:
severity: warning
annotations:
summary: "服务器可用内存不足。"
description: "内存使用率已超过50%(当前值:{{ $value }}%)"
#3.CPU报警
[root@module ~]# vim /usr/local/prometheus/rules/cpu_over.yml
groups:
- name: CPU报警规则
rules:
- alert: CPU使用率告警
expr: 100 - (avg by (instance)(irate(node_cpu_seconds_total{mode="idle"}[1m]) )) * 100 > 50
for: 1m
labels:
severity: warning
annotations:
summary: "CPU使用率正在飙升。"
description: "CPU使用率超过50%(当前值:{{ $value }}%)"
#4.磁盘使用率报警
[root@module ~]# vim /usr/local/prometheus/rules/disk_over.yml
groups:
- name: 磁盘使用率报警规则
rules:
- alert: 磁盘使用率告警
expr: 100 - node_filesystem_free_bytes{fstype=~"xfs|ext4"} / node_filesystem_size_bytes{fstype=~"xfs|ext4"} * 100 > 80
for: 20m
labels:
severity: warning
annotations:
summary: "硬盘分区使用率过高"
description: "分区使用大于80%(当前值:{{ $value }}%)"
热加载配置:curl -X POST http://192.168.1.101:9090/-/reload
7.在客户端创建钉钉机器(我是在windows创建)
设置前自行创建一个项目组
8.下载钉钉插件与修改(使用网盘包)
#1.下载插件并放到服务端
[root@module ~]# tar -C /usr/local/ -zxf /root/prometheus-webhook-dingtalk-1.4.0.linux-amd64.tar.gz #解压钉钉插件包
[root@module ding]# mv /usr/local/prometheus-webhook-dingtalk-1.4.0.linux-amd64 /usr/local/ding #挪到安装目录方便使用
[root@module ding]# cp config.example.yml conf.yml #拷贝模板文件
[root@module ding]# vim conf.yaml
targets:
webhook1:
url: webhook地址 #(复制创建钉钉那个Token)
secret: 加密串
#2.修改prometheus配置文件
[root@module ~]# vim /usr/local/prometheus/prometheus.yml
global: #全局配置
scrape_interval: 15s #默认采集监控数据时间间隔
evaluation_interval: 15s #平均间隔时间
alerting: #报警规则
alertmanagers: #
- static_configs:
- targets:
- 192.168.1.125:9093 #服务端监听端口
rule_files: #指定规则文件
- rules/*.yml
scrape_configs: #监控对象配置
- job_name: "prometheus" #任务名称
static_configs: #监控对象地址
- targets: ["192.168.1.125:9090"]
- job_name: "node"
static_configs:
- targets: ["192.168.1.125:9100"]
#3.修改规则文件
[root@module ~]# vim /usr/local/alertmanager/alertmanager.yml
global: #全局配置项
resolve_timeout: 5m #处理超时时间,默认5分钟
route: #定义路由树信息
group_by: ['alertname','instance'] #报警分组依据
group_wait: 10s #最初等待多久时间发送一组警报通知
group_interval: 10s #发送新警报前的等待时间
repeat_interval: 1h #发送重复警报的周期,对于email配置不能设置过低否则将会由于邮件发>送太多频繁,被smtp服务器拒绝
receiver: 'webhook' #发送警报的接收者的名称
receivers: #定义警报接收者信息
- name: 'webhook' #警报
webhook_configs: #webhook配置
- send_resolved: true #是否开启
url: 'http://192.168.1.125:8060/dingtalk/webhook1/send' #告警webhook地址,告警信息会post到该地址,需>要编写服务接收该告警数据
#一个inhibition规则是在与另一组匹配器匹配的警报存在的条件下,使匹配一组匹配器的警报失效的规则。两个警报必须具有一组相同的标签。
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning' #目标告警状态
equal: ['alertname', 'dev', 'instance']
[root@module ~]# systemctl restart alertmanager.service #重启服务
[root@module ding]# nohup ./prometheus-webhook-dingtalk --config.file="conf.yml" 2>&1 1>dingding.log & #启动程序后台运行退出终端不影响
[root@module ding]# dd if=/dev/zero of=/dev/null #模拟提升CPU使用率,达到报警效果
最终效果 ,若果测试感觉等待时间过长可把alertmanager文改为件repeat_interval: 60s