数据追踪系统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

 

posted on 2017-03-20 10:20  周~~  阅读(3701)  评论(0编辑  收藏  举报

导航