数据追踪系统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)
技术背景 在微服务架构中,随着业务发展,系统拆分导致系统调用链路愈发复杂,一个看似简单的前端请求可能最终需要调用很多次后端服务才能完成,那么当整个请求出现问题时,我们很难得知到底是哪个服务出了问题导致 ...
随机推荐
- TypeScript 装饰器
装饰器(Decorators)可用来装饰类,属性,及方法,甚至是函数的参数,以改变和控制这些对象的表现,获得一些功能. 装饰器以 @expression 形式呈现在被装饰对象的前面或者上方,其中 ex ...
- 屏蔽“您目前使用的Discuz!程序有新版本发布,请及时升级!”提示
在/discuz/source/admincp目录下找到文件:admincp_main.php 找到第49行: if($_G['uid'] && $_G['member']['allo ...
- CentOS yum安装mcrypt
CentOS yum安装mcrypt 本篇排错的前提是只想用yum安装,不想使用源码包编译安装. php依赖一下包: #yum install libmcrypt libmcrypt-deve ...
- Hibernate基础案例1
使用到的是MySQL数据库 1.在项目中先引入jar包,并添加引用 <dependencies> <dependency> <groupId>junit</g ...
- 【Shell脚本学习25】Shell文件包含
像其他语言一样,Shell 也可以包含外部脚本,将外部脚本的内容合并到当前脚本. Shell 中包含脚本可以使用: . filename 或 source filename 两种方式的效果相同,简单起 ...
- PHP报错configure error Cannot find libmysqlclient under usr
编译PHP报错configure error Cannot find libmysqlclient under usr的解决方法 (问题产生,mysql是yum安装的,libmysqlclient* ...
- (转载)office 2003 gaozhi.msi 缺失提示问题修复
某些GHOST版win7,自带office 2003,每次启动word,它都会提示"稿纸没安装"云云,找不到那个文件.可是我搜遍了硬盘,确实没有那个文件.每次都要点取消,这个提示才 ...
- draggable与overflow同时存在,无法拖拽出父元素问题解决
在使用jquery-ui的拖拽功能对列表内的选项拖拽时,发现无法将选项拖拽出列表的范围,一出范围就自动隐藏在列表下,查找到最后的原因是css中的overflow的原因,overflow存在则不能将选项 ...
- linux 命令——38 cal (转)
cal命令可以用来显示公历(阳历)日历.公历是现在国际通用的历法,又称格列历,通称阳历.“阳历”又名“太阳历”,系以地球绕行太阳一周为一年,为西方各国所通用,故又名“西历”. 1.命令格式: cal ...
- 使用HANA Web-based Development Workbench创建最简单的Server Side JavaScript
服务器端的JavaScript, 看下wikipedia的介绍: https://en.wikipedia.org/wiki/JavaScript#Server-side_JavaScript Ser ...