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 应用的性能指标。 希望大家能够将这些知识应用到实际项目中,让你的代码不再裸奔,让你的应用更加稳定和可靠。
记住,监控不是一次性的工作,而是一个持续的过程。 只有不断地监控、分析和优化,才能让你的应用始终保持最佳状态。
好了,今天的分享就到这里,谢谢大家! 如果大家有什么问题,欢迎随时提问,我们一起交流学习!
(鞠躬)