数据追踪系统Zipkin 及其 Zipkin的php客户端驱动hoopak
Zipkin是Twitter的一个开源项目,是一个致力于收集Twitter所有服务的监控数据的分布式跟踪系统,它提供了收集数据,和查询数据两大接口服务。
Zipkin 是一款开源的分布式实时数据追踪系统(Distributed Tracking System),基于 Google Dapper 的论文设计而来,由 Twitter 公司开发贡献。其主要功能是聚集来自各个异构系统的实时监控数据,用来追踪微服务架构下的系统延时问题。

zipkin下载、启动服务器
下载
wget -O zipkin.jar 'https://search.maven.org/remote_content?g=io.zipkin.java&a=zipkin-server&v=LATEST&c=exec'
使用内存作为存储器启动
java -jar zipkin.jar
使用Mysql作为存储器启动
执行表的创建语句
https://github.com/openzipkin/zipkin/blob/master/zipkin-storage/mysql/src/main/resources/
启动
Linux下的启动方式
STORAGE_TYPE=mysql MYSQL_HOST=127.0.0.1 MYSQL_TCP_PORT=3306 MYSQL_DB=zipkindb MYSQL_USER=root MYSQL_PASS=123456 java -jar zipkin.jar
Window下的启动方式
set STORAGE_TYPE=mysql
set MYSQL_HOST=127.0.0.1
set MYSQL_TCP_PORT=3306
set MYSQL_DB=zipkindb
set MYSQL_USER=root
set MYSQL_PASS=123456
java -jar zipkin.jar
Zipkin的php客户端驱动hoopak(使用Scribe接口作为Transport)
hoopak使用thrift框架作为和Zipkin 的通讯工具。
hoopak的下载地址:https://github.com/Jimdo/hoopak
hoopak下载完后,要下载thrift的核心库
改动一下 hoopak
Hoopak\ZipkinTracer::record($trace, $annotation)
public function record($trace, $annotation)
{
$traceKey = $trace->traceId . ":" . $trace->spanId;
$this->_annotationsForTrace[$traceKey][] = $annotation; if (in_array($annotation->name, $this->_endAnnotations)) { // 两次发送一次
// $annotations = $this->_annotationsForTrace[$traceKey];
// unset($this->_annotationsForTrace[$traceKey]);
$annotations[] = array_pop($this->_annotationsForTrace[$traceKey]);
$annotations[] = array_pop($this->_annotationsForTrace[$traceKey]);
print_r(sprintf("Sending trace: %s w/ %s", $traceKey, var_export($annotations, true)));
$this->sendTrace($trace, $annotations);
}
}
测试代码
<?php
require_once __DIR__ . '/gen-php/Scribe/scribe.php';
require_once __DIR__ . '/gen-php/Scribe/Types.php';
require_once __DIR__ . '/gen-php/Zipkin/Types.php'; require_once __DIR__ . '/lib/Thrift/ClassLoader/ThriftClassLoader.php';
use Thrift\ClassLoader\ThriftClassLoader; $loader = new ThriftClassLoader();
$loader->registerNamespace('Thrift', __DIR__ . '/lib');
$loader->registerNamespace('Hoopak', __DIR__ . '/src');
$loader->register(); use Hoopak\Annotation;
use Hoopak\Endpoint;
use Hoopak\Trace;
use Hoopak\ScribeClient;
use Hoopak\ZipkinTracer; // 调用方法
$mZipkinTracerTest = new ZipkinTracerTest();
$mZipkinTracerTest->aTraceIsBase64EncodedWhenSendingItToScribe(); class ZipkinTracerTest
{
/**
* @test
*/
public function aTraceIsBase64EncodedWhenSendingItToScribe()
{
// spanId是一直不同的,但是维护者上下级嵌套关系
// traceId全局只有一个 $traceName = "trace-service-0";
$trace = new Trace($traceName, null, null, null, array(
$this->getZipkinTracer()
));
$trace->setEndpoint(new Endpoint("1.2.3.4", "8000", "service-0"));
$trace->record(Annotation::string("spam", "eggs")); // Annotation = array('name'=>'spam',value=>'eggs',annotationType=>'string',endpoint=>null)
$traceId = $trace->traceId;
$spanId = $trace->spanId; // 接受业务
$trace->record(Annotation::serverReceive()); // RPC调用
// invoke service 1 0--1
$trace->record(Annotation::clientSend()); // Annotation = array('name'=>'cs',value=>round(microtime(true) * 1000 * 1000),annotationType=>'timestamp',endpoint=>null)
$this->service1($traceName, $traceId, $spanId);
$trace->record(Annotation::clientReceive()); // Annotation = array('name'=>'cr',value=>round(microtime(true) * 1000 * 1000),annotationType=>'timestamp',endpoint=>null) // invoke service 2 0--2---3
$trace->record(Annotation::clientSend());
$this->service2($traceId, $spanId);
$trace->record(Annotation::clientReceive()); // 响应业务
usleep(500);
$trace->record(Annotation::serverSend()); } private function getZipkinTracer()
{
$scribe = new ScribeClient("localhost", 9410);
$zipkinTracer = new ZipkinTracer($scribe); //
return $zipkinTracer;
} /**
* 服务1
* @param unknown $parentName
* @param unknown $traceId
* @param unknown $parentSpanId
*/
private function service1($parentName, $traceId, $parentSpanId)
{
usleep(3000); // parse request
$trace = new Trace($parentName, $traceId, $parentSpanId, null, array(
$this->getZipkinTracer()
));
$trace1 = $trace->child("trace-service-1");
$trace1->setEndpoint(new Endpoint("10.1.2.1", "80", "service-1")); // 接受业务
$trace1->record(Annotation::serverReceive()); // Annotation = array('name'=>'sr',value=>round(microtime(true) * 1000 * 1000),annotationType=>'timestamp',endpoint=>null) // 处理业务
usleep(200000); // do something // 响应业务
$trace1->record(Annotation::serverSend()); // Annotation = array('name'=>'ss',value=>round(microtime(true) * 1000 * 1000),annotationType=>'timestamp',endpoint=>null)
} /**
* 服务2
* @param unknown $traceId
* @param unknown $parentSpanId
*/
private function service2($traceId, $parentSpanId)
{
usleep(3000); // parse request
$trace1 = new Trace("trace-service-2", $traceId, null, $parentSpanId, array(
$this->getZipkinTracer()
));
$trace1->setEndpoint(new Endpoint("10.1.2.2", "80", "service-2")); // 接受业务
$trace1->record(Annotation::serverReceive()); // 处理业务
usleep(20000); // do something // invoke service 3
$trace1->record(Annotation::clientSend());
$this->service3($traceId, $trace1->spanId);
$trace1->record(Annotation::clientReceive()); // 响应业务
$trace1->record(Annotation::serverSend());
} /**
* 服务3
* @param unknown $traceId
* @param unknown $parentSpanId
*/
private function service3($traceId, $parentSpanId)
{
usleep(3000); // parse request
$trace1 = new Trace("trace-service-3", $traceId, null, $parentSpanId, array(
$this->getZipkinTracer()
));
$trace1->setEndpoint(new Endpoint("10.1.2.3", "80", "service-3")); // 接受业务
$trace1->record(Annotation::serverReceive()); // 处理业务
usleep(300000); // do something // 响应业务
$trace1->record(Annotation::serverSend());
} }
class ScribeMock
{
public $messages = array(); public function log($category, $message)
{
$this->messages[] = $message;
}
}

简介:http://www.cnblogs.com/java-zhao/p/5835545.html
数据追踪系统Zipkin 及其 Zipkin的php客户端驱动hoopak的更多相关文章
- 基于CentOS搭建基于 ZIPKIN 的数据追踪系统
系统要求:CentOS 7.2 64 位操作系统 配置 Java 环境 安装 JDK Zipkin 使用 Java8 -openjdk* -y 安装完成后,查看是否安装成功: java -versio ...
- 分布式链路追踪系统Sleuth和ZipKin
1.微服务下的链路追踪讲解和重要性 简介:讲解什么是分布式链路追踪系统,及使用好处 进行日志埋点,各微服务追踪. 2.SpringCloud的链路追踪组件Sleuth 1.官方文档 http://cl ...
- Spring Cloud 整合分布式链路追踪系统Sleuth和ZipKin实战,分析系统瓶颈
导读 微服务架构中,是否遇到过这种情况,服务间调用链过长,导致性能迟迟上不去,不知道哪里出问题了,巴拉巴拉....,回归正题,今天我们使用SpringCloud组件,来分析一下微服务架构中系统调用的瓶 ...
- Laravel + go-micro + grpc 实践基于 Zipkin 的分布式链路追踪系统 摘自https://mp.weixin.qq.com/s/JkLMNabnYbod-b4syMB3Hw?
分布式调用链跟踪系统,属于监控系统的一类.系统架构逐步演进时,后期形态往往是一个平台由很多不同的服务.组件构成,用户请求过来后,可能会经过其中多个服务,如图 不过,出问题时往往很难排查,如整个请求变慢 ...
- 分布式链路监控与追踪系统Zipkin
1.分布式链路监控与追踪产生背景2.SpringCloud Sleuth + Zipkin3.分布式服务追踪实现原理4.搭建Zipkin服务追踪系统5.搭建Zipkin集成RabbitMQ异步传输6. ...
- 基于zipkin分布式链路追踪系统预研第一篇
本文为博主原创文章,未经博主允许不得转载. 分布式服务追踪系统起源于Google的论文“Dapper, a Large-Scale Distributed Systems Tracing Infras ...
- zipkin分布式链路追踪系统
基于zipkin分布式链路追踪系统预研第一篇 分布式服务追踪系统起源于Google的论文“Dapper, a Large-Scale Distributed Systems Tracing Inf ...
- Zipkin 分布式数据追踪系统
Zipkin 是一个分布式数据追踪系统,适用于微服务架构下的调用链路数据采集及分析工作. 可通过一个 Web 前端轻松的收集和分析数据,例如用户每次请求服务的处理时间等,可方便的监测系统中存在的瓶颈. ...
- Spring Boot + Spring Cloud 构建微服务系统(八):分布式链路追踪(Sleuth、Zipkin)
技术背景 在微服务架构中,随着业务发展,系统拆分导致系统调用链路愈发复杂,一个看似简单的前端请求可能最终需要调用很多次后端服务才能完成,那么当整个请求出现问题时,我们很难得知到底是哪个服务出了问题导致 ...
随机推荐
- Hive 基本语法操练(五):Hive 的 JOIN 用法
Hive 的 JOIN 用法 hive只支持等连接,外连接,左半连接.hive不支持非相等的join条件(通过其他方式实现,如left outer join),因为它很难在map/reduce中实现这 ...
- java注解相关
本文参考很多大神的文档,特别再次表示感谢分享!! 1.何为注解? 概念:注解(Annotation),也叫元数据.一种代码级别的说明. 它是JDK1.5及以后版本引入的一个特性,与类.接口.枚举是在 ...
- ASP.NET MVC CheckBoxFor为什么会生成hidden input控件
自己开发的公众号,可以领取淘宝内部优惠券 @Html.CheckBoxFor(m => m.Bool) 使用CheckBoxFor方法得到的html代码会是下面这个样子 <input ch ...
- React:关于在delegate中的confirm或者alert在多次弹出
如何试验出是delegate的过程就不解说了 直接上解决方案:(当然我的解决方案只适合一定情况) 取比较简单的代码来解说,例如 我一开始使用delegate的原因是由于我有部分html页面是ajax中 ...
- 从零开始的全栈工程师——js篇2.14(表单与计时器)
一.表单 Form input select textarea type=”radio/checkbox/password/button/text/submit/reset/” 表单的事件 oncha ...
- click事件的累加绑定
click事件的累加绑定,绑定一次点击事件,执行多次. 在页面中为一个元素绑定事件,事件执行后页面未刷新且元素还在,然后你再次点击,元素又被绑定一个点击事件,这样第二次点击就会执行两次,以此类推. 如 ...
- LeetCode(605,581,566)
LeetCode(605,581,566) 摘要:605盲改通过:581开始思路错误,后利用IDE修改(多重循环跳出方法):566用C语言时需要动态内存分配,并且入口参数未能完全理解,转用C++. 6 ...
- EBS应用重启
重启系统应用 cd $ADMIN_SCRIPTS_HOME ./adstpall.sh apps/apps ./adstrtal.sh apps/apps 在重启应用时,可能会出现并发管理器未启动的情 ...
- ArcGIS for Server新建站点异常,Failed to create the site.Failed to configure the server machine'XXXX',Server machine'XXXX' is not a local server machine.
系统环境:操作系统Win7 64位,装在虚拟机VM中,ArcGIS for Server 10.2.1 问题描述:ArcGIS for Server 10.2.1安装并授权完成后,站点初始化时显示 ...
- 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:0.概述
欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 序言 帖主和队友仿制了一个简单版的微信,其中,队友是用Unity3D做前段,帖主用Java的Mina.Hiberna ...