Prometheus监控PHP延迟执行需暴露耗时、状态、积压量等指标,通过prometheus/client_php库用Histogram记录处理耗时分布,并补充队列长度、成功/失败次数、最大积压时间等业务维度指标,再配置抓取与告警规则。

用Prometheus监控PHP延迟执行,核心是把“延迟任务的耗时、状态、积压量”等指标暴露为Prometheus可采集的格式(如文本形式的/metrics端点),再配合Exporter或自埋点方式上报。
明确要监控的延迟执行场景
PHP中常见的延迟执行包括:Redis队列(如Predis + cron轮询)、数据库任务表(status=waiting)、Swoole定时器、或基于ReactPHP的异步任务。不同实现方式,监控切入点不同:
- 如果是队列型(如Redis List/Zset、Beanstalkd),重点监控:任务入队耗时、出队耗时、处理耗时、队列长度、失败重试次数
- 如果是数据库轮询型,重点监控:单次扫描耗时、扫描到的任务数、更新状态SQL执行时间、未完成任务总数
- 如果是Swoole Worker+Timer模式,需在任务开始/结束处打点,记录start_time和end_time,并计算差值
用Prometheus Client PHP暴露延迟指标
推荐使用官方支持的 prometheus/client_php 库(v2.x),它支持Gauge、Histogram、Counter等类型。对延迟敏感的场景,优先用 Histogram 记录处理耗时分布:
// 在任务执行前后记录
use Prometheus\CollectorRegistry;
use Prometheus\Storage\InMemory;
<p>$registry = new CollectorRegistry(new InMemory());
$histogram = $registry->getOrRegisterHistogram(
'php',
'job_processing_duration_seconds',
'Task processing time in seconds',
['job_type', 'status'] // 标签区分不同类型和结果
);</p><p>$start = microtime(true);
try {
doYourDelayedJob();
$duration = microtime(true) - $start;
$histogram->observe($duration, ['send_email', 'success']);
} catch (Exception $e) {
$duration = microtime(true) - $start;
$histogram->observe($duration, ['send_email', 'failed']);
}
</p>
然后在Web路由(如 /metrics)中输出:
echo $registry->getMetricFamilySamples();
补充关键业务维度指标
仅监控耗时不够,还需结合上下文判断是否异常。建议额外暴露:
-
Gauge 类型:当前待处理任务数(如
php_job_queue_length{queue="email"} 12) -
Counter 类型:累计成功/失败/超时次数(如
php_job_total{job_type="notify", result="timeout"} 42) -
Gauge 类型:最长积压时间(即最早一条未执行任务的创建时间戳,换算成秒级延迟:
php_job_max_age_seconds{queue="sms"} 86200)
这些指标可从队列头/数据库MIN(created_at)实时计算,每分钟更新一次即可,无需高频刷新。
配置Prometheus抓取与告警
在 prometheus.yml 中添加对应job:
scrape_configs:
- job_name: 'php-delayed-jobs'
static_configs:
- targets: ['your-app-host:8000'] # 暴露/metrics的PHP服务地址
metrics_path: '/metrics'
常用告警规则示例(写入alert.rules):
# 平均处理耗时超过3秒持续2分钟
- alert: PhpJobLatencyHigh
expr: histogram_quantile(0.95, sum(rate(php_job_processing_duration_seconds_bucket[5m])) by (le, job_type)) > 3
for: 2m
labels:
severity: warning
<h1>队列积压超100条</h1>
- alert: PhpJobQueueBacklogHigh expr: php_job_queue_length > 100 for: 1m
不复杂但容易忽略:确保PHP暴露端点不被公开访问,加基础认证或限制内网IP;同时避免在高并发请求中频繁new CollectorRegistry,应复用或用单例管理。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











