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】链路追踪的更多相关文章

  1. 微服务 Zipkin 链路追踪原理(图文详解)

    一个看起来很简单的应用,可能需要数十或数百个服务来支撑,一个请求就要多次服务调用. 当请求变慢.或者不能使用时,我们是不知道是哪个后台服务引起的. 这时,我们使用 Zipkin 就能解决这个问题. 由 ...

  2. 微服务SpringCloud之zipkin链路追踪

    随着业务发展,系统拆分导致系统调用链路愈发复杂一个前端请求可能最终需要调用很多次后端服务才能完成,当整个请求变慢或不可用时,我们是无法得知该请求是由某个或某些后端服务引起的,这时就需要解决如何快读定位 ...

  3. zipkin链路追踪

    zipkin架构说明 zipkin api 我想自己搞一些满足zipkin格式的日志,入库es,然后让zipkin仅做展示 1.需要了解zipkin组件 2,学习zipkin设计原理,何时何地产生日志 ...

  4. SpringCloud:Zipkin链路追踪,并将数据写入mysql

    1.zipkin server 1.1.新建Springboot项目,zinkin 1.2.添加依赖 <dependency> <groupId>io.zipkin.java& ...

  5. 原理分析dubbo分布式应用中使用zipkin做链路追踪

    zipkin是什么 Zipkin是一款开源的分布式实时数据追踪系统(Distributed Tracking System),基于 Google Dapper的论文设计而来,由 Twitter 公司开 ...

  6. 原理分析dubbo分布式应用中使用zipkin做链路追踪(转)

    作者:@nele本文为作者原创,转载请注明出处:https://www.cnblogs.com/nele/p/10171794.html 目录 zipkin是什么为什么使用Zipkinzipkin架构 ...

  7. 基于zipkin分布式链路追踪系统预研第一篇

    本文为博主原创文章,未经博主允许不得转载. 分布式服务追踪系统起源于Google的论文“Dapper, a Large-Scale Distributed Systems Tracing Infras ...

  8. zipkin分布式链路追踪系统

    基于zipkin分布式链路追踪系统预研第一篇   分布式服务追踪系统起源于Google的论文“Dapper, a Large-Scale Distributed Systems Tracing Inf ...

  9. Spring Cloud Sleuth服务链路追踪(zipkin)(转)

    这篇文章主要讲述服务追踪组件zipkin,Spring Cloud Sleuth集成了zipkin组件. 一.简介 Spring Cloud Sleuth 主要功能就是在分布式系统中提供追踪解决方案, ...

  10. 链路追踪工具之Zipkin学习小记

    (接触了Zipkin,权将所了解或理解的记于此,以备忘) 分布式追踪系统 随着业务发展,系统拆分多个微服务.此时对于一个前端请求可能需要调用多个后端端服务才能完成,当整个请求变慢或不可用时,我们是无法 ...

随机推荐

  1. 跨域(三)——JSONP

    一.什么是JSONP? 百度百科:JSONP(JSON with Padding)是JSON的 一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题.由于同源策略,一般来说位于 server1. ...

  2. Servlet之ServletContext获取web上下文路径、全局参数、和Attribute(域)

    1)获取web上下文路径 public void doGet(HttpServletRequest request, HttpServletResponse response) throws Serv ...

  3. dependencies与dependencyManagement的区别

    1.DepencyManagement应用场景 当我们的项目模块很多的时候,我们使用Maven管理项目非常方便,帮助我们管理构建.文档.报告.依赖.scms.发布.分发的方法.可以方便的编译代码.进行 ...

  4. android apk 在哪个目录下安装?

    system/app系统自带的应用程序,无法删除.data/app用户程序安装的目录,有删除权限.安装时把apk文件复制到此目录.data/data存放应用程序的数据

  5. jquery实现分页+单删批删

    //定义一个分页的方法 public function fenye(){ //查询满足条件的总条数 $count = M("regis")->count(); //设置每页显 ...

  6. Android DevArt3:SingleTask启动模式探究:首先从MainActivity启动案例入口AActivity,并在A中启动BActivity,从B启动CActivity, 再从C中又启动AActivity, 最后在A中启动B,现在按两次back键,然后回到的是哪个Activity? 答案是,回到MainActivity。

    SingleTask启动模式探究 GitHub如题:首先从MainActivity启动案例入口AActivity,并在A中启动BActivity,从B启动CActivity,再从C中又启动AActiv ...

  7. HTML+CSS基础课程

    慕课网上的课程 为了方便以后查阅 现做笔记如下 首先 了解下面的知识 1. HTML是网页内容的载体.内容就是网页制作者放在页面上想要让用户浏览的信息,可以包含文字.图片.视频等. 2. CSS样式是 ...

  8. MVC part4

    SpringMVC 注解 @Controller 负责注册一个bean 到spring 上下文中,bean 的ID 默认为类名称开头字母小写,你也可以自己指定, 如下 方法一: @Controller ...

  9. CMake Error at cmake/OpenCVUtils.cmake

    CMake Error at cmake/OpenCVUtils.cmake:1047 (message): Failed to download . Status= Call Stack (most ...

  10. spring-boot-starter-data-elasticsearch 整合elasticsearch 5.x详解

    1.使用原因 近期公司在开发新的项目用到了elasticsearch ,因为项目框架用的spring Cloud所以依赖全用的是starter,从网上找的信息比较旧,并没有整合elasticsearc ...