PHP `Metrics` (`Prometheus`/`Grafana`):监控 PHP 应用性能指标

PHP 性能监控:让你的代码不再裸奔 (Prometheus & Grafana)

各位靓仔靓女们,晚上好!我是你们的老朋友,一个在代码堆里摸爬滚打多年的老码农。今天咱们不聊妹子,不聊八卦,咱们来聊点硬核的——PHP 应用的性能监控!

咱们的 PHP 代码,辛辛苦苦写出来,扔到服务器上,就像孩子扔到幼儿园一样,你放心吗? 你知道它表现怎么样吗?是欢天喜地地跑着,还是哭着喊着要回家?

如果你跟我一样,是个负责任的家长(程序员),肯定想随时掌握孩子的动态。 这时候,性能监控就显得尤为重要了。

想象一下,如果没有监控,你的 PHP 应用就像一辆没有仪表盘的车,你只能凭感觉开,突然抛锚了,你都不知道发生了什么。有了性能监控,你就能实时了解 CPU 使用率、内存占用、请求响应时间等等关键指标,及时发现问题,避免酿成大祸。

今天,我就来跟大家分享一下如何利用 Prometheus 和 Grafana 这对黄金搭档,为你的 PHP 应用打造一套完善的性能监控系统,让你的代码不再裸奔!

1. Prometheus:监控数据的收集器

Prometheus 就像一个辛勤的蜜蜂,负责从你的 PHP 应用中采集各种性能指标,然后存储起来。

1.1 Prometheus 的基本概念

  • Metrics (指标): 这是 Prometheus 监控的核心。指标可以是任何可以被量化的东西,比如 CPU 使用率、内存占用、请求数等等。
  • Targets (目标): 这是 Prometheus 监控的对象,也就是你的 PHP 应用。
  • Exporters (导出器): 这是一个中间件,负责将你的 PHP 应用的性能指标转换成 Prometheus 可以理解的格式。
  • Time Series Data (时间序列数据): Prometheus 将采集到的指标数据按照时间顺序存储,形成时间序列数据,方便后续的分析和可视化。

1.2 安装和配置 Prometheus

安装 Prometheus 非常简单,直接去官网下载对应你操作系统的版本,解压即可。

配置 Prometheus 主要修改 prometheus.yml 文件,告诉 Prometheus 要监控哪些 Targets。一个简单的配置如下:

global:
  scrape_interval:     15s # 每隔 15 秒抓取一次数据
  evaluation_interval: 15s

scrape_configs:
  - job_name: 'php-app'  # 任务名称,随便起
    static_configs:
      - targets: ['your-php-app-host:9100'] # 你的 PHP 应用的 Exporter 地址

这里 scrape_interval 定义了 Prometheus 抓取数据的频率,targets 定义了要监控的 PHP 应用的 Exporter 地址。 注意,your-php-app-host 替换成你实际的 IP 地址或者域名。

1.3 PHP Exporter:让 Prometheus 听懂 PHP 的语言

Prometheus 本身并不能直接读取 PHP 应用的性能指标,我们需要一个 Exporter 来做翻译。 这里推荐使用 php-fpm_exporter,它可以监控 PHP-FPM 的状态。

1.3.1 安装 php-fpm_exporter

# 下载 php-fpm_exporter
wget https://github.com/hipages/php-fpm_exporter/releases/download/v0.5.0/php-fpm_exporter-linux-amd64

# 重命名并赋予执行权限
mv php-fpm_exporter-linux-amd64 php-fpm_exporter
chmod +x php-fpm_exporter

# 移动到 /usr/local/bin 目录下
sudo mv php-fpm_exporter /usr/local/bin/

# 运行 php-fpm_exporter,默认端口是 9100
php-fpm_exporter

1.3.2 配置 php-fpm

我们需要修改 php-fpm.conf 文件,开启 status 页面,让 php-fpm_exporter 可以获取到 PHP-FPM 的状态信息。

pm.status_path = /status

然后重启 PHP-FPM:

sudo systemctl restart php-fpm

现在,你可以在浏览器中访问 http://your-php-app-host/status?full, 应该能看到 PHP-FPM 的状态信息。

1.4 自定义 Metrics:监控你的业务逻辑

除了 PHP-FPM 的状态,我们可能还想监控一些业务逻辑相关的指标,比如用户注册数、订单量等等。 这就需要我们自己定义 Metrics,并使用 Prometheus 客户端来暴露这些指标。

1.4.1 安装 Prometheus PHP 客户端

使用 Composer 安装 Prometheus PHP 客户端:

composer require promphp/prometheus_client_php

1.4.2 代码示例

<?php

require 'vendor/autoload.php';

use PrometheusCollectorRegistry;
use PrometheusStorageInMemory;
use PrometheusCounter;
use PrometheusGauge;
use PrometheusHistogram;

// 创建一个 Registry,用于存储 Metrics
$adapter = new InMemory();
$registry = new CollectorRegistry($adapter);

// 创建一个 Counter,用于统计用户注册数
$counter = $registry->getOrRegisterCounter('user', 'registrations_total', 'Total number of user registrations');

// 创建一个 Gauge,用于记录当前在线用户数
$gauge = $registry->getOrRegisterGauge('user', 'online_users', 'Number of online users');

// 创建一个 Histogram,用于统计请求响应时间
$histogram = $registry->getOrRegisterHistogram('http', 'request_duration_seconds', 'HTTP request duration (seconds)', [0.1, 0.3, 0.5, 0.7, 0.9]);

// 模拟用户注册
$counter->inc();

// 模拟用户上线
$gauge->set(rand(10, 100));

// 模拟请求响应时间
$histogram->observe(rand(1, 10) / 10);

// 暴露 Metrics
header('Content-Type: text/plain');
$result = $registry->getMetricFamilySamples();
$serializer = new PrometheusTextSerializer();
echo $serializer->serialize($result);

将这段代码保存为 metrics.php,然后在你的 PHP 应用中访问 metrics.php, 就能看到 Prometheus 格式的 Metrics 数据。

1.4.3 配置 Prometheus 监控自定义 Metrics

prometheus.yml 文件中添加一个新的 job_name,指向你的 metrics.php 页面:

scrape_configs:
  - job_name: 'php-app'
    static_configs:
      - targets: ['your-php-app-host:9100']
  - job_name: 'php-custom-metrics'
    static_configs:
      - targets: ['your-php-app-host/metrics.php']

重启 Prometheus,就可以开始监控自定义 Metrics 了。

2. Grafana:监控数据的可视化

Prometheus 负责收集数据,而 Grafana 负责将这些数据以图表的形式展示出来,让你一目了然地了解你的 PHP 应用的性能状况。

2.1 安装和配置 Grafana

安装 Grafana 也很简单,去官网下载对应你操作系统的版本,解压即可。

安装完成后,打开 Grafana 的 Web 界面 (默认端口是 3000),使用默认用户名和密码 (admin/admin) 登录。

2.2 添加 Prometheus 数据源

在 Grafana 中,我们需要添加 Prometheus 数据源,告诉 Grafana 从哪里获取数据。

  • 点击左侧导航栏的 "Configuration" -> "Data Sources"。
  • 点击 "Add data source"。
  • 选择 "Prometheus"。
  • 在 "HTTP" -> "URL" 中输入你的 Prometheus 地址 (例如:http://your-prometheus-host:9090)。
  • 点击 "Save & Test",如果一切正常,会显示 "Data source is working"。

2.3 创建 Dashboard

有了数据源之后,我们就可以创建 Dashboard 来展示监控数据了。

  • 点击左侧导航栏的 "+" -> "Dashboard"。
  • 点击 "Add new panel"。
  • 在 "Query" 中输入 Prometheus 的查询语句 (PromQL),例如:rate(phpfpm_accepted_conn[5m]),表示过去 5 分钟内接受的连接数。
  • 选择合适的图表类型,例如 "Graph"。
  • 调整图表的标题、颜色、坐标轴等,使其更易于理解。
  • 点击 "Save" 保存 Dashboard。

2.4 常用 PromQL 语句

这里列出一些常用的 PromQL 语句,方便大家快速创建 Dashboard:

指标 PromQL 语句 描述
CPU 使用率 100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) 计算 CPU 使用率,排除 idle 状态的时间
内存使用率 100 * (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) 计算内存使用率,MemAvailable 是可用内存,MemTotal 是总内存
磁盘空间使用率 100 * (1 - (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"})) 计算根目录的磁盘空间使用率,替换 / 为其他挂载点
PHP-FPM 活动进程数 phpfpm_active_processes 当前活动的 PHP-FPM 进程数
PHP-FPM 接受连接数 rate(phpfpm_accepted_conn[5m]) 过去 5 分钟内接受的连接数,使用 rate 函数计算增长率
HTTP 请求总数 sum(rate(http_request_duration_seconds_count[5m])) 过去 5 分钟内 HTTP 请求的总数,http_request_duration_seconds_count 是 Prometheus 客户端自动生成的 Counter
HTTP 请求平均响应时间 histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket[5m])) by (le)) HTTP 请求 95 分位的响应时间,http_request_duration_seconds_bucket 是 Prometheus 客户端自动生成的 Histogram

2.5 告警设置

除了可视化,Grafana 还可以设置告警,当某些指标超过预设的阈值时,会发送通知,让你及时发现问题。

  • 在 Dashboard 中,点击 "Edit" 进入编辑模式。
  • 在 Panel 中,点击 "Alert" -> "Create Alert"。
  • 设置告警规则,包括告警条件、评估频率、持续时间等等。
  • 选择告警通知渠道,例如 Email、Slack、Webhook 等等。

3. 最佳实践

  • 监控关键指标: 关注 CPU、内存、磁盘 I/O、网络 I/O、请求响应时间等关键指标。
  • 设置合理的告警阈值: 根据你的应用特点,设置合理的告警阈值,避免误报和漏报。
  • 定期审查 Dashboard: 定期审查 Dashboard,了解你的应用的性能趋势,及时发现潜在问题。
  • 使用标签: 使用标签来区分不同的应用、环境、服务等等,方便你进行更细粒度的监控和分析。
  • 自动化部署: 使用自动化部署工具 (例如 Ansible、Terraform) 来简化 Prometheus 和 Grafana 的安装和配置。

4. 总结

今天我们一起学习了如何使用 Prometheus 和 Grafana 来监控 PHP 应用的性能指标。 希望大家能够将这些知识应用到实际项目中,让你的代码不再裸奔,让你的应用更加稳定和可靠。

记住,监控不是一次性的工作,而是一个持续的过程。 只有不断地监控、分析和优化,才能让你的应用始终保持最佳状态。

好了,今天的分享就到这里,谢谢大家! 如果大家有什么问题,欢迎随时提问,我们一起交流学习!

(鞠躬)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注