【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,权将所了解或理解的记于此,以备忘) 分布式追踪系统 随着业务发展,系统拆分多个微服务.此时对于一个前端请求可能需要调用多个后端端服务才能完成,当整个请求变慢或不可用时,我们是无法 ...
随机推荐
- HBase 入门
使用条件: 海量数据百亿级的行 百万列, 准实时查询 使用场景: 比如金融,交通,电商,移动等 特点: 1:
- win7下iis的配置问题
开始asp的学习时,首先得配置iis服务,中途遇到各种问题也谷歌了不少,但是答案都很凌乱,折腾了两天才彻底解决这个问题.下面是我坎坷的配置过程,希望对你有所帮助: 第一步:打开Internet信息服务 ...
- jquery接触初级----- 一种新奇的选择器用法
今天看到一个新奇的jquery 选择器的用法,因为以前没有见过,所以记录下来 1.jquery 选择器: 给body添加一个元素,添加元素的时候,同时把属性和点击事件都一起进行添加 <!DOCT ...
- css:清楚浮动
这个清楚浮动的方法最常用,给浮动字元素的父盒子,也就是不浮动元素,添加一个lhearfix的类,其类的css样式为: .clearfix:after{ /*必须要写这三句话*/ content:''; ...
- Extjs实现Grid表格显示【一】
Ext.onReady(function(){ // Ext.Msg.alert("提示","hello world!! "); var stu =new Ex ...
- 使用__slots__限制实例的属性
1.给实例化的对象添加新的属性 看下面一段代码,然后给实例化的对象s添加或者修改属性 class Student(object): name='china' s = Student() s1=Stud ...
- MS SQL大值数据类型varchar(max)、nvarchar(max)、varbinary(max)
在MS SQL2005及以上的版本中,加入大值数据类型(varchar(max).nvarchar(max).varbinary(max) ).大值数据类型最多可以存储2^30-1个字节的数据. 这几 ...
- CSS 颜色
color属性可以指定HTML文本的颜色. HTML的颜色采用以下3种方式表示. RGB值 使用红色.绿色.蓝色等不同比例表示,如 1 rgb(100,90,90) 值在0~255之间. 十六进制编码 ...
- BOS物流项目第十一天
教学计划 1.在realm中进行授权 2.使用shiro的方法注解方式权限控制 a. 在spring文件中配置开启shiro注解支持 b. 在Action方法上使用注解 3.使用shiro的标签进 ...
- “2017面向对象程序设计(Java)第十一周学习总结”存在问题的反馈及教学安排
“2017面向对象程序设计(Java)第十一周学习总结”存在问题的反馈及教学安排1.“提出表扬的同学:姜依萍,王雪玲,徐楠,相文君,赵晓未提交作业的同学:任红强,王瑞强,宗鹏新,扎西才让,布旦刀杰,范 ...