调用链追踪

    hyperf/tracer 组件默认安装了 相关依赖。如果要使用 Jaeger,还需要执行下面的命令安装对应的依赖:

    1. composer require jonahgeorge/jaeger-client-php

    增加组件配置

    如文件不存在,可执行下面的命令增加 config/autoload/opentracing.php 配置文件:

    配置追踪开关

    默认提供了对 Guzzle HTTP 调用、Redis 调用、DB 调用进行了监听或 AOP 切面处理,以实现对调用链的传播与追踪,默认情况下这些追踪不会打开,您需要通过更改 config/autoload/opentracing.php 配置文件内的 enable 项内的开关来打开对某些远程调用的追踪。

    1. <?php
    2. return [
    3. 'enable' => [
    4. // 打开或关闭对 Guzzle HTTP 调用的追踪
    5. 'guzzle' => false,
    6. // 打开或关闭对 Redis 调用的追踪
    7. 'redis' => false,
    8. 'db' => false,
    9. ],
    10. ];

    选择追踪器驱动

    配置文件内的 default 对应的值则为使用的驱动名称。驱动的具体配置在 tracer 项下定义,使用与 key 相同的驱动。

    注意,如示例配置所示,您可以配置多套 Zipkin 驱动或 Jaeger 驱动。虽然采用的底层系统一样,但他们的具体配置可以不同。一种常见场景是我们希望测试环境 100% 采样,但在生产环境下 1% 采样,就可以配置两套驱动,然后根据 default 项下的环境变量来选择不同的驱动。

    配置 Zipkin

    使用 Zipkin 时,在配置文件中的 项增加 Zipkin 的具体配置。

    1. <?php
    2. use Zipkin\Samplers\BinarySampler;
    3. return [
    4. // 选择默认的 Tracer
    5. 'default' => env('TRACER_DRIVER', 'zipkin'),
    6. // 这里的代码演示不对 enable 内的配置进行展开
    7. 'enable' => [],
    8. 'tracer' => [
    9. // Zipkin 驱动配置
    10. 'zipkin' => [
    11. // 当前应用的配置
    12. 'app' => [
    13. 'name' => env('APP_NAME', 'skeleton'),
    14. // 如果 ipv6 和 ipv6 为空组件会自动从 Server 中检测
    15. 'ipv4' => '127.0.0.1',
    16. 'ipv6' => null,
    17. 'port' => 9501,
    18. 'options' => [
    19. // Zipkin 服务的 endpoint 地址
    20. 'endpoint_url' => env('ZIPKIN_ENDPOINT_URL', 'http://localhost:9411/api/v2/spans'),
    21. 'timeout' => env('ZIPKIN_TIMEOUT', 1),
    22. ],
    23. // 采样器,默认为所有请求的都追踪
    24. 'sampler' => BinarySampler::createAsAlwaysSample(),
    25. ],
    26. ],
    27. ];

    配置 Jaeger

    关于 Jaeger 的更多配置可以在 [这里] 查看。

    配置中间件

    配置完驱动之后,采集信息还需要配置一下中间件才能启用采集功能。打开 config/autoload/middlewares.php 文件,在 http 节点启用中间件。

    1. <?php
    2. declare(strict_types=1);
    3. return [
    4. 'http' => [
    5. \Hyperf\Tracer\Middleware\TraceMiddeware::class,
    6. ],
    7. ];

    默认的采样器为所有请求都记录调用链,这对性能会存在一定程度上的影响,尤其是内存的占用,所以我们只需要在我们希望的时候才对调用链进行追踪,那么我们就需要对采样器进行更换,更换也很简单,以 Zipkin 为例,只需对配置项 opentracing.zipkin.sampler 对应的值改为您的采样器对象实例即可,只要您的采样器对象实现了 Zipkin\Sampler 接口类即可。

    接入阿里云链路追踪服务

    您也可以使用其他任意符合OpenTracing协议的Tracer驱动。在Driver项中,填写任意实现了Hyperf\Tracer\Contract\NamedFactoryInterface的类就可以了。该接口只有一个make函数,参数为驱动名称,需返回一个实现了OpenTracing\Tracer的实例。