extraswoft/zipkin

zipkin-sdk for swoft

v0.0.0.1 2018-10-16 12:48 UTC

This package is not auto-updated.

Last update: 2022-09-28 17:08:43 UTC


README

简介

本项目属于swoft的zipkin client,非侵入式地对项目环境进行跟踪并且异步上报到zipkin server,可以和其他的swoft项目或者其他语言(java,go)进行全链路监控。

配置步骤

1.composer

        "jcchavezs/zipkin-opentracing": "^0.1.2",
        "opentracing/opentracing": "1.0.0-beta5",
        "extraswoft/zipkin": "*"

因为opentracing/opentracing的最新版本是一个dev版本,所以外部项目comoposer引入是会报错的,所以需要显示的把配置放入composer.json,然后 composer update

2.config/properties/app.php 添加

需要在app文件,beanScan里加上扫描我们的命名空间

      'beanScan' => [
        "ExtraSwoft\\Zipkin\\"
    ],

3.config/beans/base.php添加我们的中间件

    'serverDispatcher' => [
        'middlewares' => [
            \Swoft\View\Middleware\ViewMiddleware::class,
            ZipkinMiddleware::class
//             \Swoft\Devtool\Middleware\DevToolMiddleware::class,
            // \Swoft\Session\Middleware\SessionMiddleware::class,
        ]
    ],

4.在.env配置文件中添加以下配置

ZIPKIN_HOST: zipkin server 的地址
ZIPKIN_RAND: 采样率,100为100%
  #Zipkin
ZIPKIN_HOST=http://0.0.0.0:9411
ZIPKIN_RAND=100

5.httpClient 的修改

当我们使用swoft官方的httpClient的时候,需要使用我们客户端的adapter

$client = new Client(['adapter' => new AddZipkinAdapter()]);

当然,你也可以看下我们适配器的源码放到自己的适配器里,比较简单

源码修改

因为在mysql,redis和http的请求上没有钩子函数,所以我们需要自己实现,只要在请求开始和结束加上事件触发即可。建议自己或者公司项目直接fork官方的swoft-component,然后根据自己需要开发,并且隔一段时间同步最新代码,在swoft里面composer使用component这个仓库。

1.mysql(协程)

src/db/src/Db.php中,在$connection->prepare($sql);前添加(注意命名空间加入)

         Log::profileStart($profileKey);
+        App::trigger('Mysql', 'start', $profileKey, $sql);
         $connection->prepare($sql);
         $params = self::transferParams($params);
         $result = $connection->execute($params);

src/db/src/DbCoResult.php中,在Log::profileEnd($this->profileKey);后添加(注意命名空间加入)

         $this->release();

         Log::profileEnd($this->profileKey);
+        App::trigger('Mysql', 'end', $this->profileKey);
         return $result;

2.redis (非协程),协程可以根据自己需要添加

src/redis/src/Redis.php(注意命名空间加入)

在 $result = $connection->$method(...$params);前后添加

         $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;

3.httpClient (协程)

src/http-client/src/Adapter/CoroutineAdapter.php

在 $client->execute($path);前添加

 if ($query !== '') $path .= '?' . $query;

         $client->setDefer();
+        App::trigger('HttpClient', 'start', $request, $options);
         $client->execute($path);

         App::profileEnd($profileKey);

src/http-client/src/HttpCoResult.php

在 $client->close();后添加

         $this->recv();
         $result = $client->body;
         $client->close();
+        App::trigger('HttpClient', 'end');
         $headers = value(function () {
             $headers = [];

完成

完成以上修改后,重新composer引入新的包,然后重启项目就可以了

使用zipkin server

   docker run -d -p 9411:9411 openzipkin/zipkin

效果图

每个swoft项目通过这些步骤后都可以进行监控了,下面是两个swoft采用之后的全链路效果图 zipkin httpClient

zipkin httpClient2

后记

如果你想对全链路有更深的了解或者对我的项目实现有所了解,甚至想应用到其他php框架或者其他语言上去,可以看下我写的这篇文章php全链路监控完全实现(swoft举例)