Skip to content
This repository was archived by the owner on Oct 3, 2023. It is now read-only.

Commit bec83f9

Browse files
jcchavezschingor13
authored andcommitted
[#125] Adds support for zipkin span.kind tag. (#138)
* [#125] Adds support for zipkin span.kind tag. * [#125] Fixes compatibility with 7.2 * [#125] Fixes lint
1 parent 50c5134 commit bec83f9

File tree

2 files changed

+59
-13
lines changed

2 files changed

+59
-13
lines changed

src/Trace/Exporter/ZipkinExporter.php

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
namespace OpenCensus\Trace\Exporter;
1919

20+
use OpenCensus\Trace\MessageEvent;
2021
use OpenCensus\Trace\Tracer\TracerInterface;
2122
use OpenCensus\Trace\Span;
2223

@@ -35,6 +36,9 @@
3536
*/
3637
class ZipkinExporter implements ExporterInterface
3738
{
39+
const KIND_SERVER = 'SERVER';
40+
const KIND_CLIENT = 'CLIENT';
41+
3842
/**
3943
* @var string
4044
*/
@@ -153,7 +157,7 @@ public function convertSpans(TracerInterface $tracer, $headers = null)
153157
$isDebug = array_key_exists('HTTP_X_B3_FLAGS', $headers) && $headers['HTTP_X_B3_FLAGS'] == '1';
154158

155159
// True if we are contributing to a span started by another tracer (ex on a different host).
156-
$isShared = !empty($spans) && $spans[0]->parentSpanId() != null;
160+
$isShared = !empty($spans) && $spans[0]->parentSpanId() !== null;
157161

158162
$zipkinSpans = [];
159163
foreach ($spans as $span) {
@@ -180,12 +184,46 @@ public function convertSpans(TracerInterface $tracer, $headers = null)
180184
'debug' => $isDebug,
181185
'shared' => $isShared,
182186
'localEndpoint' => $this->localEndpoint,
183-
'tags' => $attributes
187+
'tags' => $attributes,
184188
];
185189

190+
if (null !== ($kind = $this->spanKind($span))) {
191+
$zipkinSpan['kind'] = $kind;
192+
}
193+
186194
$zipkinSpans[] = $zipkinSpan;
187195
}
188196

189197
return $zipkinSpans;
190198
}
199+
200+
private function spanKind(Span $span)
201+
{
202+
if (strpos($span->name(), 'Sent.') === 0) {
203+
return self::KIND_CLIENT;
204+
}
205+
206+
if (strpos($span->name(), 'Recv.') === 0) {
207+
return self::KIND_SERVER;
208+
}
209+
210+
if ($span->timeEvents()) {
211+
foreach ($span->timeEvents() as $event) {
212+
if (!($event instanceof MessageEvent)) {
213+
continue;
214+
}
215+
216+
switch ($event->type()) {
217+
case MessageEvent::TYPE_SENT:
218+
return self::KIND_CLIENT;
219+
break;
220+
case MessageEvent::TYPE_RECEIVED:
221+
return self::KIND_SERVER;
222+
break;
223+
}
224+
}
225+
}
226+
227+
return null;
228+
}
191229
}

tests/unit/Trace/Exporter/ZipkinExporterTest.php

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
use OpenCensus\Core\Context;
2121
use OpenCensus\Trace\Exporter\ZipkinExporter;
22+
use OpenCensus\Trace\MessageEvent;
2223
use OpenCensus\Trace\SpanContext;
2324
use OpenCensus\Trace\Span;
2425
use OpenCensus\Trace\Tracer\TracerInterface;
@@ -79,25 +80,32 @@ public function testFormatsTrace()
7980
}
8081
}
8182

82-
public function testSpanKind()
83+
/**
84+
* @dataProvider spanOptionsForKind
85+
*/
86+
public function testSpanKind($spanOpts, $kind)
8387
{
8488
$tracer = new ContextTracer(new SpanContext('testtraceid'));
85-
$tracer->inSpan(['name' => 'main'], function () use ($tracer) {
86-
$tracer->inSpan(['name' => 'span1'], 'usleep', [1]);
87-
$tracer->inSpan(['name' => 'span2'], 'usleep', [1]);
88-
$tracer->inSpan(['name' => 'span3'], 'usleep', [1]);
89-
$tracer->inSpan(['name' => 'span4'], 'usleep', [1]);
89+
$tracer->inSpan(['name' => 'main'], function () use ($tracer, $spanOpts) {
90+
$tracer->inSpan($spanOpts, 'usleep', [1]);
9091
});
9192

9293
$reporter = new ZipkinExporter('myapp', 'localhost', 9411);
9394
$spans = $reporter->convertSpans($tracer);
9495

95-
$annotationValue = function ($annotation) {
96-
return $annotation['value'];
97-
};
98-
99-
$this->assertCount(5, $spans);
96+
$this->assertCount(2, $spans);
10097
$this->assertFalse(array_key_exists('kind', $spans[0]));
98+
$this->assertEquals($kind, $spans[1]['kind']);
99+
}
100+
101+
public function spanOptionsForKind()
102+
{
103+
return [
104+
[['name' => 'Recv.Span1'], 'SERVER'],
105+
[['name' => 'Sent.Span2'], 'CLIENT'],
106+
[['name' => 'span3', 'timeEvents' => [new MessageEvent(MessageEvent::TYPE_RECEIVED, '')]], 'SERVER'],
107+
[['name' => 'span4', 'timeEvents' => [new MessageEvent(MessageEvent::TYPE_SENT, '')]], 'CLIENT'],
108+
];
101109
}
102110

103111
public function testSpanDebug()

0 commit comments

Comments
 (0)