链路跟踪工具zipkin——k8s从入门到高并发系列教程(十四)
使用zipkin 链路跟踪工具,找出时间都消耗在哪了
ads:
关注以下公众号查看更多文章
我们的项目包含基于yaf框架的test_api和test_client1微服务,相互之间通过hprose做微服务调用,需要找出接口耗时点。这次使用zipkin 链路跟踪工具,找出时间都消耗在哪了。先看一下效果图
从图中看出,有大概15ms被hprose消耗了
安装zipkin
docker
docker 运行 zipkin 命令如下,k8s自行翻译
docker run -d -p 9411:9411 openzipkin/zipkin
php
php安装zipkin的composer包 openzipkin/zipkin
composer require openzipkin/zipkin
统计接口总耗时
在api项目的index.php文件开始和结束处添加代码,统计接口总耗时
开始处打点
$endpoint = Endpoint::create(getenv("APP_NAME"));
$reporter = new Http(['endpoint_url' => getenv("APP_ROUTE_TRACE")]);
$sampler = BinarySampler::createAsAlwaysSample();
$tracing = TracingBuilder::create()
->havingLocalEndpoint($endpoint)
->havingSampler($sampler)
->havingReporter($reporter)
->build();
$this->setTracer($tracing);
$this->setSpan($this->getTracer()->getTracer()->newTrace());
$this->getSpan()->setName($_SERVER['REQUEST_URI']);
$this->getSpan()->start();
主要是新建了一个 tracer跟踪整个请求和一个root span 跟踪单个服务的请求,
endpoint设置名称为微服务名称 test_api
reporter设置上报地址为zipkin的地址,目前是 http://zipkin:9411/api/v2/spans
span名称为接口请求路径 $_SERVER['REQUEST_URI']
最后是开始span
结束处打点
(self::$instance)->getSpan()->finish();
(self::$instance)->getTracer()->getTracer()->flush();
主要是把span结束掉 trace 刷新出来
微服务调用客户端实现
微服务客户端统计rpc调用时长
rpc开始处
$span = (self::$instance)->getTracer()->getTracer()->newChild((self::$instance)->getSpan()->getContext());
$span->setName($service_name . "_" . $client_url);
$span->setKind(Zipkin\Kind\CLIENT);
$span->setRemoteEndpoint(Endpoint::create($service_name));
$span->start();
$injector = (self::$instance)->getTracer()->getPropagation()->getInjector(new \Zipkin\Propagation\Map());
$origin_header_arr = [];
$injector($span->getContext(), $origin_header_arr);
foreach ($origin_header_arr as $origin_header_key => $origin_header_value){
$client->setHeader($origin_header_key, $origin_header_value);
}
从root span创建了一个child span跟踪微服务调用,名称为 微服务名+调用地址
在rpc请求的header中加入 zipkin 的跟踪上下文信息
rpc结尾处
$span->finish();
微服务调用服务端实现
rpc server开始处
$endpoint = Endpoint::create(getenv("APP_NAME"));
$reporter = new Http(['endpoint_url' => getenv("APP_ROUTE_TRACE")]);
$sampler = BinarySampler::createAsAlwaysSample();
$tracing = TracingBuilder::create()
->havingLocalEndpoint($endpoint)
->havingSampler($sampler)
->havingReporter($reporter)
->build();
$this->setTracer($tracing);
$extractor = $this->getTracer()->getPropagation()->getExtractor(new ServerHeaders);
$extracted = $extractor($_SERVER);
$this->setSpan($this->getTracer()->getTracer()->newChild($extracted));
$this->getSpan()->setName(curPageURL());
$this->getSpan()->setKind(Zipkin\Kind\SERVER);
$this->getSpan()->start();
从$_SERVER中拿到zipkin提交的trace信息,并以此创建一个child span
span名称为接口地址
rpc server 结尾处
(self::$instance)->getSpan()->finish();
(self::$instance)->getTracer()->getTracer()->flush();
主要是把span结束掉 trace 刷新出来
相关链接
常用开发工具:php_codesniffer代码规范检查&修复、phpstan语法检查、phpunit单元测试
.gitlab-ci.yaml自动镜像打包&&互联网企业规范化上线流程(上)
更多推荐
所有评论(0)