官网:https://prometheus.io
Prometheus 是什么
Prometheus 是一个开源的系统监控和报警工具,专注于记录和存储时间序列数据(time-series data)。它最初由 SoundCloud 开发,并已成为 CNCF(云原生计算基金会) 的一个顶级项目。Prometheus 被广泛用于监控各种服务、应用程序和基础设施的性能和健康状况。
Prometheus 的特点
时间序列数据存储:
- Prometheus 以时间序列的形式存储所有数据,即数据点根据时间顺序记录。每个时间序列由一组唯一标识的标签(labels)标识,可以帮助灵活地查询和筛选数据。
多维度数据模型:
- 使用标签来区分不同的数据点,提供多维度的数据模型。这使得用户可以基于不同的维度(例如主机名、服务名称、请求路径等)来聚合和分析数据。
拉取模式(Pull):
- Prometheus 通过 HTTP 定期拉取(scrape)监控目标所暴露的指标数据。这种方式与传统的推送模式不同,有助于 Prometheus 控制对监控目标的访问和数据采集。
PromQL 查询语言:
- Prometheus 提供了强大的查询语言 PromQL,用于实时查询和分析时间序列数据。PromQL 支持聚合、过滤、计算和可视化数据,是 Prometheus 的核心组件之一。
易于集成:
- Prometheus 提供了许多现成的Exporter,用于集成和监控常见的应用程序、数据库、操作系统等(如 MySQL、Redis、Node Exporter 等)。
- 你还可以编写自定义的 Exporter 或直接在应用程序中集成 Prometheus 客户端库,暴露自定义的应用程序指标。
Alertmanager 报警管理:
- Prometheus 配备了一个独立的组件 Alertmanager,用于处理报警。它支持配置报警规则,当监控的数据满足特定条件时,自动触发报警,并可以通过邮件、Slack、PagerDuty、钉钉机器人、企业微信机器人 等渠道发送通知。
自包含的存储:
- Prometheus 使用自己的本地存储来保存采集到的监控数据,并为这些数据提供高效的压缩和存储机制。虽然它也支持通过远程存储系统进行数据的持久化。
云原生和容器支持:
- Prometheus 与容器化环境和微服务架构非常契合,特别是在 Kubernetes 生态系统中,Prometheus 已成为首选的监控解决方案之一。
Prometheus 的组件
1. Prometheus Server
- 核心组件,负责数据采集、存储和查询。
- 主要任务是定期从被监控的目标中拉取(scrape)指标数据,并将这些数据存储为时间序列。
- 支持 PromQL 查询语言,用户可以使用 PromQL 进行复杂的数据查询和分析。
2. Exporters
- Exporters 是 Prometheus 生态中用于暴露指标数据的组件。
- 各种 Exporter 将系统、服务或应用的内部状态转换为 Prometheus 格式的指标数据,供 Prometheus server 拉取。
- 常见的 Exporters:
- Node Exporter:监控操作系统级别的指标(CPU、内存、磁盘、网络等)。
- MySQL Exporter:用于暴露 MySQL 数据库的性能指标。
- Redis Exporter:暴露 Redis 的运行状况。
- Blackbox Exporter:用于监控服务的可达性,通过 HTTP、DNS 等协议进行探测。
- 如果没有现成的 Exporter,开发者可以通过客户端库来编写自定义 Exporter。
3. Pushgateway
- Pushgateway 是 Prometheus 的辅助组件,用于那些无法被 Prometheus 定期拉取的短生命周期任务(如批处理任务、临时作业)上传指标数据。
- 这些任务将指标数据推送到 Pushgateway,Prometheus 再从 Pushgateway 拉取这些数据。
4. Alertmanager
- Alertmanager 是 Prometheus 的报警管理组件,负责处理 Prometheus 服务器生成的报警。
- 它可以根据报警规则处理报警事件,并将报警通知通过邮件、Slack、PagerDuty、Webhook、钉钉机器人、企业微信机器人 等发送给相关人员或系统。
- 支持报警的分组、抑制和去重,以减少不必要的报警。
5. Prometheus Client Libraries
- Prometheus 提供多种语言的客户端库,用于帮助开发者将自定义应用程序的内部状态暴露为指标数据。
- 主要的客户端库支持以下语言:
- Go:
prometheus/client_golang
- Java / Scala:
prometheus/client_java
- Python:
prometheus/client_python
- Ruby:
prometheus/client_ruby
- 这些库帮助开发者定义、注册和暴露应用程序的自定义指标。
6. Service Discovery
- Prometheus 提供了服务发现机制,用于自动发现和监控动态环境中的目标(如 Kubernetes 集群中的容器、服务、Pods 等)。
- 支持多种服务发现机制,如静态配置、Kubernetes、Consul、EC2、GCE、DNS 等,自动更新监控目标列表,无需手动配置。
7. PromQL (Prometheus Query Language)
- PromQL 是 Prometheus 用来查询和分析时间序列数据的语言。
- 支持过滤、聚合、计算和转换时间序列数据,用于生成复杂的查询结果和报警规则。
- PromQL 是 Prometheus 核心的查询工具,用户可以根据不同维度灵活地分析指标数据。
8. Storage(存储)
- Prometheus 提供内置的时间序列数据库,用于高效存储监控数据。
- 本地存储主要用于短期存储,但 Prometheus 也支持远程存储接口,可以将数据发送到外部存储系统(如 Thanos、Cortex 或其他分布式存储)进行长期保存。
9. Grafana(可视化工具,非 Prometheus 的内置组件,但常与 Prometheus 搭配使用)
- 虽然 Grafana 不是 Prometheus 的核心组件,但它通常与 Prometheus 集成,用于可视化监控数据。
- Grafana 支持通过 PromQL 从 Prometheus 中查询数据并以丰富的图表和仪表盘形式展示出来。
10. Remote Storage Integrations
- Prometheus 支持将数据通过远程存储接口发送到其他存储后端,以便进行长期存储和高可用性管理。
- 常见的远程存储系统包括 Thanos 和 Cortex,它们允许对 Prometheus 数据进行扩展、持久化和查询。
11. Prometheus Rule Files(报警和记录规则)
- Prometheus 支持通过规则文件定义报警和记录规则。
- 报警规则允许用户基于 PromQL 进行指标分析,并生成报警条件。
- 记录规则则可以预先计算某些复杂的查询,以减少每次查询的计算量,提升性能。
Prometheus 的指标
什么是 Prometheus 指标
指标(Metric) 是用来记录和表示监控数据的基本单位。它们是 Prometheus 数据模型的核心组成部分,用于存储和检索有关系统和应用程序性能的信息。每个指标通常由一组数据点组成,这些数据点按照时间序列进行存储和管理。
指标的组成
名称(Name)
- 每个指标都有一个唯一的名称,用于标识和引用。例如:http_requests_total、cpu_usage_seconds_total。
类型(Type)
- 指标有不同的类型,每种类型用于记录不同类型的数据。主要类型包括 Counter、Gauge、Histogram、Summary 和 Untyped。
标签(Labels)
- 标签是附加到指标上的键值对,用于提供额外的上下文信息。标签允许对同一指标的不同实例进行分类和过滤。例如:method="GET"、status="200"。标签可以用来区分和聚合不同的度量数据。
值(Value)
- 指标的实际数据值。例如:一个计数器的值可能是 1500,表示从启动到当前时间,已处理的 HTTP 请求总数。
时间戳(Timestamp)
- 每个数据点都有一个时间戳,用于记录该数据点的生成时间。在 Prometheus 中,时间戳是由 Prometheus 服务器在抓取数据时自动添加的。
指标的类型
Counter(计数器)
- 定义:表示累积的、单调递增的值。计数器只能增加,不能减少。
- 用途:用于跟踪事件发生的总次数,如 HTTP 请求的总数、处理的任务数量、错误发生的次数。
Gauge(仪表)
- 定义:表示一个随时间变化的值,可以增加或减少。适合表示瞬时的状态。
- 用途:用于跟踪瞬时值,如当前温度、内存使用量、当前队列长度等。
Histogram(直方图/柱状图)
- 定义:用于记录一组值的分布。它可以将数据划分为多个桶(buckets),每个桶记录符合该范围的事件数量。
- 用途:用于跟踪数据的分布情况和计算聚合统计量,如请求响应时间、请求大小等。
Summary(摘要)
- 定义:用于记录一组值的分布,同时提供总计数和总和。它类似于直方图,但直接提供了数据的总和和平均值(百分比提供)。
- 用途:用于跟踪数据分布,并计算聚合统计量,如请求响应时间的平均值、总时间等。
Untyped(无类型)
- 定义:表示没有特定类型的指标。通常用于在没有明确类型的情况下暴露数据。
- 用途:通常用于特定场景下的临时指标,或用于与 Prometheus 无直接关联的系统。
指标示例
# HELP http_requests_total The total number of HTTP requests.
# TYPE http_requests_total counter
http_requests_total{method="GET", status="200"} 1500 1825690710
http_requests_total{method="POST", status="404"} 200 1824472505
- # HELP 指标的一般注释信息,帮助用户理解该指标的用途
- # TYPE 指标的类型注释信息,告诉 Prometheus 如何处理该指标
- 样本
说明:
- 在这个1825690710时间戳到达时,共有 1500 次
GET
请求返回了状态码200
。- 在这个1824472505时间戳到达时,共有 200 次
POST
请求返回了状态码404
。
Prometheus 的使用场景
- 应用程序监控:监控应用程序的性能指标,如请求量、错误率、响应时间等。
- 基础设施监控:监控服务器的 CPU、内存、磁盘和网络等资源使用情况。
- 容器和编排系统监控:监控 Docker 容器和 Kubernetes 集群的运行状况。
- 数据库监控:跟踪数据库的性能,如慢查询、连接数等。
Prometheus 的安装
前置安装 Golang环境,安装教程:https://blog.csdn.net/a1053765496/article/details/129362520
下载 Prometheus,https://prometheus.io/download/
把下载的 prometheus-2.54.1.linux-amd64.tar.gz 安装包上传到 linux 服务器的 /usr/local 目录下
# 解压
tar -zxvf prometheus-2.54.1.linux-amd64.tar.gz
# 解压后的文件夹重命名
mv prometheus-2.54.1.linux-amd64 prometheus
启动 Prometheus
cd /usr/local/prometheus
./prometheus --config.file=prometheus.yml
# 守护进程启动
nohup ./prometheus --config.file=prometheus.yml > prometheus.log 2>&1 &
如果服务正常运行,可以通过浏览器访问 Prometheus 的 Web UI,默认在端口 9090。在浏览器中访问:http://localhost:9090 // 记得防火墙放开 9090 端口
停止 Prometheus
ps aux | grep prometheus
# 或
pgrep prometheus
kill -9 <PID>
Prometheus 的 Web UI 面板介绍
Prometheus 目录结构介绍
- console_libraries:录用于存储 Prometheus 的控制台模板使用的库文件
- consoles:目录是 Prometheus 中存放控制台页面模板的目录,用于通过 Web 界面展示监控数据。
- data:用于存储Prometheus的磁盘持久化数据。
- LICENSE:Prometheus的许可证文件。
- NOTICE:版权声明文件。
- prometheus:Prometheus 主程序的二进制文件,负责抓取指标、存储时间序列数据、提供查询接口等核心功能。
- promtool:Prometheus 的工具程序,主要用于验证配置文件和规则文件是否正确。
- prometheus.yml:配置文件,定义抓取目标(scrape_configs)、告警规则(alerting)以及全局设置(global 等)。这个文件是 Prometheus 的核心配置,所有的监控目标、数据拉取频率、告警规则都在这里定义。
Prometheus 配置信息介绍
prometheus.yml 文件配置的介绍
# 全局配置
global:
scrape_interval: 15s # 抓取间隔(默认是1分钟),每 scrape_interval 从 targets 抓取一次指标
scrape_timeout: 10s # 抓取超时时间,默认为 scrape_interval 的值,scrape_timeout的值要比scrape_interval小
evaluation_interval: 15s # 规则评估的频率(如告警规则、记录规则),默认是1分钟
external_labels: # 为所有时间序列数据附加的标签,通常用于多集群或高可用架构。
region: 'us-east'
prometheus: 'prometheus-main'
# 告警配置
alerting:
alertmanagers:
- follow_redirects: true # 是否 HTTP 重定向
enable_http2: true # 是否启用 HTTP/2 协议以提高通信性能。
scheme: http # 定义与 Alertmanager 通信时使用的协议,这里是 http,也可以是 https。
timeout: 10s # 定义 Prometheus 连接到 Alertmanager 的超时时间,10 秒表示 Prometheus 在 10 秒内无法连接时超时。
api_version: v2 # 设置使用的 Alertmanager API 版本,v2 是最新的稳定版本。
static_configs: # 定义 Alertmanager 实例的静态目标
- targets: ['localhost:9093'] # Alertmanager 的地址(IP 和端口)。
# 规则配置,并根据全局的evaluation_interval定期对它们进行评估。
rule_files:
- "rules.yml" # 定义 Prometheus 规则文件的路径
# Prometheus 最重要的配置,用于定义 Prometheus 从哪些地方抓取指标以及如何抓取。
scrape_configs:
- job_name: 'example' # 抓取任务的名称。一个 job 可以包含多个抓取目标。可以随意命名
honor_timestamps: true # 是否启用尊重目标提供的时间戳。如果为 true,Prometheus 将使用目标提供的时间戳,而不是抓取时间的时间戳。
track_timestamps_staleness: false # 如果设置为 true,Prometheus 将为没有更新的时间序列创建“陈旧”标记。这里设置为 false,表示不会主动跟踪陈旧时间序列
scrape_interval: 10s # 此抓取目标的抓取间隔,覆盖全局设置
scrape_timeout: 5s # 此目标的抓取超时时间,覆盖全局设置
metrics_path: '/actuator/prometheus' # 指定指标路径
scheme: http # 指定抓取数据使用的协议,这里是 http,如果目标使用 https,需要配置为 https
enable_compression: true # 启用数据抓取的压缩,以减少网络传输的数据量
follow_redirects: true # 允许 Prometheus 在抓取过程中跟随 HTTP 重定向
enable_http2: true # 启用 HTTP/2 协议,这通常可以提高抓取性能
static_configs: # 静态抓取目标配置,手动定义要抓取的目标(IP 或主机名及端口)
- targets: ['localhost:9090'] # 要抓取的目标列表(静态配置)
labels: # 为该抓取目标添加的额外标签,这些标签将附加到抓取的数据中。
group: 'production'
- job_name: 'kubernetes' # k8s 服务发现
kubernetes_sd_configs: # 自动发现 Kubernetes 的服务或 pod
- role: pod # 定义要发现的资源类型,例如 pod 或 service
# 将数据远程写入其他存储系统
remote_write:
- url: "http://remote-prometheus:9090/api/v1/write"
# 从其他存储系统中读取数据。
remote_read:
- url: "http://remote-prometheus:9090/api/v1/read"
# 抓取目标数据时,对标签进行动态修改的过程。可以用于过滤、修改、删除或添加标签。
relabel_configs:
- source_labels: [__address__] # 从哪些标签中提取值进行 relabel。
regex: '(.*):9090' # 正则表达式,用于匹配和提取标签值。
target_label: 'instance' # 重命名或修改后的标签名。
replacement: '$1' # 匹配后用来替换的内容。
# 和 relabel_configs 类似,但它应用于抓取数据后的时间序列上,而非抓取目标本身
metric_relabel_configs:
- source_labels: [__name__]
regex: 'http_requests_total'
action: drop # 定义如何处理匹配的指标。drop 表示删除匹配的指标,keep 表示保留。
# 数据存储配置
storage.tsdb:
path: "/prometheus" # 本地存储路径
retention_time: 15d # 数据保留时间
wal_compression: true # 启用 WAL(Write-Ahead Log)压缩,减小存储占用
# HTTP 服务配置,包含 Web 界面和 API。
web:
listen_address: ":9090" # Prometheus Web 服务监听的地址和端口
external_url: "http://my-prometheus.com/" # 对外提供访问的 URL
# 允许你配置 Prometheus 的运行时行为,控制内存管理和其他与性能相关的参数
runtime:
gogc: 75 # 设置 GO语言的垃圾收集器(gc)触发频率,75 表示内存使用量达到75%时执行垃圾回收。
Prometheus 监控 Linux 服务器
监控系统级指标,包括 CPU 使用率、内存使用情况、磁盘使用情况、网络流量等。
需要监控哪台服务器?就把 node_exporter 在那台服务器上安装并运行。
下载 node_exporter,https://prometheus.io/download/
把下载的 node_exporter-1.8.2.linux-amd64.tar.gz 安装包上传到 linux 服务器的 /usr/local 目录下
# 解压
tar -zxvf node_exporter-1.8.2.linux-amd64.tar.gz
# 解压后的文件夹重命名
mv node_exporter-1.8.2.linux-amd64 node_exporter
启动 node_exporter
node_exporter 的默认端口是 9100
cd /usr/local/node_exporter
./node_exporter
# 守护进程启动
nohup ./node_exporter > node_exporter.log 2>&1 &
访问: http://localhost:9100/metrics 可以查看 node_exporter 的指标
配置 Prometheus 抓取 node_exporter 的数据
在 prometheus.yml
配置文件中添加 node_exporter
作为抓取目标:
scrape_configs:
- job_name: 'node_exporter'
static_configs:
- targets: ['localhost:9100'] # node_exporter服务所在的路径
重启 prometheus 服务
可以在 Targets 和 Service Discovery 目录下看到对 node_exporter 的监听
Prometheus 监控 MySQL 数据库
监听并暴露 MySQL 数据库的各种性能指标,如查询量、慢查询、连接数、表状态等。
mysqld_exporter 安装运行在哪台服务器上都行,只要确保能连接上需要监控的mysql服务就行。
下载 mysqld_exporter ,https://prometheus.io/download/
把下载的 mysqld_exporter-0.15.1.linux-amd64.tar.gz 安装包上传到 linux 服务器的 /usr/local 目录下
# 解压
tar -zxvf mysqld_exporter-0.15.1.linux-amd64.tar.gz
# 解压后重命名
mv mysqld_exporter-0.15.1.linux-amd64 mysqld_exporter
配置 mysql
mysqld_exporter 需要一个 MySQL 用户来访问数据库,并获取相关的性能指标。您需要创建一个具有适当权限的 MySQL 用户。
登录mysql:
mysql -u root -p
创建一个新的用户(如 mysqld_exporter)并授予权限:
# 账号:mysqld_exporter
# 密码:123456
# '%':表示用户可以从任何主机连接mysql服务,如果只希望该用户从特定的 IP 地址连接(例如 192.168.1.100),请将 '%' 替换为特定的 IP 地址(例如 'mysqld_exporter'@'192.168.1.100')
CREATE USER 'mysqld_exporter'@'%' IDENTIFIED BY '123456';
# 授予权限
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'mysqld_exporter'@'%';
# 刷新权限
FLUSH PRIVILEGES;
配置 .my.cnf,在 mysqld_exporter 执行文件所在目录下新建 .my.cnf 文件,内容如下:
[client]
user=mysqld_exporter
password=123456
启动 mysqld_exporter
cd /usr/local/mysqld_exporter
./mysqld_exporter
# 守护进程启动
nohup ./mysqld_exporter > mysqld_exporter.log 2>&1 &
访问: http://localhost:9104/metrics 可以查看 mysqld_exporter 的指标
配置 Prometheus 抓取 mysqld_exporter 的数据
在 prometheus.yml
配置文件中添加 mysqld_exporter
作为抓取目标:
scrape_configs:
- job_name: 'mysqld_exporter'
static_configs:
- targets: ['localhost:9104'] # mysqld_exporter服务所在的路径
重启 prometheus 服务
可以在 Targets 和 Service Discovery 目录下看到对 mysqld_exporter 的监听
Prometheus 监控 Redis 数据库
监控 Redis 数据库的性能和状态指标,包括内存使用、连接数、命令执行速率、缓存命中率等,帮助用户了解 Redis 实例的运行状况。
启动 redis_exporter
redis_exporter 由于不是官方提供的,使用命令行的方式启动一堆问题,这里使用 docker 的方式启动 redis_exporter。
拉取 redis_exporter 的 docker 镜像
docker pull oliver006/redis_exporter
docker 运行 redis_exporter
redis_exporter 的默认端口是 9121
# redis在本地主机
docker run -d --name redis_exporter --network="host" oliver006/redis_exporter --redis.addr=redis://localhost:6379 --redis.password=yourpassword
# redis在远程服务器
docker run -d --name redis_exporter -p 9121:9121 oliver006/redis_exporter --redis.addr=redis://192.168.1.100:6379 --redis.password=yourpassword
访问: http://localhost:9121/metrics 可以查看 redis_exporter 的指标
配置 Prometheus 抓取 redis_exporter 的数据
在 prometheus.yml
配置文件中添加 redis_exporter
作为抓取目标:
scrape_configs:
- job_name: 'redis_exporter'
static_configs:
- targets: ['localhost:9121'] # redis_exporter 服务所在的路径
重启 prometheus 服务
可以在 Targets 和 Service Discovery 目录下看到对 redis_exporter 的监听,报红的表示停止的exporter服务
Prometheus 监控 SpringBoot 项目
SpringBoot 配置 Prometheus
在 pom.xml 中添加 Micrometer Prometheus 和 Spring Boot Actuator 的依赖
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
application.yml 中启用 Actuator 端点,暴露 /actuator/prometheus 指标。这样 SpringBoot 服务会在 127.0.0.1:8080/actuator/prometheus 暴露 Prometheus 格式的监控指标。
# 用于指定哪些管理端点可以通过 HTTP 公开。
management:
endpoints:
web:
exposure:
# prometheus 端点对外暴露
include: prometheus
endpoint:
prometheus:
# prometheus 端点启用
enabled: true
启动 SpringBoot 项目
访问: http://localhost:8080/actuator
访问:http://localhost:8080/actuator/prometheus 可以查看 SpringBoo 的指标
配置 Prometheus 抓取 SpringBoot 的指标
在 prometheus.yml
配置文件中添加 SpringBoot 作为抓取目标:
scrape_configs:
- job_name: 'springboot-app'
metrics_path: '/actuator/prometheus' # 指标的路径
static_configs:
- targets: ['localhost:8080'] # SpringBoot 服务地址(ip:端口)
重启 prometheus 服务
可以在 Targets 和 Service Discovery 目录下看到对 SpringBoot 服务的监听,报红的表示停止的exporter服务