Prometheus+Alertmanager+Grafana安装部署简介
[TOC]
一.Prometheus简介
(一).简介
Prometheus(普罗米修斯)是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB)。Prometheus使用Go语言开发,是Google BorgMon监控系统的开源版本。
(二).架构图
1.Prometheus架构图
2.altermanager架构图
(三).相关组件
Prometheus 由多个组件组成,但是其中许多组件是可选的;
1.Prometheus Server:用于收集指标和存储时间序列数据,并提供查询接口
2.Client Library:客户端库为需要监控的服务产生相应的metrics 并暴露给 Prometheus Server。
3.Push Gateway:主要用于临时性的 jobs。
4.Exporter:用于暴露已有的第三方服务的 metrics 给 Prometheus。
5.Alertmanager:从Prometheus server端接收到alerts 后,会进行去除重复数据,分组,并路由到对收的接受方式,发出报警。
6.Web UI:Prometheus 内置一个简单的Web控制台,可以查询指标,查看配置信息或者Service Discovery等。
(四).基本原理
Prometheus 的基本原理是通过 HTTP 协议周期性抓取被监控组件的状态,任意组件只要提供对应的 HTTP 接口就可以接入监控。不需要任何 SDK 或者其他的集成过程。
这样做非常适合做虚拟化环境监控系统,比如 VM、Docker、Kubernetes 等。
输出被监控组件信息的HTTP接口被叫做 exporter 。
目前互联网公司常用的组件大部分都有 exporter 可以直接使用。
比如Varnish、Haproxy、Nginx、MySQL、Linux 系统信息(包括磁盘、内存、CPU、网络等等)。
(五).Prometheus数据格式
1.1 收集数据
监控概念:白盒监控、黑盒监控
白盒监控:自省方式,被监控端内部,可以自己生成指标,只要等待监控系统来采集时提供出去即可。
黑盒监控:对于被监控系统没有侵入性,对其没有直接"影响",这种类似于基于探针机制进行监控(snmp协议)。
Prometheus支持通过三种类型的途径从目标上"抓取(Scrape)"指标数据(基于白盒监控)。
Exporters:工作在被监控端,周期性的抓取数据并转换为pro兼容格式等待prometheus来收集,自己并不推送
Instrumentation:指被监控对象内部自身有数据收集、监控的功能,只需要prometheus直接去获取
Pushgateway:短周期5s-10s的数据收集
1.2 Prometheus存储
Prometheus 存储的是时序数据:即按相同时序(相同名称和标签),以时间维度存储连续的数据的集合。
1.时序:是由名称(Metric)以及一组key/value标签定义的,具有相同的名字以及标签属于相同时序。
2.metric名字:表示需要记录的数据的名称以及数据类型,如http_request_total。
3.标签:用来表示一类资源,例如:同一个集群可以使用同一个标签,就可以通过标签获取到整个集群的同一个指标。
4.指标值:按照某个时序以时间维度采集的数据,称之为样本。实际的时间序列,每个序列包括一个float64的值和一个毫秒级的unix时间戳。
1.3 四种指标类型
1.Counter (计算器):单调递增的指标,即只增不减,除非监控系统发生了重置。
2.Gauge(仪表盘):可以任意变化的指标,即可增可减。
3.Histogram(直方图):在一段时间范围内对数据进行采样,并将其计入可配置的存储桶中,后续可通过指定区间筛选样本,也可以统计样本总数,最后一般将数据展示为直方图。
4.Summary(摘要):Histogram 类似类型,用于表示一段时间内的数据采样结果(通常是请求持续时间或响应大小等),但它直接存储了分位数(通过客户端计算,然后展示出来),而不是通过区间计算。
5.Histogram 与 Summary 的异同:它们都包含了_sum和_count 指标 Histogram 需要通过_bucket来计算分位数,而 Summary 则直接存储了分位数的值。
二.安装环境
环境 | 版本 | 备注 |
os | Centos7.9 | 系统环境 |
go | v1.18 | 依赖软件版本 |
prometheus | v2.37.0 | 主软件版本 |
alertmanager | v0.24 | 主软件版本 |
grafana | v9.0.5 | 主软件版本 |
三.安装部署
(一).Prometheus 安装部署
1.下载 prometheus
cd /usr/local
wget https://github.com/prometheus/prometheus/releases/download/v2.37.0/prometheus-2.37.0.linux-amd64.tar.gz
2.解压
tar -zxvf prometheus-2.37.0.linux-amd64.tar.gz
mv prometheus-2.35.0.linux-amd64 prometheus
3.配置文件
cat /usr/local/prometheus/prometheus.yml
# my global config
global:
// 默认情况下,每15s拉取一次目标采样点数据。
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
// 每15秒评估一次规则。默认值为每1分钟。
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
# A scrape configuration containing exactly one endpoint to scrape:
# Here its Prometheus itself.
scrape_configs:
// job名称会增加到拉取到的所有采样点上,同时还有一个instance目标服务的host:port标签也会增加到采样点上
- job_name: 'prometheus'
# 覆盖global的采样点,拉取时间间隔5s
scrape_interval: 5s
static_configs:
- targets: ['192.168.0.184:9090']
//两种写法,第一种在配置文件中添加node,需要重启服务;
- job_name: 'linux'
static_configs:
- targets: ["192.168.1.165:9182","192.168.1.94:9182","192.168.1.97:9182","192.168.1.183:9182","192.168.1.131:9182","192.168.1.57:9182","192.168.1.31:9182","192.168.1.127:9182"] //多个用,分开
- job_name: 'linux'
//第二种写法只需要指定加载配置文件
file_sd_configs:
// 配置去指定⽬录下找配置job的配置⽂件,这样就可以是添加新的job之后,不需要重启或者重新加载
- files: ['/usr/local/prometheus/job_etc/*.yml']
//到这个⽬录下找
//每隔5s去上⾯的路径下扫描新的配置⽂件
refresh_interval: 5s
- job_name: 'kafka'
static_configs:
- targets:
- 10.100.2.4:9308 //kafka_export的地址
- job_name: 'Windows'
static_configs:
- targets: ["192.168.1.165:9182","192.168.1.94:9182","192.168.1.97:9182","192.168.1.183:9182","192.168.1.131:9182","192.168.1.57:9182","192.168.1.31:9182","192.168.1.127:9182"]
labels:
server_type: 'windows'
relabel_configs:
- source_labels: [__address__]
target_label: instance
cat /usr/local/prometheus/job_etc/node.yml
- labels:
motring: node
- targets:
- "192.168.1.165:9182","192.168.1.94:9182","192.168.1.97:9182","192.168.1.183:9182","192.168.1.131:9182","192.168.1.57:9182","192.168.1.31:9182","192.168.1.127:9182"
4.启动prometheus
cd /usr/lib/systemd/system
vim prometheus.service
[Unit]
Description=https://prometheus.io
[Service]
Restart=on-failure
ExecStart=/usr/local/prometheus/prometheus \
--config.file=/usr/local/prometheus/prometheus.yml \
--storage.tsdb.path=/data/prometheus/data \
--storage.tsdb.retention.time=100y \
--rules.alert.for-grace-period=10s \
--rules.alert.resend-delay=5s \
--log.level=error \
--web.listen-address=192.168.0.184:9090
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl start prometheus.service
//或者
nohup /usr/local/prometheus/prometheus --config.file=/usr/local/prometheus/prometheus.yml 2>&1 1>/data/logs/prometheus.log &
访问界面如下图:
在Status-Targets里查看本机的监控状态及node节点
(二).Grafana安装部署
1.下载grafana
vim /etc/yum.repos.d/grafana.repo
[grafana]
name=grafana
baseurl=https://packages.grafana.com/enterprise/rpm
repo_gpgcheck=1
enabled=1
gpgcheck=1
gpgkey=https://packages.grafana.com/gpg.key
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
2.安装grafana
yum install grafana-enterprise -y
3.启动服务
systemctl start grafana-server.service
systemctl enable grafana-server.service
(三).Alertmanager安装部署
1.下载安装包
wget https://github.com/prometheus/alertmanager/releases/download/v0.24.0/alertmanager-0.24.0.linux-amd64.tar.gz
2.解压
tar xvf -C /usr/local/ alertmanager-0.24.0.linux-amd64.tar.gz
mv alertmanager-0.24.0.linux-amd64 alertmanager
3.创建配置文件
cat /usr/local/alertmanager/alertmanager.yml
lobal:
resolve_timeout: 5m
smtp_smarthost: 'smtp.qq.com:465'
smtp_from: 'monitor@test.com'
smtp_auth_username: 'xxx@xxx.com'
smtp_auth_password: 'dawfaswdawdawf+L4'
smtp_require_tls: false
templates:
- 'tmpl/*.tmpl'
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 1m
receiver: 'email'
receivers:
- name: 'email'
email_configs:
- to: 'xx@xxx.com'
4.编辑系统启动脚本
vi /usr/lib/systemd/system/alertmanager.service
Description=alertmanager
[Service]
ExecStart=/usr/local/alertmanager/alertmanager --config.file=/usr/local/alertmanager/alertmanager.yml --storage.path=/usr/local/alertmanager/data --web.listen-address=192.168.0.184:9093 --data.retention=120h
Restart=on-failure
[Install]
WantedBy=multi-user.target
(四).Linux安装node_exporter
prometheus⽀持的客户端exporter列表:
https://prometheus.io/download
1.下载node
cd /usr/local
wget https://github.com/prometheus/node_exporter/releases/download/v1.1.2/node_exporter-1.1.2.linux-amd64.tar.gz
2.解压node
tar -zxvf node_exporter-1.1.2.linux-amd64.tar.gz
mv node_exporter-1.1.2.linux-amd64/ node_exporter
3.启动
vim /usr/lib/systemd/system/node_exporter.service
[Unit]
Description=node_exporter
After=network.target
[Service]
ExecStart=/usr/local/node_exporter/node_exporter
Restart=on-failure
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl start node_exporter
(五).Kafka集群安装kafka_exporter
* 监控kafka集群时只需要在其中一台上安装Kafka_Exporter
1.下载
wget https://github.com/danielqsj/kafka_exporter/releases/download/v1.4.2/kafka_exporter-1.4.2.linux-amd64.tar.gz
2.解压
tar xf kafka_exporter-1.4.2.linux-amd64.tar.gz -C /usr/local
mv kafka_exporter-1.4.2.linux-amd64 kafka_exporter
3.启动
vim /usr/lib/systemd/system/kafka_exporter.service
[Unit]
Description=kafka_exporter
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/kafka_exporter/kafka_exporter --kafka.server=10.100.2.4:9092 --web.listen-address=10.100.2.4:9308 --zookeeper.server=10.100.2.4:2181
[Install]
WantedBy=multi-user.target
4.systemctl start kafka_exporter
systemctl enable kafka_exporter
(六).Win客户端安装windows_exporter
* 下载后双击运行,端口为9182
https://github.com/prometheus-community/windows_exporter/releases/download/v0.20.0/windows_exporter-0.20.0-amd64.msi
四.页面配置
访问页面如图所示:
默认用户名密码:admin\admin
点击Configuration -> Data Sources ->add data source -> Prometheus
配置添加 Prometheus 的 ip
导入监控Dashboard
输入模版id,通过 https://grafana.com/grafana/dashboards 中获取
展示界面如图所示
至此,Prometheus+Grafana 安装部署部分完毕。
五.告警配置
- prometheus配合alertmanager这个组件报警,报警规则需要手动编写,这需要对prometheus+alertmanager有一定的了解
- grafana配合SaaS模式的云告警平台onealert报警,onealert也是需要时间熟悉的
- grafana+email配置报警
这里介绍两种告警方式:grafana+email配置报警方式以及prometheus+alertmanager组件报警方式
(一).Grafana+Email配置报警
1.1 Grafana配置
vim /etc/grafana/grafana.ini
[smtp]
enabled = true # 改成true
//发送服务器地址和端口
host = smtp.exmail.qq.com:465
// 这里填写发件邮箱
user =
// 这里填写发件邮箱密码或授权密码
password =
// 改成true
skip_verify = true
// 这里填写发件邮箱
from_address =
//重启grafana
systemctl restart grafana-server.service
1.2 页面配置
告警页面配置选项解释如图所示:
选中通知渠道-创建通知方式,填写告警名称,收件人邮箱,测试告警
收到测试邮件
创建告警规则使用告警通道
创建告警通道匹配规则,点击添加
配置告警策略,这里找到主机的cpu监控项:
点击edit,进入编辑页面,创建 alert rule
设置报警规则:
设置所有IP地址是10.101开头的服务器,cpu使用率最新的参数超过80%阈值,30s检查一次,
持续一分钟都超过告警阈值,则触发告警。
(二).Prometheus+Alertmanager配置告警
1.1 创建配置文件
//创建rules⽬录⽤于存放,⼿动创建规则的配置⽂件
mkdir -p /usr/local/prometheus/rules
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 # Evaluate rules every 15 seconds. The
default is every 1 minute.每个多久检查⼀次报警规则。如果发⽣更改并出发,使⽤
//新规则⽣成报警
# scrape_timeout is set to the global default (10s).
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
- 192.168.0.184:9093 // 指定alertmanagers的服务地址个端⼝
# Load rules once and periodically evaluate them according to the
global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
- "rules/*.yml"
# A scrape configuration containing exactly one endpoint to scrape:
# Here its Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: "prometheus"
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
scrape_interval: 5s
static_configs:
- targets: ["localhost:9100"]
- job_name: 'linux'
static_configs:
- targets: ["192.168.2.110:9100","192.168.2.129:9100","192.168.0.59:9100","192.168.2.116:9100","192.168.2.254:9100","192.168.2.120:9100","192.168.2.208:9100","192.168.2.216:9100","192.168.2.25:9100","10.100.2.4:9100","10.100.2.162:9100","10.100.2.38:9100"]
- job_name: 'kafka'
static_configs:
- targets:
- 10.100.2.4:9308
- job_name: 'Windows'
static_configs:
- targets: ["192.168.1.165:9182","192.168.1.94:9182","192.168.1.97:9182","192.168.1.183:9182","192.168.1.131:9182","192.168.1.57:9182","192.168.1.31:9182","192.168.1.127:9182"]
labels:
server_type: 'windows'
relabel_configs:
- source_labels: [__address__]
target_label: instance
1.2 服务器告警配置文件
cat /usr/local/prometheus/rules/node_alerts.yml
groups:
//设置告警名,自定义
- name: node_instance
rules:
//设置只检测ip开头为10、192网段的地址
- alert: InstanceDown
//设置只检测ip开头为10、192网段的地址
expr: up{instance=~"10|192.*"} == 0
//设置告警时间为1分钟。
for: 1m
labels:
//设置告警等级
severity: critical
annotations:
//设置描述信息,{{ $labels.instance }}表示数据来源及端口。如 192.168.111.1主机down掉了,此>处就会显示192.168.111.1:9100
description: Host {{ $labels.instance }} Down
//详细的告警信息,自定义。
summary: Host {{ $labels.instance }} of {{ $labels.job }} is Down !!!
//设置cpu使用告警参数选项,该处名字自定义。
- name: cpu_used
rules:
//自定义告警类型名
- alert: Cpu_used_Hight
//定义CPU使用率高于90%时告警,CPU使用>率和uptime中看到的CPU负载有一定的差距。
expr: 100 - ((avg by (instance,job,env)(irate(node_cpu_seconds_total{mode="idle"}[30s]))) *100) > 90
for: 1m
labels:
severity: critical
annotations:
description: Host {{ $labels.instance }} Excessive Cpu utilization
summary: Host {{ $labels.instance }} of {{ $labels.job }} Excessive Cpu utilization !!!
- name: mem_used
rules:
- alert: Men_used_Hight
//设置内存使用率高于90时发送告警,计算方式为 总内存-空闲内存 - buffers - cached
expr: ((node_memory_MemTotal_bytes -(node_memory_MemFree_bytes+node_memory_Buffers_bytes+node_memory_Cached_bytes) )/node_memory_MemTotal_bytes ) * 100 > 90
for: 1m
labels:
severity: critical
annotations:
description: Host {{ $labels.instance }} Excessive Memory utilization
summary: Host {{ $labels.instance }} of {{ $labels.job }} Excessive Memory utilization !!!
- name: disk_used
rules:
- alert: Disk_used_Hight
//设置挂载分区使用率为90以上时告警
expr: 100 - (node_filesystem_free_bytes{fstype=~"ext3|ext4|xfs"} / node_filesystem_size_bytes{fstype=~"ext3|ext4|xfs"} * 100) > 90
for: 1m
labels:
severity: critical
annotations:
description: Host {{ $labels.instance }} Excessive Disk utilization
summary: Host {{ $labels.instance }} of {{ $labels.job }} Excessive Disk utilization !!!
1.3 kafka集群告警配置文件
cat /usr/local/prometheus/rules/kafka.yml
groups:
- name: kafka服务监控
rules:
- alert: kafka消费滞后
expr: sum(kafka_consumergroup_lag{topic!="sop_free_study_fix-student_wechat_detail"}) by (consumergroup, topic, job) > 50000
for: 3m
labels:
severity: 严重告警
annotations:
summary: "{{$labels.instance}} kafka消费滞后({{$.Labels.consumergroup}})"
description: "{{$.Labels.topic}}消费滞后超过5万持续3分钟(当前{{$value}})"
- alert: kafka集群节点减少
expr: kafka_brokers < 3 #kafka集群节点数3
for: 3m
labels:
severity: 严重告警
annotations:
summary: "kafka集群部分节点已停止,请尽快处理!"
description: "{{$labels.instance}} kafka集群节点减少"
- alert: emqx_rule_to_kafka最近五分钟内的每秒平均变化率为0
expr: sum(rate(kafka_topic_partition_current_offset{topic="emqx_rule_to_kafka"}[5m])) by ( instance,topic,job) ==0
for: 5m
labels:
severity: 严重告警
annotations:
summary: "{{$labels.instance}} emqx_rule_to_kafka未接收到消息"
description: "{{$.Labels.topic}}emqx_rule_to_kafka持续5分钟未接收到消息(当前{{$value}})"
1.4 配置 Alertmanager
vim alertmanager.yml
global:
//解析超时时间
resolve_timeout: 5m
#email的服务器地址
smtp_smarthost: 'smtp.exmail.qq.com:465'
smtp_from: 'email——username'
smtp_auth_username: 'email——username'
smtp_auth_password: 'password'
smtp_require_tls: false
route:
//采⽤哪个标签作为分组的依据
group_by: ['alertname']
//分组等待的时间
group_wait: 30s
//发送告警的间隔时间
group_interval: 10s
//重复发送告警时间
repeat_interval: 30s
//定义谁来通知报警
receiver: 'mail'
receivers:
//使⽤上⾯指定的mail⽅式来给指定的⽤户发信息。
- name: 'mail'
email_configs:
//邮件接收者
- to: 'senf_to_email_username'