本文目录导读:

- 核心流程
- 方案一:OpenTelemetry + Jaeger(推荐,渐进式)
- 方案二:Elastic APM(Elastic Stack 方案)
- 方案三:Pinpoint(开箱即用,需字节码增强)
- 方案对比
- 实施建议
- 可视化界面示例
针对 PHP 项目的调用链日志可视化分析,目前主流方案是遵循 OpenTelemetry 标准,并配合 Jaeger 或 Zipkin 等工具,以下是具体的实现路径和推荐方案。
核心流程
- 自动埋点:通过 PHP 扩展或 Composer 包自动捕获请求、数据库查询、HTTP 调用等。
- 数据上报:将 trace(追踪)和 span(跨度)数据发送到后端存储。
- 可视化查询:通过 UI 界面查看调用瀑布图、耗时、错误分布。
OpenTelemetry + Jaeger(推荐,渐进式)
适用场景:现代 PHP 项目(Laravel/Symfony/ThinkPHP),需要标准、可扩展的链路追踪。
安装与配置
composer require open-telemetry/opentelemetry composer require open-telemetry/transport-grpc # 或 http composer require open-telemetry/exporter-otlp # OTLP 协议导出
自动埋点(以 Laravel 为例)
安装 SDK 后,通常会提供一个中间件或启动器,你在 config/otel.php 中配置服务名称和 OTLP 端点:
// config/otel.php
return [
'service_name' => 'my-php-api',
'exporter' => 'otlp',
'endpoint' => 'http://jaeger:4318', // Jaeger 的 OTLP 接收端口
];
框架会自动为每个 HTTP 请求创建根 span,并为数据库查询、Redis、HTTP 客户端等创建子 span。
数据流向
PHP (OTel SDK) --(OTLP/gRPC)--> OpenTelemetry Collector --> Jaeger / Zipkin / Grafana Tempo
简化部署:如果集群规模小,可以省略 Collector,直接发送到 Jaeger。
接入可视化工具 Jaeger
- 启动 Jaeger(推荐用 Docker):
docker run -d --name jaeger \ -e COLLECTOR_OTLP_ENABLED=true \ -p 16686:16686 \ -p 4318:4318 \ jaegertracing/all-in-one:latest
- 访问
http://localhost:16686,即可看到所有服务及调用瀑布图。
关键优势
- 低侵入:只需安装 Composer 包和少量配置。
- 全链路:如果下游服务(Go/Java/Python)也接入 OTel,可以跨语言串联。
Elastic APM(Elastic Stack 方案)
适用场景:团队已使用 ELK,希望日志、指标、链路一体化。
安装 APM Agent
composer require elastic/apm-agent
配置与启动
在代码入口处注册 Agent:
use Elastic\Apm\ElasticApm;
$transaction = ElasticApm::beginCurrentTransaction('GET /users', 'request');
try {
// 业务逻辑
$transaction->end();
} catch (\Throwable $e) {
$transaction->setResult('error');
$transaction->end();
}
或 使用框架中间件(Laravel/Symfony 有自动集成包)。
数据流向
PHP Agent -> Elastic APM Server -> Elasticsearch -> Kibana
在 Kibana 的 APM 模块中查看调用链,支持 SQL、HTTP、Redis 等自动埋点。
适合场景
- 团队已深度使用 Elasticsearch。
- 需要将链路与业务日志(ELK)关联分析。
Pinpoint(开箱即用,需字节码增强)
适用场景:老旧 PHP 项目,无法修改业务代码,但又需要调用链。
原理
- 安装 Pinpoint PHP Agent(基于 PHP 扩展)。
- 自动 hook
curl、PDO、Mysqli、Redis等底层函数。 - 无需修改一行 PHP 代码。
部署要点
- 需要编译安装
pinpoint-php扩展。 - Agent 配置指定 Collector 地址。
- 数据流向:
PHP Agent -> Pinpoint Collector -> HBase -> Pinpoint Web UI。
优缺点
- 优点:零侵入、功能强大(类调用、参数抓取)。
- 缺点:部署复杂(需 HBase)、社区较 OTel 活跃度低、不适合现代框架的异步场景。
方案对比
| 方案 | 侵入性 | 性能开销 | 跨语言支持 | 部署复杂度 | 最适合场景 |
|---|---|---|---|---|---|
| OTel + Jaeger | 低(Composer) | 中 | 优秀(标准) | 中 | 新项目 / 微服务 |
| Elastic APM | 中(需配置) | 中 | 良好 | 高(需 Elastic) | ELK 存量团队 |
| Pinpoint | 极低(扩展) | 高 | 优秀 | 极高 | 老项目改造、无法改代码 |
| SkyWalking PHP | 低(扩展) | 中 | 良好 | 中 | 亚太地区常用 |
实施建议
- 优先选择 OpenTelemetry + Jaeger,这是行业趋势,微软、Google、AWS 都在推动。
- PHP 版本要求:OTel PHP SDK 要求 PHP 8.0+,且强烈推荐使用
Swoole或FPM的ext-opentelemetry扩展(C 层级实现,性能更好)。 - 采样策略:生产环境建议使用 头部采样(Head Sampling)或 概率采样(如 10%),避免存储爆炸,Jaeger 支持配置
sampling.strategies。 - 异常记录:务必为 Span 绑定异常对象:
$span->recordException($exception);
这在可视化排查错误时极为重要。
可视化界面示例
在 Jaeger 中,你能看到:
- 服务依赖图:PHP 调用了哪些 MySQL、Redis、外部 API。
- 调用瀑布图:每个 span 的起止时间、父子关系、耗时严重度(红色标记慢操作)。
- 错误链路:如果某个 Span 标记为
error,点开会显示完整的stacktrace。
- 简易入门:用 OpenTelemetry SDK + Jaeger Docker,半天可搭建。
- 生产级别:增加 OpenTelemetry Collector 做缓冲、过滤、采样;后端存储从 Jaeger 内存换为 Elasticsearch 或 Cassandra。
- 不修改代码:PHP 版本允许,安装
ext-opentelemetry,可以自动追踪更多底层调用。
建议从 OTel + Jaeger 开始,它是最标准、社区最活跃、也最容易扩展的方案。