调用链追踪
hyperf/tracer 组件默认安装了 相关依赖。如果要使用 Jaeger,还需要执行下面的命令安装对应的依赖:
composer require jonahgeorge/jaeger-client-php
增加组件配置
如文件不存在,可执行下面的命令增加 config/autoload/opentracing.php
配置文件:
配置追踪开关
默认提供了对 Guzzle HTTP
调用、Redis
调用、DB
调用进行了监听或 AOP
切面处理,以实现对调用链的传播与追踪,默认情况下这些追踪不会打开,您需要通过更改 config/autoload/opentracing.php
配置文件内的 enable
项内的开关来打开对某些远程调用的追踪。
<?php
return [
'enable' => [
// 打开或关闭对 Guzzle HTTP 调用的追踪
'guzzle' => false,
// 打开或关闭对 Redis 调用的追踪
'redis' => false,
'db' => false,
],
];
选择追踪器驱动
配置文件内的 default
对应的值则为使用的驱动名称。驱动的具体配置在 tracer
项下定义,使用与 key
相同的驱动。
注意,如示例配置所示,您可以配置多套 Zipkin 驱动或 Jaeger 驱动。虽然采用的底层系统一样,但他们的具体配置可以不同。一种常见场景是我们希望测试环境 100% 采样,但在生产环境下 1% 采样,就可以配置两套驱动,然后根据 default
项下的环境变量来选择不同的驱动。
配置 Zipkin
使用 Zipkin 时,在配置文件中的 项增加 Zipkin 的具体配置。
<?php
use Zipkin\Samplers\BinarySampler;
return [
// 选择默认的 Tracer
'default' => env('TRACER_DRIVER', 'zipkin'),
// 这里的代码演示不对 enable 内的配置进行展开
'enable' => [],
'tracer' => [
// Zipkin 驱动配置
'zipkin' => [
// 当前应用的配置
'app' => [
'name' => env('APP_NAME', 'skeleton'),
// 如果 ipv6 和 ipv6 为空组件会自动从 Server 中检测
'ipv4' => '127.0.0.1',
'ipv6' => null,
'port' => 9501,
'options' => [
// Zipkin 服务的 endpoint 地址
'endpoint_url' => env('ZIPKIN_ENDPOINT_URL', 'http://localhost:9411/api/v2/spans'),
'timeout' => env('ZIPKIN_TIMEOUT', 1),
],
// 采样器,默认为所有请求的都追踪
'sampler' => BinarySampler::createAsAlwaysSample(),
],
],
];
配置 Jaeger
关于 Jaeger 的更多配置可以在 [这里] 查看。
配置中间件
配置完驱动之后,采集信息还需要配置一下中间件才能启用采集功能。打开 config/autoload/middlewares.php
文件,在 http
节点启用中间件。
<?php
declare(strict_types=1);
return [
'http' => [
\Hyperf\Tracer\Middleware\TraceMiddeware::class,
],
];
默认的采样器为所有请求都记录调用链,这对性能会存在一定程度上的影响,尤其是内存的占用,所以我们只需要在我们希望的时候才对调用链进行追踪,那么我们就需要对采样器进行更换,更换也很简单,以 Zipkin 为例,只需对配置项 opentracing.zipkin.sampler
对应的值改为您的采样器对象实例即可,只要您的采样器对象实现了 Zipkin\Sampler
接口类即可。
接入阿里云链路追踪服务
您也可以使用其他任意符合OpenTracing协议的Tracer驱动。在Driver项中,填写任意实现了Hyperf\Tracer\Contract\NamedFactoryInterface
的类就可以了。该接口只有一个make函数,参数为驱动名称,需返回一个实现了OpenTracing\Tracer的实例。