数据追踪系统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)
技术背景 在微服务架构中,随着业务发展,系统拆分导致系统调用链路愈发复杂,一个看似简单的前端请求可能最终需要调用很多次后端服务才能完成,那么当整个请求出现问题时,我们很难得知到底是哪个服务出了问题导致 ...
随机推荐
- C# 枚举与switch用法
using System; namespace Csharp { class Program { //枚举 public enum TimeOfDay { Morning=, Afternoon=, ...
- Java中的Enum(枚举)用法介绍
1. 关于Java Enum:学过C/C++等语言的人,应该都对Enum类型略知一二.Enum一般用来表示一组相同类型的常量.如性别.日期.月份.颜色等.对这些属性用常量的好处是显而易见的,不仅可以保 ...
- HDU 5505——GT and numbers——————【素数】
GT and numbers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)To ...
- CentOS yum安装mcrypt
CentOS yum安装mcrypt 本篇排错的前提是只想用yum安装,不想使用源码包编译安装. php依赖一下包: #yum install libmcrypt libmcrypt-deve ...
- windows 2012 r2 x64 安装IIS注意事项
详细安装可以参考下面; https://jingyan.baidu.com/article/93f9803f234eade0e46f559f.html 下面只说一些注意事项,如果项目要用到wcf 的话 ...
- Apache activiti5.13工作流框架的表结构详解
1.结构设计 1.1. 逻辑结构设计 Activiti使用到的表都是ACT_开头的. ACT_RE_*: ’RE’表示repository(存储),RepositoryService接口所操作的 ...
- 碎碎念css
块状元素单独占一行,但加上float变成跟着别人,有空就插!float让块级元素变行内元素
- Mysql数据库操作语句总结(三)
最近一段时间重新学习一下mysql命令行的用法, 这里简单记录一下 参考文章: https://www.cnblogs.com/bluealine/p/7832219.html 个人使用的是mysql ...
- Spring Boot 的配置文件application.properties
Spring Boot 中的application.properties 是一个全局的配置文件,放在src/main/resources 目录下或者类路径的/config下. 作为全局配置文件的app ...
- System Center Configuration Manager 2016 域准备篇(Part4)
步骤4.创建系统管理容器 注意:在Active Directory域控制器服务器(AD01)上以本地管理员身份执行以下操作 有关您为何这样做的详细信息,请参阅https://docs.microsof ...