本项目属于swoft的zipkin client,非侵入式地对项目环境进行跟踪并且异步上报到zipkin server,可以和其他的swoft项目或者其他语言(java,go)进行全链路监控。
"jcchavezs/zipkin-opentracing": "^0.1.2",
"opentracing/opentracing": "1.0.0-beta5",
"extraswoft/zipkin": "*"
因为opentracing/opentracing的最新版本是一个dev版本,所以外部项目comoposer引入是会报错的,所以需要显示的把配置放入composer.json,然后 composer update。
'beanScan' => [
"ExtraSwoft\\Zipkin\\"
],
'serverDispatcher' => [
'middlewares' => [
\Swoft\View\Middleware\ViewMiddleware::class,
ZipkinMiddleware::class
// \Swoft\Devtool\Middleware\DevToolMiddleware::class,
// \Swoft\Session\Middleware\SessionMiddleware::class,
]
],
#Zipkin
ZIPKIN_HOST=http://0.0.0.0:9411
ZIPKIN_RAND=100
当我们使用swoft官方的httpClient的时候,需要使用我们客户端的adapter
$client = new Client(['adapter' => new AddZipkinAdapter()]);
当然,你也可以看下我们适配器的源码放到自己的适配器里,比较简单
因为在mysql,redis和http的请求上没有钩子函数,所以我们需要自己实现,只要在请求开始和结束加上事件触发即可。建议自己或者公司项目直接fork官方的swoft-component,然后根据自己需要开发,并且隔一段时间同步最新代码,在swoft里面composer使用component这个仓库。
Log::profileStart($profileKey);
+ App::trigger('Mysql', 'start', $profileKey, $sql);
$connection->prepare($sql);
$params = self::transferParams($params);
$result = $connection->execute($params);
$this->release();
Log::profileEnd($this->profileKey);
+ App::trigger('Mysql', 'end', $this->profileKey);
return $result;
$connectPool = App::getPool($this->poolName);
/* @var ConnectionInterface $client */
$connection = $connectPool->getConnection();
+ App::trigger('Redis', 'start', $method, $params);
$result = $connection->$method(...$params);
$connection->release(true);
+ App::trigger('Redis', 'end');
return $result;
if ($query !== '') $path .= '?' . $query;
$client->setDefer();
+ App::trigger('HttpClient', 'start', $request, $options);
$client->execute($path);
App::profileEnd($profileKey);
$this->recv();
$result = $client->body;
$client->close();
+ App::trigger('HttpClient', 'end');
$headers = value(function () {
$headers = [];
docker run -d -p 9411:9411 openzipkin/zipkin
每个swoft项目通过这些步骤后都可以进行监控了,下面是两个swoft采用之后的全链路效果图
如果你想对全链路有更深的了解或者对我的项目实现有所了解,甚至想应用到其他php框架或者其他语言上去,可以看下我写的这篇文章php全链路监控完全实现(swoft举例)