數據追蹤系統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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM