通过网盘分享的文件:jaeger-php-demo.zip
链接: https://pan.baidu.com/s/1gjVxPlQLVmqIUmn4OImIkQ?pwd=pwk3 提取码: pwk3
–来自百度网盘超级会员v2的分享
源代码

Jaeger 是开源的分布式追踪系统,本地运行时:
- ✅ 无需注册账号
- ✅ 无需 API 密钥
- ✅ 无需任何认证
- ✅ 完全免费使用

只需要知道 Jaeger 的地址和端口即可发送数据。

必需软件

  1. Docker - 运行 Jaeger
  2. 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' 查看追踪数据

在这里插入图片描述

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐