diff --git a/src/Jaeger/Jaeger.php b/src/Jaeger/Jaeger.php index 72f2b46..9ba943c 100644 --- a/src/Jaeger/Jaeger.php +++ b/src/Jaeger/Jaeger.php @@ -16,6 +16,7 @@ namespace Jaeger; use Jaeger\Sampler\Sampler; +use OpenTracing\Exceptions\UnsupportedFormat; use OpenTracing\SpanContext; use OpenTracing\Formats; use OpenTracing\Tracer; @@ -44,6 +45,7 @@ class Jaeger implements Tracer{ public $processThrift = ''; + /** @var Propagator|null */ public $propagator = null; public function __construct($serverName = '', Reporter $reporter, Sampler $sampler, @@ -136,7 +138,7 @@ public function inject(SpanContext $spanContext, $format, &$carrier){ if($format == Formats\TEXT_MAP){ $this->propagator->inject($spanContext, $format, $carrier); }else{ - throw new \Exception("not support format $format"); + throw UnsupportedFormat::forFormat($format); } } @@ -150,7 +152,7 @@ public function extract($format, $carrier){ if($format == Formats\TEXT_MAP){ return $this->propagator->extract($format, $carrier); }else{ - throw new \Exception("not support format $format"); + throw UnsupportedFormat::forFormat($format); } } diff --git a/src/Jaeger/Propagator/JaegerPropagator.php b/src/Jaeger/Propagator/JaegerPropagator.php index 9290b31..763435f 100644 --- a/src/Jaeger/Propagator/JaegerPropagator.php +++ b/src/Jaeger/Propagator/JaegerPropagator.php @@ -30,17 +30,23 @@ public function inject(SpanContext $spanContext, $format, &$carrier){ } - /** - * 提取 - * @param string $format - * @param $carrier - */ public function extract($format, $carrier){ - $spanContext = new SpanContext(0, 0, 0, null, 0); - + $spanContext = null; + $carrier = array_change_key_case($carrier, CASE_LOWER); foreach ($carrier as $k => $v){ + + if(!in_array($k, [Constants\Tracer_State_Header_Name, + Constants\Jaeger_Debug_Header, Constants\Jaeger_Baggage_Header]) && + stripos($k, Constants\Trace_Baggage_Header_Prefix) === false){ + continue; + } + + if($spanContext === null){ + $spanContext = new SpanContext(0, 0, 0, null, 0); + } + if(is_array($v)){ $v = urldecode(current($v)); }else { diff --git a/src/Jaeger/Propagator/Propagator.php b/src/Jaeger/Propagator/Propagator.php index b3cc10c..d094e4d 100644 --- a/src/Jaeger/Propagator/Propagator.php +++ b/src/Jaeger/Propagator/Propagator.php @@ -32,7 +32,8 @@ public function inject(SpanContext $spanContext, $format, &$carrier); * 提取 * @param string $format * @param $carrier + * @return SpanContext|null */ public function extract($format, $carrier); -} \ No newline at end of file +} diff --git a/src/Jaeger/Propagator/ZipkinPropagator.php b/src/Jaeger/Propagator/ZipkinPropagator.php index 41f2f0d..7dfcb41 100644 --- a/src/Jaeger/Propagator/ZipkinPropagator.php +++ b/src/Jaeger/Propagator/ZipkinPropagator.php @@ -29,7 +29,19 @@ public function inject(SpanContext $spanContext, $format, &$carrier){ public function extract($format, $carrier){ - $spanContext = new SpanContext(0, 0, 0, null, 0); + $spanContext = null; + + foreach ($carrier as $k => $val) { + if (in_array($k, [Constants\X_B3_TRACEID, + Constants\X_B3_PARENT_SPANID, Constants\X_B3_SPANID, Constants\X_B3_SAMPLED]) + ) { + if($spanContext === null){ + $spanContext = new SpanContext(0, 0, 0, null, 0); + } + continue; + } + } + if(isset($carrier[Constants\X_B3_TRACEID]) && $carrier[Constants\X_B3_TRACEID]){ $spanContext->traceIdToString($carrier[Constants\X_B3_TRACEID]); } @@ -49,4 +61,4 @@ public function extract($format, $carrier){ return $spanContext; } -} \ No newline at end of file +} diff --git a/tests/JaegerTest.php b/tests/JaegerTest.php index 0bbcff4..df7578e 100644 --- a/tests/JaegerTest.php +++ b/tests/JaegerTest.php @@ -82,7 +82,7 @@ public function testInjectUnSupportFormat(){ $Jaeger->setPropagator(new JaegerPropagator()); $context = new SpanContext(1, 1, 1, null, 1); - $this->expectExceptionMessage('not support format http_headers'); + $this->expectExceptionMessage('The format \'http_headers\' is not supported.'); $Jaeger->inject($context, Formats\HTTP_HEADERS, $_SERVER); } @@ -106,7 +106,7 @@ public function testExtractUnSupportFormat(){ $Jaeger->setPropagator(new JaegerPropagator()); $_SERVER[strtoupper(Constants\Tracer_State_Header_Name)] = '1:1:1:1'; - $this->expectExceptionMessage('not support format http_headers'); + $this->expectExceptionMessage('The format \'http_headers\' is not supported.'); $Jaeger->extract(Formats\HTTP_HEADERS, $_SERVER); } @@ -217,4 +217,4 @@ public function testNestedSpanBaggage(){ $this->assertEquals($parent->getBaggageItem('key'), $child->getBaggageItem('key')); } -} \ No newline at end of file +} diff --git a/tests/Propagator/JaegerPropagatorTest.php b/tests/Propagator/JaegerPropagatorTest.php index 832b770..937a4e7 100644 --- a/tests/Propagator/JaegerPropagatorTest.php +++ b/tests/Propagator/JaegerPropagatorTest.php @@ -70,7 +70,7 @@ public function testExtract(){ public function testExtractDebugId(){ $jaeger = new JaegerPropagator(); - $carrier = []; + $carrier[Constants\Trace_Baggage_Header_Prefix . 'baggage'] = 2; $context = $jaeger->extract(Formats\TEXT_MAP, $carrier); $this->assertTrue($context->debugId == 0); @@ -85,6 +85,7 @@ public function testExtractUberctx(){ $jaeger = new JaegerPropagator(); $carrier[Constants\Trace_Baggage_Header_Prefix] = '2.0.0'; + $carrier[Constants\Jaeger_Debug_Header] = true; $context = $jaeger->extract(Formats\TEXT_MAP, $carrier); $this->assertTrue($context->baggage == null); @@ -113,6 +114,7 @@ public function testExtractBadBaggageHeader(){ $carrier = []; $carrier[Constants\Jaeger_Baggage_Header] = 'version'; + $carrier[Constants\Jaeger_Debug_Header] = true; $context = $jaeger->extract(Formats\TEXT_MAP, $carrier); $this->assertTrue($context->baggage == null); } @@ -146,4 +148,13 @@ public function testExtractPsr7(){ $this->assertTrue($context->spanId == 1562237095801441413); $this->assertTrue($context->flags == 1); } -} \ No newline at end of file + + + public function testExtractReturnsNull(){ + $jaeger = new JaegerPropagator(); + $carrier = []; + + $context = $jaeger->extract(Formats\TEXT_MAP, $carrier); + $this->assertNull($context); + } +} diff --git a/tests/Propagator/ZipkinPropagatorTest.php b/tests/Propagator/ZipkinPropagatorTest.php index 40ef581..94a3c28 100644 --- a/tests/Propagator/ZipkinPropagatorTest.php +++ b/tests/Propagator/ZipkinPropagatorTest.php @@ -92,4 +92,13 @@ public function testExtract128Bit(){ $this->assertTrue($context->spanId == 1562289663898779811); $this->assertTrue($context->flags == 1); } -} \ No newline at end of file + + + public function testExtractReturnsNull(){ + $jaeger = new ZipkinPropagator(); + $carrier = []; + + $context = $jaeger->extract(Formats\TEXT_MAP, $carrier); + $this->assertNull($context); + } +}