数据追踪系统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)
技术背景 在微服务架构中,随着业务发展,系统拆分导致系统调用链路愈发复杂,一个看似简单的前端请求可能最终需要调用很多次后端服务才能完成,那么当整个请求出现问题时,我们很难得知到底是哪个服务出了问题导致 ...
随机推荐
- Flask之目录结构
学习Flask,整合其目录结构也是比较重要的.一个最基础的Flask目录如下所示: 一.SQLAlchemy-utils 由于sqlalchemy中没有提供choice方法,所以借助SQLAlchem ...
- 全面理解HTTP协议
引言:作为一名软件工程Web专业学生,对于HTTP的熟悉掌握是必不可少的,特此做记录,打造自己的HTTP栈. URL与URI 我们经常接触到的就是URL了,它就是我们访问web的一个字符串地址,那么U ...
- RING0到RING3
在前一篇文章里面,我们将了CPU保护模式中的几种特权RING0,RING1,RING2,RING3!操作系统通常运行在RING0,应用程序通常运行在RING3. CPU如何从RING0到RING3 先 ...
- Python开发环境Wing IDE如何进行命令行调试
Wing IDE专业的调试探针提供了一种强大的方法来发现和解决复杂的错误.这很像Python Shell但允许用户直接参与进已经暂停的调试程序中: 通过键入在刚才发生异常的地方键入下列数值进行尝试: ...
- HDU3308 线段树区间合并
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308 ,简单的线段树区间合并. 线段树的区间合并:一般是要求求最长连续区间,在PushUp()函数中实 ...
- 使用SAP云平台的destination消费Internet上的OData service
通过SAP云平台上的destination我们可以消费Internet上的OData service或者其他通过HTTP方式暴露出来的服务. 创建一个新的destination: 维护如下属性: 点击 ...
- Linux I/O调度
一) I/O调度程序的总结 1) 当向设备写入数据块或是从设备读出数据块时,请求都被安置在一个队列中等待完成. 2) 每个块设备都有它自己的队列. 3) I/O调度程序负责维护这些队列的顺 ...
- POJ-3436 ACM Computer Factory---最大流+拆点
题目链接: https://vjudge.net/problem/POJ-3436 题目大意: 每台电脑有p个组成部分,有n个工厂加工电脑.每个工厂对于进入工厂的半成品的每个组成部分都有要求,由p个数 ...
- Java 发送邮件工具类
1. Mail.java package util; import java.util.Date; import java.util.Properties; import javax.mail.Au ...
- javaweb基础(27)_jsp标签库实例
一.开发标签库 1.1.开发防盗链标签 1.编写标签处理器类:RefererTag.java 1 package me.gacl.web.simpletag; 2 3 import java.io.I ...