From c63c8cb6a0ded6179ee06e90ff5292d7ca8eac10 Mon Sep 17 00:00:00 2001 From: Jeff Ching Date: Wed, 28 Mar 2018 13:13:57 -0700 Subject: [PATCH 1/6] Remove accessors from Span. Add Span#spanData which returns its SpanData --- src/Trace/Span.php | 115 +++--------------- src/Trace/SpanData.php | 4 +- .../Guzzle/EventSubscriberTest.php | 2 +- .../Integrations/Guzzle/MiddlewareTest.php | 2 +- tests/unit/Trace/RequestHandlerTest.php | 48 ++------ tests/unit/Trace/SpanTest.php | 59 ++++----- .../unit/Trace/Tracer/AbstractTracerTest.php | 100 ++++++++------- 7 files changed, 115 insertions(+), 215 deletions(-) diff --git a/src/Trace/Span.php b/src/Trace/Span.php index bf8e5a2c1..b00eec27b 100644 --- a/src/Trace/Span.php +++ b/src/Trace/Span.php @@ -200,26 +200,6 @@ public function __construct($options = []) $this->sameProcessAsParentSpan = $options['sameProcessAsParentSpan']; } - /** - * Retrive the trace id for this span. - * - * @return string - */ - public function traceId() - { - return $this->traceId; - } - - /** - * Retrieve the start time for this span. - * - * @return \DateTimeInterface - */ - public function startTime() - { - return $this->startTime; - } - /** * Set the start time for this span. * @@ -232,16 +212,6 @@ public function setStartTime($when = null) $this->startTime = $this->formatDate($when); } - /** - * Retrieve the end time for this span. - * - * @return \DateTimeInterface - */ - public function endTime() - { - return $this->endTime; - } - /** * Set the end time for this span. * @@ -265,23 +235,28 @@ public function spanId() } /** - * Retrieve the ID of this span's parent if it exists. + * Return a read-only version of this span. * - * @return string + * @return SpanData */ - public function parentSpanId() + public function spanData() { - return $this->parentSpanId; - } - - /** - * Retrieve the name of this span. - * - * @return string - */ - public function name() - { - return $this->name; + return new SpanData( + $this->name, + $this->traceId, + $this->spanId, + $this->startTime, + $this->endTime, + [ + 'parentSpanId' => $this->parentSpanId, + 'attributes' => $this->attributes, + 'timeEvents' => $this->timeEvents, + 'links' => $this->links, + 'status' => $this->status, + 'sameProcessAsParentSpan' => $this->sameProcessAsParentSpan, + 'stackTrace' => $this->stackTrace + ] + ); } /** @@ -306,16 +281,6 @@ public function addTimeEvent(TimeEvent $timeEvent) $this->timeEvents[] = $timeEvent; } - /** - * Return the time events for this span. - * - * @return TimeEvent[] - */ - public function timeEvents() - { - return $this->timeEvents; - } - /** * Add links to this span. * @@ -338,16 +303,6 @@ public function addLink(Link $link) $this->links[] = $link; } - /** - * Return the links for this span. - * - * @return Link[] - */ - public function links() - { - return $this->links; - } - /** * Set the status for this span. * @@ -359,36 +314,6 @@ public function setStatus($code, $message) $this->status = new Status($code, $message); } - /** - * Retrieve the final status for this span. - * - * @return Status - */ - public function status() - { - return $this->status; - } - - /** - * Retrieve the stackTrace at the moment this span was created - * - * @return array - */ - public function stackTrace() - { - return $this->stackTrace; - } - - /** - * Whether or not this span is in the same process as its parent. - * - * @return bool - */ - public function sameProcessAsParentSpan() - { - return $this->sameProcessAsParentSpan; - } - /** * Handles parsing a \DateTimeInterface object from a provided timestamp. * @@ -448,7 +373,7 @@ private function filterStackTrace($stackTrace) private function generateSpanName() { // Try to find the first stacktrace class entry that doesn't start with OpenCensus\Trace - foreach ($this->stackTrace() as $st) { + foreach ($this->stackTrace as $st) { $st += ['line' => null]; if (!array_key_exists('class', $st)) { return implode('/', array_filter(['app', basename($st['file']), $st['function'], $st['line']])); diff --git a/src/Trace/SpanData.php b/src/Trace/SpanData.php index 8cb06c8b3..5be3f891d 100644 --- a/src/Trace/SpanData.php +++ b/src/Trace/SpanData.php @@ -152,8 +152,8 @@ public function __construct( $name, $traceId, $spanId, - \DateTimeInterface $startTime, - \DateTimeInterface $endTime, + \DateTimeInterface $startTime = null, + \DateTimeInterface $endTime = null, array $options = [] ) { $options += [ diff --git a/tests/unit/Trace/Integrations/Guzzle/EventSubscriberTest.php b/tests/unit/Trace/Integrations/Guzzle/EventSubscriberTest.php index 38cf46e71..fbd4e2720 100644 --- a/tests/unit/Trace/Integrations/Guzzle/EventSubscriberTest.php +++ b/tests/unit/Trace/Integrations/Guzzle/EventSubscriberTest.php @@ -49,7 +49,7 @@ public function testAddsSpanContextHeader() { $this->exporter->report(Argument::that(function ($tracer) { $spans = $tracer->spans(); - return count($spans) == 3 && $spans[2]->name() == 'GuzzleHttp::request'; + return count($spans) == 3 && $spans[2]->spanData()->name() == 'GuzzleHttp::request'; }))->shouldBeCalled(); $rt = Tracer::start($this->exporter->reveal(), [ diff --git a/tests/unit/Trace/Integrations/Guzzle/MiddlewareTest.php b/tests/unit/Trace/Integrations/Guzzle/MiddlewareTest.php index fe70fe601..8af6b0a4c 100644 --- a/tests/unit/Trace/Integrations/Guzzle/MiddlewareTest.php +++ b/tests/unit/Trace/Integrations/Guzzle/MiddlewareTest.php @@ -47,7 +47,7 @@ public function testAddsSpanContextHeader() { $this->exporter->report(Argument::that(function ($tracer) { $spans = $tracer->spans(); - return count($spans) == 3 && $spans[2]->name() == 'GuzzleHttp::request'; + return count($spans) == 3 && $spans[2]->spanData()->name() == 'GuzzleHttp::request'; }))->shouldBeCalled(); $rt = Tracer::start($this->exporter->reveal(), [ diff --git a/tests/unit/Trace/RequestHandlerTest.php b/tests/unit/Trace/RequestHandlerTest.php index 618157e4e..57a586178 100644 --- a/tests/unit/Trace/RequestHandlerTest.php +++ b/tests/unit/Trace/RequestHandlerTest.php @@ -62,11 +62,13 @@ public function testCanTrackContext() $this->assertCount(2, $spans); foreach ($spans as $span) { $this->assertInstanceOf(Span::class, $span); - $this->assertNotEmpty($span->endTime()); + $this->assertNotEmpty($span->spanData()->endTime()); } - $this->assertEquals('main', $spans[0]->name()); - $this->assertEquals('inner', $spans[1]->name()); - $this->assertEquals($spans[0]->spanId(), $spans[1]->parentSpanId()); + $spanData1 = $spans[0]->spanData(); + $spanData2 = $spans[1]->spanData(); + $this->assertEquals('main', $spanData1->name()); + $this->assertEquals('inner', $spanData2->name()); + $this->assertEquals($spanData1->spanId(), $spanData2->parentSpanId()); } public function testCanParseParentContext() @@ -83,7 +85,7 @@ public function testCanParseParentContext() ] ); $span = $rt->tracer()->spans()[0]; - $this->assertEquals('15b3', $span->parentSpanId()); + $this->assertEquals('15b3', $span->spanData()->parentSpanId()); $context = $rt->tracer()->spanContext(); $this->assertEquals('12345678901234567890123456789012', $context->traceId()); } @@ -124,40 +126,4 @@ public function testForceDisabledContextHeader() $this->assertFalse($tracer->enabled()); $this->assertInstanceOf(NullTracer::class, $tracer); } - - /** - * @dataProvider attributeHeaders - */ - public function testParsesAttributesFromHeaders($headerKey, $headerValue, $expectedAttributeKey, $expectedAttributeValue) - { - $this->sampler->shouldSample()->willReturn(true); - $rt = new RequestHandler( - $this->reporter->reveal(), - $this->sampler->reveal(), - new HttpHeaderPropagator(), - [ - 'headers' => [ - $headerKey => $headerValue - ], - 'skipReporting' => true - ] - ); - $rt->onExit(); - $spans = $rt->tracer()->spans(); - $attributes = $spans[0]->attributes(); - $this->assertArrayHasKey($expectedAttributeKey, $attributes); - $this->assertEquals($expectedAttributeValue, $attributes[$expectedAttributeKey]); - } - - public function attributeHeaders() - { - return [ - ['REQUEST_URI', '/foobar', 'http.path', '/foobar'], - ['REQUEST_METHOD', 'PUT', 'http.method', 'PUT'], - ['HTTP_HOST', 'foo.example.com', 'http.host', 'foo.example.com'], - ['SERVER_NAME', 'foo.example.com', 'http.host', 'foo.example.com'], - ['SERVER_PORT', '80', 'http.port', '80'], - ['HTTP_USER_AGENT', 'some user-agent', 'http.user_agent', 'some user-agent'] - ]; - } } diff --git a/tests/unit/Trace/SpanTest.php b/tests/unit/Trace/SpanTest.php index 51b8579be..d34e79660 100644 --- a/tests/unit/Trace/SpanTest.php +++ b/tests/unit/Trace/SpanTest.php @@ -42,21 +42,12 @@ public function testReadsSpanId() $this->assertEquals('1234', $span->spanId()); } - public function testReadsAttributes() - { - $span = new Span(['attributes' => ['foo' => 'bar']]); - - $attributes = $span->attributes(); - $this->assertArrayHasKey('foo', $attributes); - $this->assertEquals('bar', $attributes['foo']); - } - public function testCanAddAttribute() { $span = new Span(); $span->addAttribute('foo', 'bar'); - $attributes = $span->attributes(); + $attributes = $span->spanData()->attributes(); $this->assertArrayHasKey('foo', $attributes); $this->assertEquals('bar', $attributes['foo']); } @@ -65,28 +56,28 @@ public function testNoAttributes() { $span = new Span(); - $this->assertEmpty($span->attributes()); + $this->assertEmpty($span->spanData()->attributes()); } public function testEmptyAttributes() { $span = new Span(['attributes' => []]); - $this->assertEquals([], $span->attributes()); + $this->assertEmpty($span->spanData()->attributes()); } public function testGeneratesDefaultSpanName() { $span = new Span(); - $this->assertStringStartsWith('app', $span->name()); + $this->assertStringStartsWith('app', $span->spanData()->name()); } public function testReadsName() { $span = new Span(['name' => 'myspan']); - $this->assertEquals('myspan', $span->name()); + $this->assertEquals('myspan', $span->spanData()->name()); } public function testStartFormat() @@ -94,7 +85,7 @@ public function testStartFormat() $span = new Span(); $span->setStartTime(); - $this->assertInstanceOf(\DateTimeInterface::class, $span->startTime()); + $this->assertInstanceOf(\DateTimeInterface::class, $span->spanData()->startTime()); } public function testFinishFormat() @@ -102,16 +93,17 @@ public function testFinishFormat() $span = new Span(); $span->setEndTime(); - $this->assertInstanceOf(\DateTimeInterface::class, $span->endTime()); + $this->assertInstanceOf(\DateTimeInterface::class, $span->spanData()->endTime()); } public function testGeneratesBacktrace() { $span = new Span(); - $this->assertInternalType('array', $span->stackTrace()); - $this->assertTrue(count($span->stackTrace()) > 0); - $stackframe = $span->stackTrace()[0]; + $stackTrace = $span->spanData()->stackTrace(); + $this->assertInternalType('array', $stackTrace); + $this->assertNotEmpty($stackTrace); + $stackframe = $stackTrace[0]; $this->assertEquals('testGeneratesBacktrace', $stackframe['function']); $this->assertEquals(self::class, $stackframe['class']); } @@ -130,8 +122,9 @@ public function testOverrideBacktrace() 'stackTrace' => $stackTrace ]); - $this->assertCount(1, $span->stackTrace()); - $stackframe = $span->stackTrace()[0]; + $stackTrace = $span->spanData()->stackTrace(); + $this->assertCount(1, $stackTrace); + $stackframe = $stackTrace[0]; $this->assertEquals('asdf', $stackframe['function']); $this->assertEquals('Foo', $stackframe['class']); } @@ -140,7 +133,7 @@ public function testDefaultStatus() { $span = new Span(); - $this->assertNull($span->status()); + $this->assertNull($span->spanData()->status()); } public function testConstructingWithStatus() @@ -148,16 +141,20 @@ public function testConstructingWithStatus() $status = new Status(200, 'OK'); $span = new Span(['status' => $status]); - $this->assertInstanceOf(Status::class, $span->status()); - $this->assertEquals($status, $span->status()); + $status = $span->spanData()->status(); + $this->assertInstanceOf(Status::class, $status); + $this->assertEquals($status, $status); } public function testSettingStatus() { - $span = new Span(); + $span = new Span([ + 'startTime' => 0, + 'endTime' => 0 + ]); $span->setStatus(500, 'A server error occurred'); - $status = $span->status(); + $status = $span->spanData()->status(); $this->assertInstanceOf(Status::class, $status); $this->assertEquals(500, $status->code()); $this->assertEquals('A server error occurred', $status->message()); @@ -168,8 +165,14 @@ public function testSettingStatus() */ public function testCanFormatTimestamps($field, $timestamp, $expected) { - $span = new Span([$field => $timestamp]); - $date = call_user_func([$span, $field]); + $data = [$field => $timestamp]; + $data += [ + 'startTime' => 0, + 'endTime' => 0 + ]; + $span = new Span($data); + $spanData = $span->spanData(); + $date = call_user_func([$spanData, $field]); $this->assertInstanceOf(\DateTimeInterface::class, $date); $this->assertEquals($expected, $date->format('Y-m-d\TH:i:s.u000\Z')); } diff --git a/tests/unit/Trace/Tracer/AbstractTracerTest.php b/tests/unit/Trace/Tracer/AbstractTracerTest.php index 95f490692..7c90fbbb4 100644 --- a/tests/unit/Trace/Tracer/AbstractTracerTest.php +++ b/tests/unit/Trace/Tracer/AbstractTracerTest.php @@ -47,9 +47,9 @@ public function testMaintainsContext() $spans = $tracer->spans(); $this->assertCount(1, $spans); - $span = $spans[0]; - $this->assertEquals('test', $span->name()); - $this->assertEquals($parentSpanId, $span->parentSpanId()); + $spanData = $spans[0]->spanData(); + $this->assertEquals('test', $spanData->name()); + $this->assertEquals($parentSpanId, $spanData->parentSpanId()); } public function testAddsAttributesToCurrentSpan() @@ -64,9 +64,9 @@ public function testAddsAttributesToCurrentSpan() $spans = $tracer->spans(); $this->assertCount(2, $spans); - $span = $spans[1]; - $this->assertEquals('inner', $span->name()); - $attributes = $span->attributes(); + $spanData = $spans[1]->spanData(); + $this->assertEquals('inner', $spanData->name()); + $attributes = $spanData->attributes(); $this->assertArrayHasKey('foo', $attributes); $this->assertEquals('bar', $attributes['foo']); } @@ -84,9 +84,9 @@ public function testAddsAttributesToRootSpan() $spans = $tracer->spans(); $this->assertCount(2, $spans); - $span = $spans[0]; - $this->assertEquals('root', $span->name()); - $attributes = $span->attributes(); + $spanData = $spans[0]->spanData(); + $this->assertEquals('root', $spanData->name()); + $attributes = $spanData->attributes(); $this->assertArrayHasKey('foo', $attributes); $this->assertEquals('bar', $attributes['foo']); } @@ -96,8 +96,8 @@ public function testPersistsBacktrace() $class = $this->getTracerClass(); $tracer = new $class(); $tracer->inSpan(['name' => 'test'], function () {}); - $span = $tracer->spans()[0]; - $stackframe = $span->stackTrace()[0]; + $spanData = $tracer->spans()[0]->spanData();; + $stackframe = $spanData->stackTrace()[0]; $this->assertEquals('testPersistsBacktrace', $stackframe['function']); $this->assertEquals(self::class, $stackframe['class']); } @@ -125,7 +125,10 @@ public function testSetStartTime() usleep(100); $scope->close(); - $this->assertEquivalentTimestamps($span->startTime(), $tracer->spans()[0]->startTime()); + $this->assertEquivalentTimestamps( + $span->spanData()->startTime(), + $tracer->spans()[0]->spanData()->startTime() + ); } public function testAddsAnnotations() @@ -140,10 +143,10 @@ public function testAddsAnnotations() }); $spans = $tracer->spans(); - $rootSpan = $spans[0]; - $this->assertCount(1, $rootSpan->timeEvents()); - $innerSpan = $spans[1]; - $this->assertCount(1, $rootSpan->timeEvents()); + $rootSpanData = $spans[0]->spanData(); + $this->assertCount(1, $rootSpanData->timeEvents()); + $innerSpanData = $spans[1]->spanData(); + $this->assertCount(1, $innerSpanData->timeEvents()); } public function testAddsAnnotationToRootSpan() @@ -162,9 +165,10 @@ public function testAddsAnnotationToRootSpan() $spans = $tracer->spans(); $this->assertCount(2, $spans); - $span = $spans[0]; - $this->assertEquals('root', $span->name()); - $this->assertCount(1, $span->timeEvents()); + + $spanData = $spans[0]->spanData(); + $this->assertEquals('root', $spanData->name()); + $this->assertCount(1, $spanData->timeEvents()); } public function testAddsLinks() @@ -179,10 +183,10 @@ public function testAddsLinks() }); $spans = $tracer->spans(); - $rootSpan = $spans[0]; - $this->assertCount(1, $rootSpan->links()); - $innerSpan = $spans[1]; - $this->assertCount(1, $rootSpan->links()); + $rootSpanData = $spans[0]->spanData(); + $this->assertCount(1, $rootSpanData->links()); + $innerSpanData = $spans[1]->spanData(); + $this->assertCount(1, $innerSpanData->links()); } public function testAddsLinkToRootSpan() @@ -200,9 +204,10 @@ public function testAddsLinkToRootSpan() $spans = $tracer->spans(); $this->assertCount(2, $spans); - $span = $spans[0]; - $this->assertEquals('root', $span->name()); - $this->assertCount(1, $span->links()); + $spanData = $spans[0]->spanData(); + + $this->assertEquals('root', $spanData->name()); + $this->assertCount(1, $spanData->links()); } public function testAddMessageEvents() @@ -217,10 +222,10 @@ public function testAddMessageEvents() }); $spans = $tracer->spans(); - $rootSpan = $spans[0]; - $this->assertCount(1, $rootSpan->timeEvents()); - $innerSpan = $spans[1]; - $this->assertCount(1, $rootSpan->timeEvents()); + $rootSpanData = $spans[0]->spanData(); + $this->assertCount(1, $rootSpanData->timeEvents()); + $innerSpanData = $spans[1]->spanData(); + $this->assertCount(1, $innerSpanData->timeEvents()); } public function testAddsMessageEventToRootSpan() @@ -238,9 +243,10 @@ public function testAddsMessageEventToRootSpan() $spans = $tracer->spans(); $this->assertCount(2, $spans); - $span = $spans[0]; - $this->assertEquals('root', $span->name()); - $this->assertCount(1, $span->timeEvents()); + $spanData = $spans[0]->spanData(); + + $this->assertEquals('root', $spanData->name()); + $this->assertCount(1, $spanData->timeEvents()); } public function testInSpanSetsDefaultStartTime() @@ -253,10 +259,10 @@ public function testInSpanSetsDefaultStartTime() $spans = $tracer->spans(); $this->assertCount(1, $spans); - $span = $spans[0]; + $spanData = $spans[0]->spanData(); // #131 - Span should be initialized with current time, not the epoch. - $this->assertNotEquals(0, $span->startTime()->getTimestamp()); + $this->assertNotEquals(0, $spanData->startTime()->getTimestamp()); } public function testStackTraceShouldBeSet() @@ -269,10 +275,10 @@ public function testStackTraceShouldBeSet() $spans = $tracer->spans(); $this->assertCount(1, $spans); - $span = $spans[0]; + $spanData = $spans[0]->spanData(); - $this->assertInternalType('array', $span->stackTrace()); - $this->assertNotEmpty($span->stackTrace()); + $this->assertInternalType('array', $spanData->stackTrace()); + $this->assertNotEmpty($spanData->stackTrace()); } public function testAttributesShouldBeSet() @@ -285,10 +291,10 @@ public function testAttributesShouldBeSet() $spans = $tracer->spans(); $this->assertCount(1, $spans); - $span = $spans[0]; + $spanData = $spans[0]->spanData(); - $this->assertInternalType('array', $span->attributes()); - $this->assertEmpty($span->attributes()); + $this->assertInternalType('array', $spanData->attributes()); + $this->assertEmpty($spanData->attributes()); } public function testLinksShouldBeSet() @@ -301,10 +307,10 @@ public function testLinksShouldBeSet() $spans = $tracer->spans(); $this->assertCount(1, $spans); - $span = $spans[0]; + $spanData = $spans[0]->spanData(); - $this->assertInternalType('array', $span->links()); - $this->assertEmpty($span->links()); + $this->assertInternalType('array', $spanData->links()); + $this->assertEmpty($spanData->links()); } public function testTimeEventsShouldBeSet() @@ -317,10 +323,10 @@ public function testTimeEventsShouldBeSet() $spans = $tracer->spans(); $this->assertCount(1, $spans); - $span = $spans[0]; + $spanData = $spans[0]->spanData(); - $this->assertInternalType('array', $span->timeEvents()); - $this->assertEmpty($span->timeEvents()); + $this->assertInternalType('array', $spanData->timeEvents()); + $this->assertEmpty($spanData->timeEvents()); } private function assertEquivalentTimestamps($expected, $value) From 5ef39a797bae93a57aca97222c7065c208182546 Mon Sep 17 00:00:00 2001 From: Jeff Ching Date: Wed, 28 Mar 2018 14:12:14 -0700 Subject: [PATCH 2/6] ExporterInterface is now export(array ) --- composer.json | 2 +- src/Trace/Exporter/EchoExporter.php | 6 +- src/Trace/Exporter/ExporterInterface.php | 8 +- src/Trace/Exporter/FileExporter.php | 22 ++-- src/Trace/Exporter/LoggerExporter.php | 8 +- src/Trace/Exporter/NullExporter.php | 4 +- src/Trace/Exporter/StackdriverExporter.php | 19 +-- src/Trace/Exporter/ZipkinExporter.php | 18 ++- src/Trace/RequestHandler.php | 15 ++- tests/unit/Core/ContextTest.php | 2 +- .../unit/Trace/Exporter/EchoExporterTest.php | 27 ++--- .../unit/Trace/Exporter/FileExporterTest.php | 24 ++-- .../Trace/Exporter/LoggerExporterTest.php | 37 +++--- .../Exporter/StackdriverExporterTest.php | 66 +++++++---- .../Trace/Exporter/ZipkinExporterTest.php | 112 +++++++----------- .../Guzzle/EventSubscriberTest.php | 5 +- .../Integrations/Guzzle/MiddlewareTest.php | 5 +- tests/unit/Trace/RequestHandlerTest.php | 12 +- 18 files changed, 177 insertions(+), 215 deletions(-) diff --git a/composer.json b/composer.json index e9a64fb6c..224d29e14 100644 --- a/composer.json +++ b/composer.json @@ -18,7 +18,7 @@ "cache/adapter-common": "^1.0" }, "require-dev": { - "phpunit/phpunit": ">= 4.8", + "phpunit/phpunit": ">= 6.0", "squizlabs/php_codesniffer": "2.*", "google/cloud-trace": "^0.4", "twig/twig": "~2.0", diff --git a/src/Trace/Exporter/EchoExporter.php b/src/Trace/Exporter/EchoExporter.php index ecc045069..fa91f1bbf 100644 --- a/src/Trace/Exporter/EchoExporter.php +++ b/src/Trace/Exporter/EchoExporter.php @@ -17,7 +17,7 @@ namespace OpenCensus\Trace\Exporter; -use OpenCensus\Trace\Tracer\TracerInterface; +use OpenCensus\Trace\SpanData; /** * This implementation of the ExporterInterface uses `print_r` to output @@ -40,9 +40,9 @@ class EchoExporter implements ExporterInterface * @param TracerInterface $tracer * @return bool */ - public function report(TracerInterface $tracer) + public function export(array $spans) { - print_r($tracer->spans()); + print_r($spans); return true; } } diff --git a/src/Trace/Exporter/ExporterInterface.php b/src/Trace/Exporter/ExporterInterface.php index ad4348e80..f80264391 100644 --- a/src/Trace/Exporter/ExporterInterface.php +++ b/src/Trace/Exporter/ExporterInterface.php @@ -17,7 +17,7 @@ namespace OpenCensus\Trace\Exporter; -use OpenCensus\Trace\Tracer\TracerInterface; +use OpenCensus\Trace\SpanData; /** * The ExporterInterface allows you to swap out the Trace reporting mechanism @@ -25,10 +25,10 @@ interface ExporterInterface { /** - * Report the provided Trace to a backend. + * Export the provided SpanData to a backend. * - * @param TracerInterface $tracer + * @param SpanData[] $spans * @return bool */ - public function report(TracerInterface $tracer); + public function export(array $spans); } diff --git a/src/Trace/Exporter/FileExporter.php b/src/Trace/Exporter/FileExporter.php index 9d1c5a0a3..39b5ef90b 100644 --- a/src/Trace/Exporter/FileExporter.php +++ b/src/Trace/Exporter/FileExporter.php @@ -17,7 +17,7 @@ namespace OpenCensus\Trace\Exporter; -use OpenCensus\Trace\Span; +use OpenCensus\Trace\SpanData; use OpenCensus\Trace\Tracer\TracerInterface; /** @@ -51,30 +51,28 @@ public function __construct($filename) } /** - * Report the provided Trace to a backend. + * Report the provided SpanData to a file in json format. * - * @param TracerInterface $tracer + * @param SpanData[] $spans * @return bool */ - public function report(TracerInterface $tracer) + public function export(array $spans) { - $spans = $this->convertSpans($tracer); + $spans = $this->convertSpans($spans); return file_put_contents($this->filename, json_encode($spans) . PHP_EOL, FILE_APPEND) !== false; } /** * Convert spans into array ready for serialization. * - * @param TracerInterface $tracer + * @param SpanData[] $spans * @return array Representation of the collected trace spans ready for serialization */ - private function convertSpans(TracerInterface $tracer) + private function convertSpans(array $spans) { - $traceId = $tracer->spanContext()->traceId(); - - return array_map(function (Span $span) use ($traceId) { + return array_map(function (SpanData $span) use ($traceId) { return [ - 'traceId' => $traceId, + 'traceId' => $span->traceId(), 'name' => $span->name(), 'spanId' => $span->spanId(), 'parentSpanId' => $span->parentSpanId(), @@ -87,6 +85,6 @@ private function convertSpans(TracerInterface $tracer) 'links' => $span->links(), 'sameProcessAsParentSpan' => $span->sameProcessAsParentSpan(), ]; - }, $tracer->spans()); + }, $spans); } } diff --git a/src/Trace/Exporter/LoggerExporter.php b/src/Trace/Exporter/LoggerExporter.php index 740a1cf9e..8d9113a5f 100644 --- a/src/Trace/Exporter/LoggerExporter.php +++ b/src/Trace/Exporter/LoggerExporter.php @@ -17,7 +17,7 @@ namespace OpenCensus\Trace\Exporter; -use OpenCensus\Trace\Tracer\TracerInterface; +use OpenCensus\Trace\SpanData; use Psr\Log\LoggerInterface; /** @@ -65,13 +65,13 @@ public function __construct(LoggerInterface $logger, $level = self::DEFAULT_LOG_ /** * Report the provided Trace to a backend. * - * @param TracerInterface $tracer + * @param SpanData[] $spans * @return bool */ - public function report(TracerInterface $tracer) + public function export(array $spans) { try { - $this->logger->log($this->level, json_encode($tracer->spans())); + $this->logger->log($this->level, json_encode($spans)); } catch (\Exception $e) { error_log('Reporting the Trace data failed: ' . $e->getMessage()); return false; diff --git a/src/Trace/Exporter/NullExporter.php b/src/Trace/Exporter/NullExporter.php index 29ac4c941..58d9b065b 100644 --- a/src/Trace/Exporter/NullExporter.php +++ b/src/Trace/Exporter/NullExporter.php @@ -36,10 +36,10 @@ class NullExporter implements ExporterInterface /** * Does nothing. * - * @param TracerInterface $tracer + * @param SpanData[] $spans * @return bool */ - public function report(TracerInterface $tracer) + public function export(array $spans) { return true; } diff --git a/src/Trace/Exporter/StackdriverExporter.php b/src/Trace/Exporter/StackdriverExporter.php index 0a74d6165..d2e3437c1 100644 --- a/src/Trace/Exporter/StackdriverExporter.php +++ b/src/Trace/Exporter/StackdriverExporter.php @@ -22,8 +22,8 @@ use Google\Cloud\Trace\TraceClient; use Google\Cloud\Trace\Span; use Google\Cloud\Trace\Trace; -use OpenCensus\Trace\Tracer\TracerInterface; use OpenCensus\Trace\Span as OCSpan; +use OpenCensus\Trace\SpanData; /** * This implementation of the ExporterInterface use the BatchRunner to provide @@ -135,19 +135,20 @@ public function __construct(array $options = []) /** * Report the provided Trace to a backend. * - * @param TracerInterface $tracer + * @param SpanData[] $spans * @return bool */ - public function report(TracerInterface $tracer) + public function export(array $spans) { - $spans = $this->convertSpans($tracer); + $spans = $this->convertSpans($spans); if (empty($spans)) { return false; } + // Pull the traceId from the first span $trace = self::$client->trace( - $tracer->spanContext()->traceId() + $spans[0]->traceId() ); // build a Trace object and assign Spans @@ -170,16 +171,16 @@ public function report(TracerInterface $tracer) * * @access private * - * @param TracerInterface $tracer + * @param SpanData[] $spans * @return Span[] Representation of the collected trace spans ready for serialization */ - public function convertSpans(TracerInterface $tracer) + public function convertSpans(array $spans) { // transform OpenCensus Spans to Google\Cloud\Trace\Spans - return array_map([$this, 'mapSpan'], $tracer->spans()); + return array_map([$this, 'mapSpan'], $spans); } - private function mapSpan($span) + private function mapSpan(SpanData $span) { return new Span($span->traceId(), [ 'name' => $span->name(), diff --git a/src/Trace/Exporter/ZipkinExporter.php b/src/Trace/Exporter/ZipkinExporter.php index 7faa8e3d7..2c4b46c7a 100644 --- a/src/Trace/Exporter/ZipkinExporter.php +++ b/src/Trace/Exporter/ZipkinExporter.php @@ -18,8 +18,7 @@ namespace OpenCensus\Trace\Exporter; use OpenCensus\Trace\MessageEvent; -use OpenCensus\Trace\Tracer\TracerInterface; -use OpenCensus\Trace\Span; +use OpenCensus\Trace\SpanData; /** * This implementation of the ExporterInterface appends a json @@ -96,12 +95,12 @@ public function setLocalIpv6($ipv6) /** * Report the provided Trace to a backend. * - * @param TracerInterface $tracer + * @param SpanData[] $spans * @return bool */ - public function report(TracerInterface $tracer) + public function export(array $spans) { - $spans = $this->convertSpans($tracer); + $spans = $this->convertSpans($spans); if (empty($spans)) { return false; @@ -129,15 +128,13 @@ public function report(TracerInterface $tracer) * Convert spans into Zipkin's expected JSON output format. See * output format definition. * - * @param TracerInterface $tracer + * @param SpanData[] $spans * @param array $headers [optional] HTTP headers to parse. **Defaults to** $_SERVER * @return array Representation of the collected trace spans ready for serialization */ - public function convertSpans(TracerInterface $tracer, $headers = null) + public function convertSpans(array $spans, $headers = null) { $headers = $headers ?: $_SERVER; - $spans = $tracer->spans(); - $traceId = $tracer->spanContext()->traceId(); // True is a request to store this span even if it overrides sampling policy. // This is true when the X-B3-Flags header has a value of 1. @@ -154,6 +151,7 @@ public function convertSpans(TracerInterface $tracer, $headers = null) $parentSpanId = $span->parentSpanId() ? str_pad($span->parentSpanId(), 16, '0', STR_PAD_LEFT) : null; + $traceId = str_pad($span->traceId(), 32, '0', STR_PAD_LEFT); $attributes = $span->attributes(); if (empty($attributes)) { @@ -184,7 +182,7 @@ public function convertSpans(TracerInterface $tracer, $headers = null) return $zipkinSpans; } - private function spanKind(Span $span) + private function spanKind(SpanData $span) { if (strpos($span->name(), 'Sent.') === 0) { return self::KIND_CLIENT; diff --git a/src/Trace/RequestHandler.php b/src/Trace/RequestHandler.php index cf6f900c1..524b0aab0 100644 --- a/src/Trace/RequestHandler.php +++ b/src/Trace/RequestHandler.php @@ -47,7 +47,7 @@ class RequestHandler /** * @var ExporterInterface The reported to use at the end of the request */ - private $reporter; + private $exporter; /** * @var TracerInterface The tracer to use for this request @@ -72,7 +72,7 @@ class RequestHandler /** * Create a new RequestHandler. * - * @param ExporterInterface $reporter How to report the trace at the end of the request + * @param ExporterInterface $exporter How to report the trace at the end of the request * @param SamplerInterface $sampler Which sampler to use for sampling requests * @param PropagatorInterface $propagator SpanContext propagator * @param array $options [optional] { @@ -85,12 +85,12 @@ class RequestHandler * } */ public function __construct( - ExporterInterface $reporter, + ExporterInterface $exporter, SamplerInterface $sampler, PropagatorInterface $propagator, array $options = [] ) { - $this->reporter = $reporter; + $this->exporter = $exporter; $this->headers = array_key_exists('headers', $options) ? $options['headers'] : $_SERVER; @@ -135,7 +135,12 @@ public function onExit() $this->addCommonRequestAttributes($this->headers); $this->scope->close(); - $this->reporter->report($this->tracer); + + // Fetch the SpanData of all the collected Spans + $spans = array_map(function (Span $span) { + return $span->spanData(); + }, $this->tracer->spans()); + $this->exporter->export($spans); } /** diff --git a/tests/unit/Core/ContextTest.php b/tests/unit/Core/ContextTest.php index 16805c37c..dd351ee96 100644 --- a/tests/unit/Core/ContextTest.php +++ b/tests/unit/Core/ContextTest.php @@ -69,7 +69,7 @@ public function testRestoringCurrentContext() } /** - * @expectedException \PHPUnit\Framework\Error\Warning + * @expectedException PHPUnit\Framework\Error\Warning */ public function testRestoringCurrentContextRequiresSameObject() { diff --git a/tests/unit/Trace/Exporter/EchoExporterTest.php b/tests/unit/Trace/Exporter/EchoExporterTest.php index 8cbb87fde..81014f377 100644 --- a/tests/unit/Trace/Exporter/EchoExporterTest.php +++ b/tests/unit/Trace/Exporter/EchoExporterTest.php @@ -18,9 +18,7 @@ namespace OpenCensus\Tests\Unit\Trace\Exporter; use OpenCensus\Trace\Exporter\EchoExporter; -use OpenCensus\Trace\SpanContext; use OpenCensus\Trace\Span; -use OpenCensus\Trace\Tracer\TracerInterface; use PHPUnit\Framework\TestCase; /** @@ -28,28 +26,17 @@ */ class EchoExporterTest extends TestCase { - private $tracer; - - public function setUp() - { - $this->tracer = $this->prophesize(TracerInterface::class); - } - public function testLogsTrace() { - $spans = [ - new Span([ - 'name' => 'span', - 'startTime' => microtime(true), - 'endTime' => microtime(true) + 10 - ]) - ]; - - $this->tracer->spans()->willReturn($spans); + $span = new Span([ + 'name' => 'span', + 'startTime' => microtime(true), + 'endTime' => microtime(true) + 10 + ]); ob_start(); - $reporter = new EchoExporter(); - $this->assertTrue($reporter->report($this->tracer->reveal())); + $exporter = new EchoExporter(); + $this->assertTrue($exporter->export([$span->spanData()])); $output = ob_get_contents(); ob_end_clean(); $this->assertGreaterThan(0, strlen($output)); diff --git a/tests/unit/Trace/Exporter/FileExporterTest.php b/tests/unit/Trace/Exporter/FileExporterTest.php index 6bfc51641..1f4718b55 100644 --- a/tests/unit/Trace/Exporter/FileExporterTest.php +++ b/tests/unit/Trace/Exporter/FileExporterTest.php @@ -18,9 +18,7 @@ namespace OpenCensus\Tests\Unit\Trace\Exporter; use OpenCensus\Trace\Exporter\FileExporter; -use OpenCensus\Trace\SpanContext; use OpenCensus\Trace\Span; -use OpenCensus\Trace\Tracer\TracerInterface; use PHPUnit\Framework\TestCase; /** @@ -34,7 +32,6 @@ class FileExporterTest extends TestCase public function setUp() { $this->filename = tempnam(sys_get_temp_dir(), 'traces'); - $this->tracer = $this->prophesize(TracerInterface::class); } public function tearDown() @@ -44,19 +41,14 @@ public function tearDown() public function testLogsTrace() { - $this->tracer->spanContext()->willReturn(new SpanContext()); - - $spans = [ - new Span([ - 'name' => 'span', - 'startTime' => microtime(true), - 'endTime' => microtime(true) + 10 - ]) - ]; - $this->tracer->spans()->willReturn($spans); - - $reporter = new FileExporter($this->filename); - $this->assertTrue($reporter->report($this->tracer->reveal())); + $span = new Span([ + 'name' => 'span', + 'startTime' => microtime(true), + 'endTime' => microtime(true) + 10 + ]); + + $exporter = new FileExporter($this->filename); + $this->assertTrue($exporter->export([$span->spanData()])); $this->assertGreaterThan(0, strlen(@file_get_contents($this->filename))); } } diff --git a/tests/unit/Trace/Exporter/LoggerExporterTest.php b/tests/unit/Trace/Exporter/LoggerExporterTest.php index 9454f6150..9a5693151 100644 --- a/tests/unit/Trace/Exporter/LoggerExporterTest.php +++ b/tests/unit/Trace/Exporter/LoggerExporterTest.php @@ -21,9 +21,7 @@ use Psr\Log\LoggerInterface; use OpenCensus\Trace\Exporter\LoggerExporter; -use OpenCensus\Trace\SpanContext; use OpenCensus\Trace\Span; -use OpenCensus\Trace\Tracer\TracerInterface; use Prophecy\Argument; use PHPUnit\Framework\TestCase; @@ -38,45 +36,38 @@ class LoggerExporterTest extends TestCase public function setUp() { $this->logger = $this->prophesize(LoggerInterface::class); - $this->tracer = $this->prophesize(TracerInterface::class); } public function testReportWithAnExceptionErrorLog() { - $spans = [ - new Span([ - 'name' => 'span', - 'startTime' => microtime(true), - 'endTime' => microtime(true) + 10 - ]) - ]; + $span = new Span([ + 'name' => 'span', + 'startTime' => microtime(true), + 'endTime' => microtime(true) + 10 + ]); - $this->tracer->spans()->willReturn($spans); $this->logger->log('some-level', Argument::type('string'))->willThrow( new \Exception('error_log test') ); - $reporter = new LoggerExporter($this->logger->reveal(), 'some-level'); + $exporter = new LoggerExporter($this->logger->reveal(), 'some-level'); $this->expectOutputString( 'Reporting the Trace data failed: error_log test' ); - $this->assertFalse($reporter->report($this->tracer->reveal())); + $this->assertFalse($exporter->export([$span->spanData()])); } public function testLogsTrace() { - $spans = [ - new Span([ - 'name' => 'span', - 'startTime' => microtime(true), - 'endTime' => microtime(true) + 10 - ]) - ]; - $this->tracer->spans()->willReturn($spans); + $span = new Span([ + 'name' => 'span', + 'startTime' => microtime(true), + 'endTime' => microtime(true) + 10 + ]); $this->logger->log('some-level', Argument::type('string'))->shouldBeCalled(); - $reporter = new LoggerExporter($this->logger->reveal(), 'some-level'); - $this->assertTrue($reporter->report($this->tracer->reveal())); + $exporter = new LoggerExporter($this->logger->reveal(), 'some-level'); + $this->assertTrue($exporter->export([$span->spanData])); } } diff --git a/tests/unit/Trace/Exporter/StackdriverExporterTest.php b/tests/unit/Trace/Exporter/StackdriverExporterTest.php index 71ea21490..805b22684 100644 --- a/tests/unit/Trace/Exporter/StackdriverExporterTest.php +++ b/tests/unit/Trace/Exporter/StackdriverExporterTest.php @@ -23,7 +23,7 @@ use OpenCensus\Trace\SpanContext; use OpenCensus\Trace\Tracer\TracerInterface; use OpenCensus\Trace\Tracer\ContextTracer; -use OpenCensus\Trace\Span as OpenCensusSpan; +use OpenCensus\Trace\Span as OCSpan; use Prophecy\Argument; use Google\Cloud\Trace\Trace; use Google\Cloud\Trace\Span; @@ -35,26 +35,37 @@ */ class StackdriverExporterTest extends TestCase { + /** + * @var TraceClient + */ private $client; + /** + * @var SpanData[] + */ + private $spans; + public function setUp() { parent::setUp(); $this->client = $this->prophesize(TraceClient::class); + + $this->spans = array_map(function ($span) { + return $span->spanData(); + }, [ + new OCSpan([ + 'name' => 'span', + 'startTime' => microtime(true), + 'endTime' => microtime(true) + 10 + ]) + ]); } public function testFormatsTrace() { - $tracer = new ContextTracer(new SpanContext('testtraceid')); - $tracer->inSpan(['name' => 'main'], function () use ($tracer) { - $tracer->inSpan(['name' => 'span1'], 'usleep', [10]); - $tracer->inSpan(['name' => 'span2'], 'usleep', [20]); - }); - - $reporter = new StackdriverExporter(['client' => $this->client->reveal()]); - $spans = $reporter->convertSpans($tracer); + $exporter = new StackdriverExporter(['client' => $this->client->reveal()]); + $spans = $exporter->convertSpans($this->spans); - $this->assertCount(3, $spans); foreach ($spans as $span) { $this->assertInstanceOf(Span::class, $span); $this->assertInternalType('string', $span->name()); @@ -66,21 +77,19 @@ public function testFormatsTrace() public function testReportWithAnExceptionErrorLog() { - $tracer = new ContextTracer(new SpanContext('testtraceid')); - $tracer->inSpan(['name' => 'main'], function () {}); $this->client->insert(Argument::any())->willThrow( new \Exception('error_log test') ); $trace = $this->prophesize(Trace::class); $trace->setSpans(Argument::any())->shouldBeCalled(); $this->client->trace(Argument::any())->willReturn($trace->reveal()); - $reporter = new StackdriverExporter( + $exporter = new StackdriverExporter( ['client' => $this->client->reveal()] ); $this->expectOutputString( 'Reporting the Trace data failed: error_log test' ); - $this->assertFalse($reporter->report($tracer)); + $this->assertFalse($exporter->export($this->spans)); } public function testStacktrace() @@ -94,11 +103,14 @@ public function testStacktrace() 'type' => '::' ] ]; - $tracer = new ContextTracer(new SpanContext('testtraceid')); - $tracer->inSpan(['stackTrace' => $stackTrace], function () {}); + $span = new OCSpan([ + 'stackTrace' => $stackTrace + ]); + $span->setStartTime(); + $span->setEndTime(); - $reporter = new StackdriverExporter(['client' => $this->client->reveal()]); - $spans = $reporter->convertSpans($tracer); + $exporter = new StackdriverExporter(); + $spans = $exporter->convertSpans([$span->spanData()]); $data = $spans[0]->jsonSerialize(); $this->assertArrayHasKey('stackTrace', $data); @@ -106,10 +118,8 @@ public function testStacktrace() public function testEmptyTrace() { - $tracer = new ContextTracer(new SpanContext('testtraceid')); - - $reporter = new StackdriverExporter(['client' => $this->client->reveal()]); - $this->assertFalse($reporter->report($tracer)); + $exporter = new StackdriverExporter(); + $this->assertFalse($exporter->export([])); } /** @@ -125,8 +135,16 @@ public function testMapsAttributes($key, $value, $expectedAttributeKey, $expecte ] ], function () {}); - $exporter = new StackdriverExporter(['client' => $this->client->reveal()]); - $spans = $exporter->convertSpans($tracer); + $span = new OCSpan([ + 'attributes' => [ + $key => $value + ] + ]); + $span->setStartTime(); + $span->setEndTime(); + + $exporter = new StackdriverExporter(); + $spans = $exporter->convertSpans([$span->spanData()]); $this->assertCount(1, $spans); $span = $spans[0]; diff --git a/tests/unit/Trace/Exporter/ZipkinExporterTest.php b/tests/unit/Trace/Exporter/ZipkinExporterTest.php index 09850ca68..7c6f5f387 100644 --- a/tests/unit/Trace/Exporter/ZipkinExporterTest.php +++ b/tests/unit/Trace/Exporter/ZipkinExporterTest.php @@ -17,14 +17,10 @@ namespace OpenCensus\Tests\Unit\Trace\Exporter; -use OpenCensus\Core\Context; use OpenCensus\Trace\Exporter\ZipkinExporter; use OpenCensus\Trace\MessageEvent; -use OpenCensus\Trace\SpanContext; use OpenCensus\Trace\Span; -use OpenCensus\Trace\Tracer\TracerInterface; -use OpenCensus\Trace\Tracer\ContextTracer; -use Prophecy\Argument; +use OpenCensus\Trace\SpanData; use PHPUnit\Framework\TestCase; /** @@ -32,12 +28,24 @@ */ class ZipkinExporterTest extends TestCase { - private $tracer; + /** + * @var SpanData[] + */ + private $spans; public function setUp() { - $this->tracer = $this->prophesize(TracerInterface::class); - Context::reset(); + parent::setUp(); + $this->spans = array_map(function ($span) { + return $span->spanData(); + }, [ + new Span([ + 'traceId' => 'aaa', + 'name' => 'span', + 'startTime' => microtime(true), + 'endTime' => microtime(true) + 10 + ]) + ]); } /** @@ -45,20 +53,8 @@ public function setUp() */ public function testFormatsTrace() { - $spans = [ - new Span([ - 'name' => 'span', - 'startTime' => microtime(true), - 'endTime' => microtime(true) + 10 - ]) - ]; - - $this->tracer->spanContext()->willReturn(new SpanContext()); - $this->tracer->spans()->willReturn($spans); - - $reporter = new ZipkinExporter('myapp'); - - $data = $reporter->convertSpans($this->tracer->reveal()); + $exporter = new ZipkinExporter('myapp'); + $data = $exporter->convertSpans($this->spans); $this->assertInternalType('array', $data); foreach ($data as $span) { @@ -86,17 +82,13 @@ public function testFormatsTrace() */ public function testSpanKind($spanOpts, $kind) { - $tracer = new ContextTracer(new SpanContext('testtraceid')); - $tracer->inSpan(['name' => 'main'], function () use ($tracer, $spanOpts) { - $tracer->inSpan($spanOpts, 'usleep', [1]); - }); + $span = new Span($spanOpts); + $span->setStartTime(); + $span->setEndTime(); + $exporter = new ZipkinExporter('myapp'); + $spans = $exporter->convertSpans([$span->spanData()]); - $reporter = new ZipkinExporter('myapp'); - $spans = $reporter->convertSpans($tracer); - - $this->assertCount(2, $spans); - $this->assertFalse(array_key_exists('kind', $spans[0])); - $this->assertEquals($kind, $spans[1]['kind']); + $this->assertEquals($kind, $spans[0]['kind']); } public function spanOptionsForKind() @@ -111,12 +103,8 @@ public function spanOptionsForKind() public function testSpanDebug() { - $spanContext = new SpanContext('testtraceid'); - $tracer = new ContextTracer($spanContext); - $tracer->inSpan(['name' => 'main'], function () {}); - - $reporter = new ZipkinExporter('myapp'); - $spans = $reporter->convertSpans($tracer, [ + $exporter = new ZipkinExporter('myapp'); + $spans = $exporter->convertSpans($this->spans, [ 'HTTP_X_B3_FLAGS' => '1' ]); @@ -126,12 +114,12 @@ public function testSpanDebug() public function testSpanShared() { - $spanContext = new SpanContext('testtraceid', 12345); - $tracer = new ContextTracer($spanContext); - $tracer->inSpan(['name' => 'main'], function () {}); + $span = new Span(['parentSpanId' => 'abc']); + $span->setStartTime(); + $span->setEndTime(); - $reporter = new ZipkinExporter('myapp'); - $spans = $reporter->convertSpans($tracer); + $exporter = new ZipkinExporter('myapp'); + $spans = $exporter->convertSpans([$span->spanData()]); $this->assertCount(1, $spans); $this->assertTrue($spans[0]['shared']); @@ -139,21 +127,16 @@ public function testSpanShared() public function testEmptyTrace() { - $spanContext = new SpanContext('testtraceid', 12345); - $tracer = new ContextTracer($spanContext); - $reporter = new ZipkinExporter('myapp'); - $spans = $reporter->convertSpans($tracer); + $exporter = new ZipkinExporter('myapp'); + $spans = $exporter->convertSpans([]); $this->assertEmpty($spans); } public function testSkipsIpv4() { - $spanContext = new SpanContext('testtraceid', 12345); - $tracer = new ContextTracer($spanContext); - $tracer->inSpan(['name' => 'main'], function () {}); + $exporter = new ZipkinExporter('myapp'); + $spans = $exporter->convertSpans($this->spans); - $reporter = new ZipkinExporter('myapp'); - $spans = $reporter->convertSpans($tracer); $endpoint = $spans[0]['localEndpoint']; $this->assertArrayNotHasKey('ipv4', $endpoint); $this->assertArrayNotHasKey('ipv6', $endpoint); @@ -161,13 +144,10 @@ public function testSkipsIpv4() public function testSetsIpv4() { - $spanContext = new SpanContext('testtraceid', 12345); - $tracer = new ContextTracer($spanContext); - $tracer->inSpan(['name' => 'main'], function () {}); + $exporter = new ZipkinExporter('myapp'); + $exporter->setLocalIpv4('1.2.3.4'); + $spans = $exporter->convertSpans($this->spans); - $reporter = new ZipkinExporter('myapp'); - $reporter->setLocalIpv4('1.2.3.4'); - $spans = $reporter->convertSpans($tracer); $endpoint = $spans[0]['localEndpoint']; $this->assertArrayHasKey('ipv4', $endpoint); $this->assertEquals('1.2.3.4', $endpoint['ipv4']); @@ -175,13 +155,10 @@ public function testSetsIpv4() public function testSetsIpv6() { - $spanContext = new SpanContext('testtraceid', 12345); - $tracer = new ContextTracer($spanContext); - $tracer->inSpan(['name' => 'main'], function () {}); + $exporter = new ZipkinExporter('myapp'); + $exporter->setLocalIpv6('2001:db8:85a3::8a2e:370:7334'); + $spans = $exporter->convertSpans($this->spans); - $reporter = new ZipkinExporter('myapp'); - $reporter->setLocalIpv6('2001:db8:85a3::8a2e:370:7334'); - $spans = $reporter->convertSpans($tracer); $endpoint = $spans[0]['localEndpoint']; $this->assertArrayHasKey('ipv6', $endpoint); $this->assertEquals('2001:db8:85a3::8a2e:370:7334', $endpoint['ipv6']); @@ -189,12 +166,9 @@ public function testSetsIpv6() public function testSetsLocalEndpointPort() { - $spanContext = new SpanContext('testtraceid', 12345); - $tracer = new ContextTracer($spanContext); - $tracer->inSpan(['name' => 'main'], function () {}); + $exporter = new ZipkinExporter('myapp', null, ['SERVER_PORT' => "80"]); + $spans = $exporter->convertSpans($this->spans); - $reporter = new ZipkinExporter('myapp', null, ['SERVER_PORT' => "80"]); - $spans = $reporter->convertSpans($tracer); $endpoint = $spans[0]['localEndpoint']; $this->assertArrayHasKey('port', $endpoint); $this->assertEquals(80, $endpoint['port']); diff --git a/tests/unit/Trace/Integrations/Guzzle/EventSubscriberTest.php b/tests/unit/Trace/Integrations/Guzzle/EventSubscriberTest.php index fbd4e2720..08abc9205 100644 --- a/tests/unit/Trace/Integrations/Guzzle/EventSubscriberTest.php +++ b/tests/unit/Trace/Integrations/Guzzle/EventSubscriberTest.php @@ -47,9 +47,8 @@ public function setUp() public function testAddsSpanContextHeader() { - $this->exporter->report(Argument::that(function ($tracer) { - $spans = $tracer->spans(); - return count($spans) == 3 && $spans[2]->spanData()->name() == 'GuzzleHttp::request'; + $this->exporter->export(Argument::that(function ($spans) { + return count($spans) == 3 && $spans[2]->name() == 'GuzzleHttp::request'; }))->shouldBeCalled(); $rt = Tracer::start($this->exporter->reveal(), [ diff --git a/tests/unit/Trace/Integrations/Guzzle/MiddlewareTest.php b/tests/unit/Trace/Integrations/Guzzle/MiddlewareTest.php index 8af6b0a4c..59a5931d0 100644 --- a/tests/unit/Trace/Integrations/Guzzle/MiddlewareTest.php +++ b/tests/unit/Trace/Integrations/Guzzle/MiddlewareTest.php @@ -45,9 +45,8 @@ public function setUp() public function testAddsSpanContextHeader() { - $this->exporter->report(Argument::that(function ($tracer) { - $spans = $tracer->spans(); - return count($spans) == 3 && $spans[2]->spanData()->name() == 'GuzzleHttp::request'; + $this->exporter->export(Argument::that(function ($spans) { + return count($spans) == 3 && $spans[2]->name() == 'GuzzleHttp::request'; }))->shouldBeCalled(); $rt = Tracer::start($this->exporter->reveal(), [ diff --git a/tests/unit/Trace/RequestHandlerTest.php b/tests/unit/Trace/RequestHandlerTest.php index 57a586178..54afd9dad 100644 --- a/tests/unit/Trace/RequestHandlerTest.php +++ b/tests/unit/Trace/RequestHandlerTest.php @@ -31,7 +31,7 @@ */ class RequestHandlerTest extends TestCase { - private $reporter; + private $exporter; private $sampler; @@ -40,7 +40,7 @@ public function setUp() if (extension_loaded('opencensus')) { opencensus_trace_clear(); } - $this->reporter = $this->prophesize(ExporterInterface::class); + $this->exporter = $this->prophesize(ExporterInterface::class); $this->sampler = $this->prophesize(SamplerInterface::class); } @@ -49,7 +49,7 @@ public function testCanTrackContext() $this->sampler->shouldSample()->willReturn(true); $rt = new RequestHandler( - $this->reporter->reveal(), + $this->exporter->reveal(), $this->sampler->reveal(), new HttpHeaderPropagator(), [ @@ -74,7 +74,7 @@ public function testCanTrackContext() public function testCanParseParentContext() { $rt = new RequestHandler( - $this->reporter->reveal(), + $this->exporter->reveal(), $this->sampler->reveal(), new HttpHeaderPropagator(), [ @@ -93,7 +93,7 @@ public function testCanParseParentContext() public function testForceEnabledContextHeader() { $rt = new RequestHandler( - $this->reporter->reveal(), + $this->exporter->reveal(), $this->sampler->reveal(), new HttpHeaderPropagator(), [ @@ -111,7 +111,7 @@ public function testForceEnabledContextHeader() public function testForceDisabledContextHeader() { $rt = new RequestHandler( - $this->reporter->reveal(), + $this->exporter->reveal(), $this->sampler->reveal(), new HttpHeaderPropagator(), [ From be68522f722883136b748e20e0bc2296594b759e Mon Sep 17 00:00:00 2001 From: Jeff Ching Date: Wed, 28 Mar 2018 14:15:25 -0700 Subject: [PATCH 3/6] Fix extension test --- src/Trace/Tracer/ExtensionTracer.php | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/Trace/Tracer/ExtensionTracer.php b/src/Trace/Tracer/ExtensionTracer.php index 7e2894837..62b8393db 100644 --- a/src/Trace/Tracer/ExtensionTracer.php +++ b/src/Trace/Tracer/ExtensionTracer.php @@ -81,17 +81,18 @@ public function startSpan(array $spanOptions) */ public function withSpan(Span $span) { - $startTime = $span->startTime() - ? (float)($span->startTime()->format('U.u')) + $spanData = $span->spanData(); + $startTime = $spanData->startTime() + ? (float)($spanData->startTime()->format('U.u')) : microtime(true); $info = [ - 'spanId' => $span->spanId(), - 'parentSpanId' => $span->parentSpanId(), + 'spanId' => $spanData->spanId(), + 'parentSpanId' => $spanData->parentSpanId(), 'startTime' => $startTime, - 'attributes' => $span->attributes(), - 'stackTrace' => $span->stackTrace() + 'attributes' => $spanData->attributes(), + 'stackTrace' => $spanData->stackTrace() ]; - opencensus_trace_begin($span->name(), $info); + opencensus_trace_begin($spanData->name(), $info); return new Scope(function () { opencensus_trace_finish(); }); From 62b73480f6acbce40378da41e25a6dae792ede8d Mon Sep 17 00:00:00 2001 From: Jeff Ching Date: Wed, 28 Mar 2018 14:21:15 -0700 Subject: [PATCH 4/6] Fix doc for EchoExporter --- src/Trace/Exporter/EchoExporter.php | 2 +- tests/unit/Core/ContextTest.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Trace/Exporter/EchoExporter.php b/src/Trace/Exporter/EchoExporter.php index fa91f1bbf..47e6db01d 100644 --- a/src/Trace/Exporter/EchoExporter.php +++ b/src/Trace/Exporter/EchoExporter.php @@ -37,7 +37,7 @@ class EchoExporter implements ExporterInterface /** * Report the provided Trace to a backend. * - * @param TracerInterface $tracer + * @param SpanData[] $spans * @return bool */ public function export(array $spans) diff --git a/tests/unit/Core/ContextTest.php b/tests/unit/Core/ContextTest.php index dd351ee96..16805c37c 100644 --- a/tests/unit/Core/ContextTest.php +++ b/tests/unit/Core/ContextTest.php @@ -69,7 +69,7 @@ public function testRestoringCurrentContext() } /** - * @expectedException PHPUnit\Framework\Error\Warning + * @expectedException \PHPUnit\Framework\Error\Warning */ public function testRestoringCurrentContextRequiresSameObject() { From ed2bbb221faf910faaf32a7175f2d1057ab816ce Mon Sep 17 00:00:00 2001 From: Jeff Ching Date: Wed, 28 Mar 2018 14:30:55 -0700 Subject: [PATCH 5/6] Mock StackdriverExporter client for tests --- tests/unit/Trace/Exporter/StackdriverExporterTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/unit/Trace/Exporter/StackdriverExporterTest.php b/tests/unit/Trace/Exporter/StackdriverExporterTest.php index 805b22684..79586348e 100644 --- a/tests/unit/Trace/Exporter/StackdriverExporterTest.php +++ b/tests/unit/Trace/Exporter/StackdriverExporterTest.php @@ -118,7 +118,7 @@ public function testStacktrace() public function testEmptyTrace() { - $exporter = new StackdriverExporter(); + $exporter = new StackdriverExporter(['client' => $this->client->reveal()]); $this->assertFalse($exporter->export([])); } @@ -143,7 +143,7 @@ public function testMapsAttributes($key, $value, $expectedAttributeKey, $expecte $span->setStartTime(); $span->setEndTime(); - $exporter = new StackdriverExporter(); + $exporter = new StackdriverExporter(['client' => $this->client->reveal()]); $spans = $exporter->convertSpans([$span->spanData()]); $this->assertCount(1, $spans); $span = $spans[0]; From 0f75d4341ff82d883f761cb7a44f69be12e76b7c Mon Sep 17 00:00:00 2001 From: Jeff Ching Date: Wed, 28 Mar 2018 14:39:58 -0700 Subject: [PATCH 6/6] Missed spot to mock Stackdriver client --- tests/unit/Trace/Exporter/StackdriverExporterTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/Trace/Exporter/StackdriverExporterTest.php b/tests/unit/Trace/Exporter/StackdriverExporterTest.php index 79586348e..b4eed8e07 100644 --- a/tests/unit/Trace/Exporter/StackdriverExporterTest.php +++ b/tests/unit/Trace/Exporter/StackdriverExporterTest.php @@ -109,7 +109,7 @@ public function testStacktrace() $span->setStartTime(); $span->setEndTime(); - $exporter = new StackdriverExporter(); + $exporter = new StackdriverExporter(['client' => $this->client->reveal()]); $spans = $exporter->convertSpans([$span->spanData()]); $data = $spans[0]->jsonSerialize();