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