|
<?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());
// 响应业务
(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)
{
(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)
// 处理业务
(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)
{
(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());
// 处理业务
(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)
{
(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());
// 处理业务
(300000); // do something
// 响应业务
$trace1->record(Annotation::serverSend());
}
}
class ScribeMock
{
public $messages = array();
public function ($category, $message)
{
$this->messages[] = $message;
}
} |
|