php方案 Jaeger + PHP=开源的分布式追踪系统
·
通过网盘分享的文件:jaeger-php-demo.zip
链接: https://pan.baidu.com/s/1gjVxPlQLVmqIUmn4OImIkQ?pwd=pwk3 提取码: pwk3
–来自百度网盘超级会员v2的分享
源代码
Jaeger 是开源的分布式追踪系统,本地运行时:
- ✅ 无需注册账号
- ✅ 无需 API 密钥
- ✅ 无需任何认证
- ✅ 完全免费使用
只需要知道 Jaeger 的地址和端口即可发送数据。
必需软件
- Docker - 运行 Jaeger
- PHP 7.4+ - 运行示例代码
检查环境
# 检查 Docker
docker --version
# 或在 WSL 中
wsl docker --version
# 检查 PHP
php --version
# 或在 WSL 中
wsl php --version
安装 Docker(如未安装)
Windows:
- 下载 Docker Desktop: https://www.docker.com/products/docker-desktop
Linux:
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
快速开始
第一步:启动 Jaeger
使用 Docker:
docker run -d --name jaeger \
-e COLLECTOR_ZIPKIN_HOST_PORT=:9411 \
-p 16686:16686 \
-p 14268:14268 \
-p 9411:9411 \
-p 6831:6831/udp \
jaegertracing/all-in-one:latest
使用 WSL + Docker:
wsl docker run -d --name jaeger \
-e COLLECTOR_ZIPKIN_HOST_PORT=:9411 \
-p 16686:16686 \
-p 14268:14268 \
-p 9411:9411 \
-p 6831:6831/udp \
jaegertracing/all-in-one:latest
验证启动成功:
# 查看容器状态
docker ps | grep jaeger
# 访问 Web UI
浏览器打开: http://localhost:16686
运行命令
cd /mnt/d/jaeger-php-demo && php public/index-v2.php
index-v2.php
<?php
/**
* 简单的 Jaeger 追踪类(使用 Zipkin JSON 格式)
*/
class JaegerTracer
{
private $serviceName;
private $jaegerHost;
private $jaegerPort;
public function __construct($serviceName = 'php-app', $jaegerHost = 'localhost', $jaegerPort = 9411)
{
$this->serviceName = $serviceName;
$this->jaegerHost = $jaegerHost;
$this->jaegerPort = $jaegerPort;
}
/**
* 发送追踪数据到 Jaeger (使用 Zipkin 格式)
*/
public function sendTrace($operationName, $duration, $tags = [])
{
$traceId = $this->generateId(16);
$spanId = $this->generateId(8);
$timestamp = (int)((microtime(true) - $duration) * 1000000); // 微秒
// Zipkin JSON v2 格式
$span = [
'traceId' => $traceId,
'id' => $spanId,
'name' => $operationName,
'timestamp' => $timestamp,
'duration' => (int)($duration * 1000000), // 微秒
'localEndpoint' => [
'serviceName' => $this->serviceName
],
'tags' => $tags
];
return $this->sendToJaeger([$span]);
}
/**
* 生成随机 ID
*/
private function generateId($length)
{
return bin2hex(random_bytes($length));
}
/**
* 发送数据到 Jaeger (Zipkin endpoint)
*/
private function sendToJaeger($spans)
{
$url = "http://{$this->jaegerHost}:{$this->jaegerPort}/api/v2/spans";
$jsonData = json_encode($spans);
$options = [
'http' => [
'method' => 'POST',
'header' => 'Content-Type: application/json',
'content' => $jsonData,
'ignore_errors' => true
]
];
$context = stream_context_create($options);
$result = @file_get_contents($url, false, $context);
return $result !== false;
}
}
/**
* 模拟数据库查询
*/
function queryDatabase($tracer)
{
$start = microtime(true);
usleep(100000); // 0.1秒
$duration = microtime(true) - $start;
$tracer->sendTrace('database_query', $duration, [
'db.type' => 'mysql',
'db.statement' => 'SELECT * FROM users',
'db.rows' => '10'
]);
return ['user1', 'user2', 'user3'];
}
/**
* 模拟 API 调用
*/
function callExternalAPI($tracer)
{
$start = microtime(true);
usleep(200000); // 0.2秒
$duration = microtime(true) - $start;
$tracer->sendTrace('external_api_call', $duration, [
'http.method' => 'GET',
'http.url' => 'https://api.example.com/data',
'http.status_code' => '200'
]);
return ['status' => 'success'];
}
/**
* 主业务逻辑
*/
function handleRequest($tracer)
{
$start = microtime(true);
echo "开始处理请求...\n";
$users = queryDatabase($tracer);
echo "数据库查询完成,获取 " . count($users) . " 个用户\n";
$apiResult = callExternalAPI($tracer);
echo "外部 API 调用完成\n";
$duration = microtime(true) - $start;
$tracer->sendTrace('handle_request', $duration, [
'request.method' => 'GET',
'request.path' => '/api/users',
'response.status' => '200'
]);
echo "请求处理完成,总耗时: " . round($duration, 3) . " 秒\n";
}
// 主程序
echo "=== Jaeger PHP 追踪演示 ===\n\n";
// 创建追踪器(使用 Zipkin 兼容端口 9411)
$tracer = new JaegerTracer('my-php-service', 'localhost', 9411);
// 模拟处理3个请求
for ($i = 1; $i <= 3; $i++) {
echo "\n--- 请求 #$i ---\n";
handleRequest($tracer);
sleep(1);
}
echo "\n✅ 完成!请访问 Jaeger UI: http://localhost:16686\n";
echo " 在界面中选择服务 'my-php-service' 查看追踪数据\n";
=== Jaeger PHP 追踪演示 ===
--- 请求 #1 ---
开始处理请求...
数据库查询完成,获取 3 个用户
外部 API 调用完成
请求处理完成,总耗时: 0.311 秒
--- 请求 #2 ---
开始处理请求...
数据库查询完成,获取 3 个用户
外部 API 调用完成
请求处理完成,总耗时: 0.308 秒
--- 请求 #3 ---
开始处理请求...
数据库查询完成,获取 3 个用户
外部 API 调用完成
请求处理完成,总耗时: 0.306 秒
✅ 完成!请访问 Jaeger UI: http://localhost:16686
在界面中选择服务 'my-php-service' 查看追踪数据

更多推荐

所有评论(0)