【zipkin】链路追踪
1,安装zipkin:https://zipkin.io/pages/quickstart.html
推荐使用docker去安装zipkin服务,下载安装执行都有了。缺点是下载要等待一段时间
2,使用php来构造tracing数据,投递给zipkin
用的包是:https://github.com/jcchavezs/zipkin-php
安装推荐使用composer,找个空目录直接执行composer命令就好
实战1:demo先跑起来
<?php
require "vendor/autoload.php"; use Zipkin\Annotation;
use Zipkin\Endpoint;
use Zipkin\Samplers\BinarySampler;
use Zipkin\TracingBuilder;
use Zipkin\Reporters\Http; $endpoint = Endpoint::createFromGlobals(); $reporter = new Http();
$sampler = BinarySampler::createAsAlwaysSample();
$tracing = TracingBuilder::create()
->havingLocalEndpoint($endpoint)
->havingSampler($sampler)
->havingReporter($reporter)
->build(); $tracer = $tracing->getTracer(); $span = $tracer->newTrace();
$span->setName("encode");
$span->start();
try {
usleep(100000); } finally {
$span->finish();
} $tracer->flush();
执行以上脚本,打开zipkin的查看界面:127.0.0.1:9411,找到cli然后可以看到一条追踪记录。

可以看到zipkin的查看界面中多了条tracing记录。
这里需要解释下图中的东西:
1,cli:是serviceName,对应于你的服务名称(比如图片服务等)
2,执行时间:100ms,对应这次服务时间,从请求到相应是100ms;
3,encode;这个表示span的名称,span在zipkin的函数是某个节点(或者记录),和html的span有类似的含义。是个树状结构,可以有平级兄弟,和父子节点。
再次解释下图中的东西和原始数据的关系:
1,cli是serviceName,它是在这个动作中埋入的:Endpoint::createFromGlobals(),可以看到源码中有:new self(PHP_SAPI, ...);
2,执行时间:100ms,对应到usleep函数;
3,encode:是span的名称,对应的函数是setName()操作。
然后我们来分析下tracing主要做的事情:
1,在每个节点处(span)打点,初始化时设置context上下文(暂时忽略这个概念),name(span名称);
2,span节点开始时执行start操作,记录当前时间戳;
3,span节点结束时执行finish操作,记录结束时间戳;
这样就产生了一条span记录,包含:context,span-name,start-time,end-time。
然后我们再理解下context有哪些数据项。
traceId:追踪链的根节点id,刚才说span是树状结构,那么就需要个根节点id,类似于root-id;
spanId:当前span节点的id,和树的node-id是类似的;
parentId:当前span的父节点id,和树的parent-id是类似的;
context中可以设置traceId,和parentId,需要上下文传递过来,接下来有具体的例子来设置span的context。
spanId如何设置的呢?$tracer->newTrace() 这个操作是生成一个新的span节点,生成节点时会先生成TraceContext,同步会初始化spanId。
实战2:生成父子节点,生成兄弟节点
<?php
require "vendor/autoload.php"; use Zipkin\Annotation;
use Zipkin\Endpoint;
use Zipkin\Samplers\BinarySampler;
use Zipkin\TracingBuilder;
use Zipkin\Reporters\Http; $endpoint = Endpoint::createFromGlobals();
$endpoint = Endpoint::create("php-demo"); $reporter = new Http();
$sampler = BinarySampler::createAsAlwaysSample();
$tracing = TracingBuilder::create()
->havingLocalEndpoint($endpoint)
->havingSampler($sampler)
->havingReporter($reporter)
->build(); $tracer = $tracing->getTracer(); $span = $tracer->newTrace();
$span->setName("encode");
$span->start();
try {
$parentContext = $span->getContext();
$childSpan = $tracer->newChild($parentContext);
$childSpan->setName("encode1");
$childSpan->start();
usleep(100000);
$childSpan->finish(); $childSpan2 = $tracer->newChild($parentContext);
$childSpan2->setName("encode2");
$childSpan2->start();
usleep(100000);
$childSpan2->finish(); } finally {
$span->finish();
} $tracer->flush();
zipkin的追踪结果:

可以看到有三个span,encode是根节点,有两个儿子(encode1和encode2)。
重点就是newChild($parentContext),把父节点的信息传入到新的span节点就能实现两者之间的对应关系了。
相关的文章链接:
zipkin核心数据结构:https://my.oschina.net/guol/blog/871678
zipkin api接口:https://zipkin.io/zipkin-api/#/default/post_spans
zipkin api文档:https://github.com/openzipkin/zipkin-api/blob/master/zipkin-api.yaml#L56
jwt入门介绍:https://www.cnblogs.com/zaixiuxing/p/6005968.html
golang body长度:https://stackoverflow.com/questions/43021058/golang-read-request-body
【zipkin】链路追踪的更多相关文章
- 微服务 Zipkin 链路追踪原理(图文详解)
一个看起来很简单的应用,可能需要数十或数百个服务来支撑,一个请求就要多次服务调用. 当请求变慢.或者不能使用时,我们是不知道是哪个后台服务引起的. 这时,我们使用 Zipkin 就能解决这个问题. 由 ...
- 微服务SpringCloud之zipkin链路追踪
随着业务发展,系统拆分导致系统调用链路愈发复杂一个前端请求可能最终需要调用很多次后端服务才能完成,当整个请求变慢或不可用时,我们是无法得知该请求是由某个或某些后端服务引起的,这时就需要解决如何快读定位 ...
- zipkin链路追踪
zipkin架构说明 zipkin api 我想自己搞一些满足zipkin格式的日志,入库es,然后让zipkin仅做展示 1.需要了解zipkin组件 2,学习zipkin设计原理,何时何地产生日志 ...
- SpringCloud:Zipkin链路追踪,并将数据写入mysql
1.zipkin server 1.1.新建Springboot项目,zinkin 1.2.添加依赖 <dependency> <groupId>io.zipkin.java& ...
- 原理分析dubbo分布式应用中使用zipkin做链路追踪
zipkin是什么 Zipkin是一款开源的分布式实时数据追踪系统(Distributed Tracking System),基于 Google Dapper的论文设计而来,由 Twitter 公司开 ...
- 原理分析dubbo分布式应用中使用zipkin做链路追踪(转)
作者:@nele本文为作者原创,转载请注明出处:https://www.cnblogs.com/nele/p/10171794.html 目录 zipkin是什么为什么使用Zipkinzipkin架构 ...
- 基于zipkin分布式链路追踪系统预研第一篇
本文为博主原创文章,未经博主允许不得转载. 分布式服务追踪系统起源于Google的论文“Dapper, a Large-Scale Distributed Systems Tracing Infras ...
- zipkin分布式链路追踪系统
基于zipkin分布式链路追踪系统预研第一篇 分布式服务追踪系统起源于Google的论文“Dapper, a Large-Scale Distributed Systems Tracing Inf ...
- Spring Cloud Sleuth服务链路追踪(zipkin)(转)
这篇文章主要讲述服务追踪组件zipkin,Spring Cloud Sleuth集成了zipkin组件. 一.简介 Spring Cloud Sleuth 主要功能就是在分布式系统中提供追踪解决方案, ...
- 链路追踪工具之Zipkin学习小记
(接触了Zipkin,权将所了解或理解的记于此,以备忘) 分布式追踪系统 随着业务发展,系统拆分多个微服务.此时对于一个前端请求可能需要调用多个后端端服务才能完成,当整个请求变慢或不可用时,我们是无法 ...
随机推荐
- php & 变量引用、函数引用、对象引用
变量的引用 PHP 的引用允许你用两个变量来指向同一个内容 <?php $a="ABC"; $b =&$a; echo $a;//这里输出:ABC ec ...
- 初识AutoMapper
在开始本篇文章之前,先来思考一个问题:一个项目分多层架构,如显示层.业务逻辑层.服务层.数据访问层.层与层访问需要数据载体,也就是类.如果多层通用一个类,一则会暴露出每层的字段,二者会使类字段很多,而 ...
- python实现最大重叠子串的查找
#!/usr/bin/python #查找最大重叠子串 def FindMaxDup(in_str): str_len = len(in_str) result = '' #逐级扩大搜索长度# lev ...
- shell命令中用source 和sh(或者bash)执行脚本的区别,以及export的作用
用户登录到Linux系统后,系统将启动一个用户shell,我们暂且称这个shell为shell父. 在这个shell父中,可以使用shell命令或声明变量,也可以创建并运行shell脚本程序. 当使用 ...
- jsp 获取服务器ip 以及端口号
<a href=<%="http://"+request.getLocalAddr()+":"+request.getLocalPort()+&qu ...
- subline 相关
ctrl + ` 输入命令: import urllib.request,os; pf = 'Package Control.sublime-package'; ipp = sublime.insta ...
- monkeyrunner学习笔记
前面部分内容转自http://blog.csdn.net/zm2714/article/details/7980634 Android自动化测试之Monkeyrunner使用方法及实例 目前andro ...
- macbook pro。已经连接上wifi,但是,不能上网的问题
有天,macbook pro关机后,再打开就上不了网了,后面网上看了,说是安装了 lantern出问题,我一想,有次关机lantern是被我强制关掉的.所以再次打开lantern就可以 上网了,然后正 ...
- NYOJ201-作业题-(dp)
201-作业题 内存限制:64MB 时间限制:3000ms 特判: No通过数:9 提交数:28 难度:3 题目描述: 小白同学这学期有一门课程叫做<数值计算方法>,这是一门有效使用数字计 ...
- KADEMLIA算法学习
在上一篇文章中<P2P技术是什么>,我们介绍了P2P技术的特点以及发展历史.在本篇文章中,我们来介绍某一个具体的算法. 如今很多P2P网络的实现都采用DHT的方式实现查找,其中Kademl ...