跳转至

Prometheus 教程

了解了。以下是 Prometheus 从入门到精通的详细教程,覆盖从基础概念到高级应用、优化及实战技巧。


一、Prometheus 概述

Prometheus 是一个开源的系统监控和报警工具,专注于时间序列数据的存储、查询、报警以及可视化。

1.1 Prometheus 的主要特点

  • 多维数据模型:使用时间序列数据模型,支持丰富的标签系统。
  • 灵活的查询语言(PromQL):提供强大的数据查询和聚合功能。
  • 无依赖的存储:内部存储时间序列数据,支持高效的查询和报警。
  • 高效的抓取机制:周期性抓取目标的指标数据。

1.2 主要组件

  1. Prometheus Server:负责抓取、存储、查询时间序列数据。
  2. Exporters:将应用程序和系统的内部状态暴露给 Prometheus。
  3. Alertmanager:管理和路由 Prometheus 的报警。
  4. Grafana:可视化工具,通过 Prometheus 数据源生成图表和仪表盘。

二、Prometheus 安装与配置

2.1 安装 Prometheus

2.1.1 从源代码安装

  1. 下载 Prometheus:
   wget https://github.com/prometheus/prometheus/releases/download/v2.44.0/prometheus-2.44.0.linux-amd64.tar.gz
  1. 解压并进入目录:
   tar -xzf prometheus-2.44.0.linux-amd64.tar.gz
   cd prometheus-2.44.0.linux-amd64
  1. 启动 Prometheus:
   ./prometheus --config.file=prometheus.yml

2.1.2 使用 Docker 安装

  1. 拉取 Prometheus 镜像:
   docker pull prom/prometheus
  1. 启动 Prometheus 容器:
   docker run -d -p 9090:9090 --name prometheus prom/prometheus

2.2 配置 Prometheus

配置文件 prometheus.yml 用于定义 Prometheus 的抓取目标和配置。

示例配置

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

三、Prometheus 数据模型与查询语言

3.1 数据模型

Prometheus 的数据模型包括:

  • 指标名称:例如 http_requests_total
  • 标签:用于标识不同的时间序列,例如 method="GET", status="200"
  • 时间戳:样本的时间点。
  • :时间戳对应的度量值。

3.2 PromQL 查询语言

PromQL 是用于查询 Prometheus 数据的强大工具。

基本查询示例

  • 获取所有 http_requests_total 指标数据:
  http_requests_total
  • 计算每秒请求速率:
  rate(http_requests_total[5m])
  • 计算请求总数的平均值:
  avg(http_requests_total)
  • 计算错误率:
  rate(http_requests_total{status="500"}[5m]) / rate(http_requests_total[5m])

3.3 PromQL 函数与操作符

PromQL 提供了多种函数和操作符用于数据处理:

  • 聚合函数sum(), avg(), max(), min()
  • 数学运算+, -, *, /
  • 时间函数rate(), increase(), histogram_quantile()

四、Prometheus 与 Exporters

4.1 Exporters 介绍

Exporters 将应用程序和系统的状态数据转化为 Prometheus 可以抓取的格式。

4.2 常用 Exporters

  1. Node Exporter:监控操作系统级别的指标。
  2. 安装
     wget https://github.com/prometheus/node_exporter/releases/download/v1.5.0/node_exporter-1.5.0.linux-amd64.tar.gz
     tar -xzf node_exporter-1.5.0.linux-amd64.tar.gz
     cd node_exporter-1.5.0.linux-amd64
     ./node_exporter
  1. Blackbox Exporter:监控网络服务的可用性。
  2. 安装
     docker run -d -p 9115:9115 --name blackbox_exporter prom/blackbox-exporter
  1. MySQL Exporter:监控 MySQL 数据库的状态。
  2. 安装
     docker run -d -p 9104:9104 --name mysql_exporter prom/mysqld_exporter

4.3 配置 Prometheus 抓取 Exporter 数据

示例配置

scrape_configs:
  - job_name: 'node_exporter'
    static_configs:
      - targets: ['localhost:9100']

  - job_name: 'mysql_exporter'
    static_configs:
      - targets: ['localhost:9104']

五、Prometheus 与 Grafana 集成

5.1 安装 Grafana

5.1.1 使用 Docker 安装

  1. 拉取 Grafana 镜像:
   docker pull grafana/grafana
  1. 启动 Grafana 容器:
   docker run -d -p 3000:3000 --name grafana grafana/grafana

5.1.2 使用二进制文件安装

  1. 下载并解压 Grafana:
   wget https://dl.grafana.com/oss/release/grafana-9.5.1.linux-amd64.tar.gz
   tar -zxvf grafana-9.5.1.linux-amd64.tar.gz
  1. 启动 Grafana:
   cd grafana-9.5.1
   ./bin/grafana-server web

5.2 配置 Grafana 数据源

  1. 登录 Grafana Web 界面(默认端口 3000)。
  2. 点击左侧“齿轮”图标,选择“Data Sources”。
  3. 选择 “Prometheus” 作为数据源,并配置 Prometheus 服务器地址(如 http://localhost:9090)。
  4. 点击“Save & Test”保存数据源配置。

5.3 创建仪表盘

  1. 在 Grafana 中,点击左侧的“+”图标,选择“Dashboard”。
  2. 添加面板并配置 PromQL 查询以展示数据。
  3. 根据需要调整图表类型、时间范围等设置。

六、Prometheus 告警管理

6.1 配置告警规则

告警规则用于定义触发告警的条件。

示例告警规则

groups:
  - name: example
    rules:
      - alert: HighErrorRate
        expr: rate(http_requests_total{status="500"}[5m]) > 0.05
        for: 10m
        labels:
          severity: critical
        annotations:
          summary: "High error rate detected"
          description: "The error rate is above 5% for the last 10 minutes."

6.2 配置 Alertmanager

Alertmanager 处理 Prometheus 的告警,支持告警分组、抑制和通知功能。

示例 Alertmanager 配置

route:
  receiver: 'email'

receivers:
  - name: 'email'
    email_configs:
      - to: 'alerts@example.com'

6.3 集成告警通知

  1. 配置 Alertmanager 的通知方式(如邮件、Slack、Webhook)。
  2. 在 Prometheus 配置文件中添加 alerting 部分,指定 Alertmanager 的地址。

示例配置

alerting:
  alertmanagers:
    - static_configs:
      - targets: ['localhost:9093']

七、Prometheus 的高级应用与优化

7.1 高可用性与扩展

7.1.1 多实例 Prometheus

通过部署多个 Prometheus 实例来提高系统的可靠性和处理能力。

7.1.2 Prometheus 联邦

Prometheus 联邦用于将多个 Prometheus 实例的数据汇总到上层 Prometheus 实例中。

联邦配置示例

scrape_configs:
  - job_name: 'federate'
    metrics_path: '/federate'
    params:
      'match[]':
        - '{__name__=~"job:.*"}'
    static_configs:
      - targets: ['prometheus1:9090', 'prometheus2:9090']

7.1.3 使用外部存储

对于长时间存储需求,可以使用外部存储插件(如 Thanos、Cortex)来扩展 Prometheus。

7.2 性能优化

7.2.1 减少标签基数

避免使用过多高基数标签,以减少时间序列的数量。

7.2.2 使用 Recording Rules

使用 recording rules 将复杂的查询预计算并保存,以提高查询性能。

7.2.3 配置数据保留

调整数据保留策略以满足业务需求,定期清理旧数据。

7.3 数据备份与恢复

使用 Prometheus 的快照功能定期备份数据。

创建快照

curl -X POST http://localhost:9090/api/v1/admin/tsdb/snapshot

恢复数据: 将快照目录复制到 Prometheus 数据目录,并重启 Prometheus 实例。


八、Prometheus 的最佳实践

8.1 监控策略

  1. 定义关键指标:确定应用和系统的关键性能指标(KPI),并监控这些指标。
  2. 设置合理的告警阈值:避免告警过多,设置合理的阈值以便于有效地检测问题。
  3. 定期审查与优化:定期审查 Prometheus 配置和查询规则,优化性能和准确性。

8.2 高效的指标管理

  1. 使用标签:合理使用标签来区分不同的时间序列。
  2. 避免高基数标签:减少高基数标签的使用,以免产生过多的时间序列。
  3. 记录规则:将频繁使用的复杂查询结果预计算并记录,提升查询效率。

8.3 安全与权限管理

  1. Prometheus 安全:通过配置反向代理(如 Nginx)实现访问控制和认证。
  2. Grafana 安全:配置多种认证方式(如 LDAP、OAuth),设置用户访问权限。

Prometheus MySQL 实战详解

在实际的生产环境中,监控数据库的健康状态和性能表现至关重要,尤其是像 MySQL 这样的常用数据库。使用 Prometheus 结合 MySQL Exporter,可以轻松实现对 MySQL 的全面监控和报警。


一、Prometheus 监控 MySQL 的架构

  1. MySQL Exporter:用于从 MySQL 数据库中采集指标,并以 Prometheus 格式暴露出来。
  2. Prometheus Server:定期抓取 MySQL Exporter 暴露的指标,并存储、分析和报警。
  3. Grafana:用于可视化 MySQL 性能指标,生成实时仪表盘。
  4. Alertmanager:用于处理 Prometheus 发送的 MySQL 报警信息。

二、MySQL Exporter 安装与配置

2.1 安装 MySQL Exporter

MySQL Exporter 是 Prometheus 官方提供的 MySQL 数据库监控插件,可以通过以下几种方式安装。

2.1.1 使用 Docker 安装

  1. 拉取 MySQL Exporter 镜像:
   docker pull prom/mysqld-exporter
  1. 启动容器,并连接到 MySQL 数据库:
   docker run -d -p 9104:9104 \
     -e DATA_SOURCE_NAME="user:password@(db_host:3306)/" \
     --name mysql_exporter \
     prom/mysqld-exporter
  • DATA_SOURCE_NAME 是 MySQL Exporter 连接 MySQL 数据库所需的连接信息。
  • user:MySQL 用户名
  • password:MySQL 密码
  • db_host:MySQL 主机地址(通常为 localhost 或数据库服务 IP)

2.1.2 使用二进制文件安装

  1. 下载 MySQL Exporter:
   wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.14.0/mysqld_exporter-0.14.0.linux-amd64.tar.gz
  1. 解压文件:
   tar -xzf mysqld_exporter-0.14.0.linux-amd64.tar.gz
   cd mysqld_exporter-0.14.0.linux-amd64
  1. 启动 MySQL Exporter:
   ./mysqld_exporter --config.my-cnf="/path/to/.my.cnf"
  • .my.cnf 文件中包含连接 MySQL 数据库的配置信息:
   [client]
   user=root
   password=your_password

2.2 MySQL 用户权限设置

为了让 MySQL Exporter 访问 MySQL 的性能指标,需要为其创建一个专用用户并分配适当的权限:

  1. 连接到 MySQL 数据库:
   mysql -u root -p
  1. 创建一个用于监控的用户并分配权限:
   CREATE USER 'exporter'@'localhost' IDENTIFIED BY 'password';
   GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost';
   FLUSH PRIVILEGES;

三、Prometheus 配置抓取 MySQL Exporter

在 MySQL Exporter 部署完成后,需要在 Prometheus 中配置抓取 MySQL Exporter 采集到的指标。

3.1 Prometheus 配置

编辑 Prometheus 的配置文件 prometheus.yml,增加 MySQL Exporter 的抓取配置:

scrape_configs:
  - job_name: 'mysql_exporter'
    static_configs:
      - targets: ['localhost:9104']
  • job_name:抓取任务的名称。
  • targets:MySQL Exporter 暴露的指标端点(通常为 localhost:9104)。

3.2 验证 MySQL Exporter 指标抓取

  1. 重新启动 Prometheus 服务:
   systemctl restart prometheus
  1. 访问 Prometheus Web UI(默认端口 9090),在 “Targets” 页面检查 MySQL Exporter 是否成功注册。

  2. 测试抓取的 MySQL 指标: 在 Prometheus Web UI 中,执行查询:

   mysql_global_status_connections

四、Grafana 中的 MySQL 可视化

为了更好地展示 MySQL 的性能数据,可以使用 Grafana 来创建自定义的监控仪表盘。

4.1 添加 Prometheus 数据源

  1. 登录到 Grafana(默认端口为 3000)。
  2. 在左侧导航栏中选择 Data Sources,点击 Add data source
  3. 选择 Prometheus 作为数据源,并配置 Prometheus 服务器地址(如 http://localhost:9090)。
  4. 点击 Save & Test,确认连接成功。

4.2 使用 MySQL Exporter 的预制仪表盘

Grafana 社区提供了许多开箱即用的 MySQL 监控仪表盘,您可以直接导入使用。

  1. 在 Grafana 仪表盘页面,点击左上角的 "+" 图标,选择 Import
  2. Grafana Dashboard ID 中输入 7362(一个流行的 MySQL 监控仪表盘),然后点击 Load
  3. 选择您的 Prometheus 数据源,点击 Import

此仪表盘包含了 MySQL 的常见监控指标,如: - 连接数mysql_global_status_connections) - 查询速率mysql_global_status_queries) - InnoDB 缓冲池使用情况mysql_global_status_innodb_buffer_pool_pages_free) - 事务执行速率mysql_global_status_com_commitmysql_global_status_com_rollback


五、常用 MySQL 监控指标解析

通过 MySQL Exporter,可以监控大量的数据库指标。以下是一些关键的 MySQL 监控指标及其意义:

  1. mysql_global_status_connections
  2. 描述:当前 MySQL 的连接数。
  3. 作用:了解数据库的连接压力,如果该值过高,可能意味着连接池配置不合理或有潜在的连接泄露问题。

  4. mysql_global_status_queries

  5. 描述:查询总次数。
  6. 作用:监控数据库查询的负载情况,用于检测高峰期的查询压力。

  7. mysql_global_status_innodb_buffer_pool_pages_free

  8. 描述:InnoDB 缓冲池中空闲页的数量。
  9. 作用:用于监控 InnoDB 缓冲池的使用情况,确保数据库的内存资源得到合理利用。

  10. mysql_global_status_threads_running

  11. 描述:当前正在运行的线程数。
  12. 作用:表示当前数据库的并发处理能力,高并发的情况下该值过高,可能会影响数据库的响应时间。

  13. mysql_global_status_slow_queries

  14. 描述:慢查询的数量。
  15. 作用:跟踪慢查询的发生情况,通过优化慢查询可以提高数据库的性能。

  16. mysql_global_status_com_select

  17. 描述:执行 SELECT 查询的次数。
  18. 作用:衡量数据库读取操作的频率,有助于了解读负载情况。

  19. mysql_global_status_com_insertcom_updatecom_delete

  20. 描述:执行 INSERTUPDATEDELETE 操作的次数。
  21. 作用:分析数据库的写操作负载,帮助理解写入性能瓶颈。

六、MySQL 性能优化策略与告警

在监控 MySQL 性能指标的同时,Prometheus 还可以帮助设置告警策略,及时发现数据库问题。

6.1 设置告警规则

可以根据 MySQL 的性能指标定义告警规则。例如,当数据库连接数过高时触发告警:

groups:
  - name: mysql_alerts
    rules:
      - alert: MySQLHighConnections
        expr: mysql_global_status_connections > 200
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "High MySQL connections detected"
          description: "MySQL connections have exceeded 200 for more than 5 minutes."

6.2 性能优化建议

  1. 优化查询:通过慢查询日志,识别并优化慢查询语句。
  2. 调整连接池大小:根据应用程序的负载调整数据库连接池的配置,避免连接数过多或过少。
  3. 合理配置 InnoDB 缓冲池:确保 InnoDB 缓冲池的大小合适,以便高效缓存数据。
  4. 监控磁盘 I/O:如果 MySQL 实例处于高负载状态,磁盘 I/O 可能成为瓶颈。