一、Prometheus 介绍
1. 什么是Prometheus?
Prometheus 是一个开源的监控管理组件。同时,还涉及许多以“explore”命名的客户端数据采集工具以及pushgateway网关。
官网:https://prometheus.io/ 文献:https://prometheus.io/docs/introduction/overview/
2. 各监控系统对比
监控方案 | 数据收集 | 自动发现 | 侧重点 | 数据展示方案 | 贴合云原生 |
---|---|---|---|---|---|
Cacti | SNMP | 插件支持 | 数据展示 | RRDTOOL | 差 |
Nagios | 各种脚本插件 | 脚本插入 | 状态展示 | 阈值 | 差 |
Zabbix | zabbix-agent为主 | 主机地址自动发现 | 状态、数据展示 | PHP | 中等 |
Prometheus | Exporter为主 | 各种模式支持,最为完善 | 以时间序列保存数据 | 通过结合Grafana 进行结合展示 | 优秀 |
- 普罗米修斯与Zabbix的主要区别是什么?
- Prometheus主要依赖于export方式进行数据采集,同时支持自动发现功能,适合用于现代微服务架构的监控。而Zabbix以 Zabbix agent为主,也支持SNMP、GMI等接口,同样具备自动发现能力,但不如Prometheus灵活,Zabbix 适合用于监控传统的 IT 基础设施。此外Prometheus安装简便,只需启动即可开启数据拉取接口,无需额外配置服务器地址。它能自动发现并监控容器内的服务,像Kubernetes集群中的节点,动态调整监控范围,适应容器灵活启动、停止的特点。
- Prometheus的数据存储基于时间序列,采用带时间维度的哈希表或键值对形式存储,不依赖关系型数据库,而Zabbix的数据存储基于关系型数据库,对时间维度的数据处理压力较大。Prometheus的数据增长模式更有利于长期保存和检索,而Zabbix则需面对文本文件过大导致无法打开等问题。
- Prometheus server 端口 是9090 Prometheus export 端口 是9100 Prometheus alertmanager 端口是9093 grafana 端口是 3000 Zabbix server 端口 10051 zabbix agentd 的端口是10050
3. Prometheus的特性
- 由 metric 名称和 K/V 键值对标识的时间序列的多维数据模型
- 简单的查询语言 PromQL(TSDB数据库的查询语言)
- 不依赖分布式存储,单个服务节点自动治理
- 通过 http 的 pull 模型获取数据的时序集合
- 支持通过网关 push 时序数据
- 通过服务发现或者静态配置发现目标
- 支持多种图表和仪表盘模式
- export : 是用来为被监控服务器开放一个数据采集端口的软件,安装在被监控主机上后会启动一个服务,允许Prometheus server端通过该端口拉取数据。
- Prometheus具有自动加载配置文件的功能,无需重启整个服务程序。
4. Prometheus架构图和组件介绍
- Prometheus代理 : 负责采集和暂存数据,然后将数据转发给最终的Prometheus服务器
- service discovery 帮助自动发现存活的被监控主机
**Prometheus Server:**负责定时去目标抓取 metrics数据,每个被抓取对象需要开放一个http服务接口;pull下来的数据经过整理后写入到本地的时序数据库(TSDB)中。
**Client Library:**客户端类库(例如官方提供的:Go,Python,Java等),为需要监控的服务产生相应的 metrics数据并开放一个http服务接口给 Prometheus Server。目前很多软件原生就支持Prometheus,提供了metrics数据,可以直接使用 Prometheus pull。对于像操作系统不提供提供metrics数据的情况,可以使用exporter,或者自己开发exporter来提供metrics数据服务。
**Node Exporter:**泛指能向Prometheus提供监控数据(metrics数据)的都可以称为一个 exporter,是用来为被监控服务器开放一个数据采集端口的软件,安装在被监控主机上后会启动一个服务,允许Prometheus server端通过该端口拉取数据,主要用来支持其他数据源的metrics数据导入到 Prometheus,支持数据库、硬件、消息中间件、存储系统、HTTP服务器、jmx等。
PushGateway:==主要用于保存 short-lived job。==因为这类 jobs 存在时间较短,可能在 Prometheus 来 pull 之前就消失了。对此类 jobs 定时将 metrics数据 push 到 pushgateway 上,再由 Prometheus Server 从 Pushgateway 上 pull 到本地。这种方式主要用于服务层面的metrics,对于机器层面的metrices,需要使用node exporter。
**Promdash 和 Grafana:**Prometheus内置一个简单的Web控制台Promdash,可以查询metrics数据,查看配置信息或者Service Discovery等,实际工作中,查看指标或者创建仪表盘通常使用Grafana,Prometheus作为Grafana的数据源。
alertmanager:以实现对Prometheus产生的告警进行处理,如去重、取消重复告警,避免大量告警信息对管理员造成困扰,并能配置其他报警媒介
**PromQL:**是Prometheus TSDB的查询语言。是结合Grafana进行数据展示和告警规则的配置的关键部分。
5. Prometheus服务工作过程
- Prometheus Daemon负责定时去被监控目标上抓取metrics(指标)数据,每个抓取目标需要暴露一个http服务的接口给它定时抓取。Prometheus支持通过配置文件、文本文件、Zookeeper、Consul、DNS SRV Lookup等方式指定抓取目标。Prometheus采用PULL的方式进行监控,即服务器可以直接通过目标PULL数据或者间接地通过中间网关来Push数据。
- Prometheus 在本地处理抓取到的所有数据,并通过一定规则进行整理数据,并把得到的结果存储到新的时间序列中。
- Prometheus通过PromQL和其他API可视化地展示收集的数据。Prometheus支持很多方式的图表可视化,例如Grafana、自带的Promdash以及自身提供的模版引擎等等。Prometheus还提供HTTP API的查询方式,自定义所需要的输出。
- PushGateway支持Client主动推送metrics到PushGateway,而Prometheus只是定时去Gateway上抓取数据。
- Alertmanager是独立于Prometheus的一个组件,可以支持Prometheus的查询语句,提供十分灵活的报警方式。
6. 实验前准备
1. 由于使用单机模式部署,所有有些软件的安装或者配置的生效需要连接到互联网(通网)
2. 为了方便识别主机身份,可以给主机设置不同的主机名和域名解析(hosts)
3. 要保证服务器之间的时间同步
#时间同步服务器
yum -y install ntp
vim /etc/ntp.conf
#添加以下配置文件
restrict 192.168.90.0 mask 255.255.255.0 nomodify notrap
server 127.127.1.0
fudge 127.127.1.0 stratum 10
systemctl enable --now ntpd
#时间同步客户端
yum -y install ntp
vim /etc/ntp.conf
#添加以下配置文件
server 192.168.90.100 iburst #服务器IP
systemctl enable --now ntpd
ntpdate -u 192.168.90.100 #客户端同步时间命令
#如果有VMware可按照下面的方法
- 为何服务器间的时间同步非常重要?
时间同步对于服务器至关重要,因为许多数据管理任务会附带时间戳和时间指标。时间不一致可能导致数据同步延迟、命令无法执行等问题。
二、Prometheus - Prometheus Server部署
- 下载并安装Prometheus Server服务 Download | Prometheus
# 上传本地Prometheus及相关软件包
$ rz promethues.zip
$ unzip promethues.zip
$ ls -l promethues/
-rw-r--r-- 1 root root 23928771 12月 17 2019 alertmanager-0.20.0.linux-amd64.tar.gz
-rw-r--r-- 1 root root 61032119 12月 17 2019 grafana-6.5.2.linux-amd64.tar.gz
-rw-r--r-- 1 root root 8083296 12月 17 2019 node_exporter-0.18.1.linux-amd64.tar.gz
-rw-r--r-- 1 root root 58625125 12月 17 2019 prometheus-2.14.0.linux-amd64.tar.gz
# 单独解压缩Prometheus软件,完成安装
$ cd prometheus/
$ tar -xf prometheus-2.53.3.linux-amd64.tar.gz
$ tree ./
./
├── console_libraries
│ ├── menu.lib
│ └── prom.lib
├── consoles
│ ├── index.html.example
│ ├── node-cpu.html
│ ├── node-disk.html
│ ├── node.html
│ ├── node-overview.html
│ ├── prometheus.html
│ └── prometheus-overview.html
├── LICENSE
├── NOTICE
├── prometheus # 启动文件
├── prometheus.yml # 配置文件(启动时被调用)
├── promtool
└── tsdb
# Prometheus安装非常简单,解压缩复制到自定义目录下即可,约定成俗的习惯:/usr/local/prometheus
$ cp -r prometheus-2.53.3.linux-amd64 /usr/local/prometheus
- 编写Prometheus service启动脚本
$ cat>/usr/local/prometheus/prometheus.service<<EOF
[Unit]
Description=Prometheus
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/usr/local/prometheus
ExecStart=/usr/local/prometheus/prometheus --config.file=/usr/local/prometheus/prometheus.yml
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
- 添加启动脚本到systemd启动管理中
$ ln -s /usr/local/prometheus/prometheus.service /lib/systemd/system/
$ systemctl daemon-reload
$ systemctl enable --now prometheus
$ systemctl restart prometheus
$ netstat -antp | grep LISTEN | grep :9090
tcp6 0 0 :::9090 :::* LISTEN 37984/prometheus
- 配置文件讲解
# 配置文件(原版未改)
$ vim /usr/local/prometheus/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:
# - 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 it's 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'.
static_configs:
- targets: ['localhost:9090']
# -----------------------------------------------------------------------------------------------
# 配置文件关键词介绍(由于alertmanager、exporter等都未安装,相关配置后面详细讲)
global: # 全局配置 (如果有内部单独设定,会覆盖这个参数)
scrape_interval: 15s
# 全局默认的数据拉取间隔
evaluation_interval: 15s
# 全局默认的规则(主要是报警规则)拉取间隔
scrape_timeout: 10s
# 全局默认的单次数据拉取超时间,默认不开启,当报context deadline exceeded错误时需要在特定的job下配置该字段,注意:scrape_timeout时间不能大于scrape_interval,否则Prometheus将会报错。
alerting: # 告警插件定义,这里会设定alertmanager这个报警插件。
rule_files: # 告警规则,按照设定参数进行扫描加载,用于自定义报警规则(类似触发器trigger),其报警媒介由alertmanager插件实现。
scrape_configs: # 采集配置,配置数据源,包含分组job_name以及具体target,又分为静态配置和服务发现。
- 通过浏览器访问指标数据和图形化界面(效果见下图)
http://192.168.88.10:9090/metrics
http://192.168.88.10:9090/graph
三、Prometheus - Node Exporter部署(客户端和服务器都要装)
类似zabbix的agent可以在服务器和客户端都安装,若需监控操作系统级别的资源(如CPU、内存、磁盘等),则需安装如node exporter这样的专用采集工具,它能通过特定端口9100采集系统资源数据,而不仅仅局限于普罗米修斯软件自身的监控。
- 解压缩并安装Node Exporter
$ tar -xf node_exporter-1.8.2.linux-amd64.tar.gz
$ cp -r node_exporter-1.8.2.linux-amd64 /usr/local/node_exporter
- 编写Node Exporter启动脚本
$ cat>/usr/local/node_exporter/node_exporter.service<<EOF
[Unit]
Description=Node Exporter
After=network.target
Wants=network-online.target
[Service]
Type=simple
User=root
ExecStart=/usr/local/node_exporter/node_exporter
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
- 添加启动脚本到systemd启动管理中
$ ln -s /usr/local/node_exporter/node_exporter.service /lib/systemd/system/
$ systemctl daemon-reload
$ systemctl enable --now node_exporter
$ systemctl restart node_exporter
$ netstat -antp | grep LISTEN | grep :9100
tcp6 0 0 :::9100 :::* LISTEN 38150/node_exporter
注意:以上安装除了在Prometheus Server服务器端安装也可以单独安装在其他被监控节点上
- 配置文件修改(修改Prometheus配置文件实现metrics数据获取和监控开启)
$ vim /usr/local/prometheus/prometheus.yml
# alertmanager 监控区域
alerting:
alertmanagers:
# 指定监控类型为静态配置
- static_configs:
- targets: ['127.0.0.1:9093']
# 指定当前 alertmanager 服务器连接方式
scrape_configs:
# 当前任务名称
- job_name: "prometheus server"
# 当前配置为静态配置,指定 Node_exporter 服务连接方式
static_configs:
- targets: ["192.168.90.107:9090","192.168.90.107:9100"]
# 另一个任务名称
#注意这是在客户端安装node_exporter,才需要配置
- job_name: "linux server"
static_configs:
- targets: ["192.168.90.108:9100"]
$ systemctl restart prometheus
#重启prometheus,加载最新配置
- 效果展示
四、Prometheus - PromQL查询语言
PromQL(Prometheus Query Language)是 Prometheus 自己开发的表达式语言,语言表现力很丰富,内置函数也很多。使用它可以对时序数据进行筛选和聚合。
1. PromQL语法
-
数据类型
PromQL 表达式计算出来的值有以下几种类型:标量&向量:简单来比喻就是标量是一个数字,向量是一组数字!
-
瞬时向量 (Instant vector): 一组时序,每个时序只有一个采样值
-
区间向量 (Range vector): 一组时序,每个时序包含一段时间内的多个采样值
-
标量数据 (Scalar): 一个浮点数
-
字符串 (String): 一个字符串,暂时未用
-
-
时序选择器
2.1 **瞬时向量选择器:**瞬时向量选择器用来选择一组时序在某个采样点的采样值
# 最简单的情况就是指定一个度量指标,选择出所有属于该度量指标的时序的当前采样值。比如下面的表达式 http_requests_total 或 promhttp_metric_handler_requests_total # 可以通过在后面添加用大括号包围起来的一组标签键值对来对时序进行过滤。比如下面的表达式筛选出了 `job` 为 `prometheus`,并且 `group` 为 `canary` 的时序 http_requests_total{ job="prometheus", group="canary"} # 匹配标签值时可以是等于,也可以使用正则表达式。总共有下面几种匹配操作符: = : 完全相等 !=: 不相等 =~: 正则表达式包含匹配 !~: 正则表达式不包含不匹配 # 下面的表达式筛选出了 environment 为 staging 或 testing 或 development,并且 method 不是 GET 的时序: http_requests_total{ environment=~"staging|testing|development",method!="GET"} { }类似sql中的where # 案例:cpu_load数据