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

Commit eb528d3

Browse files
authored
Set defaults for sameProcessAsParentSpan (#153)
The first span defaults to false (from an external process). Subsequent spans default to true (running in the same PHP process).
1 parent 1b4d307 commit eb528d3

File tree

9 files changed

+114
-6
lines changed

9 files changed

+114
-6
lines changed

ext/opencensus_trace_span.c

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,28 @@ static PHP_METHOD(OpenCensusTraceSpan, kind) {
320320
RETURN_ZVAL(val, 1, 0);
321321
}
322322

323+
/**
324+
* Fetch the sameProcessAsParentSpan attribute of the span.
325+
*
326+
* @return bool
327+
*/
328+
static PHP_METHOD(OpenCensusTraceSpan, sameProcessAsParentSpan) {
329+
zval *val, rv;
330+
331+
if (zend_parse_parameters_none() == FAILURE) {
332+
return;
333+
}
334+
335+
val = zend_read_property(opencensus_trace_span_ce, getThis(), "sameProcessAsParentSpan", sizeof("sameProcessAsParentSpan") - 1, 1, &rv);
336+
switch (Z_TYPE_P(val)) {
337+
case IS_FALSE:
338+
RETURN_FALSE;
339+
case IS_TRUE:
340+
default:
341+
RETURN_TRUE
342+
}
343+
}
344+
323345
/* Declare method entries for the OpenCensus\Trace\Span class */
324346
static zend_function_entry opencensus_trace_span_methods[] = {
325347
PHP_ME(OpenCensusTraceSpan, __construct, arginfo_OpenCensusTraceSpan_construct, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
@@ -334,6 +356,7 @@ static zend_function_entry opencensus_trace_span_methods[] = {
334356
PHP_ME(OpenCensusTraceSpan, links, NULL, ZEND_ACC_PUBLIC)
335357
PHP_ME(OpenCensusTraceSpan, timeEvents, NULL, ZEND_ACC_PUBLIC)
336358
PHP_ME(OpenCensusTraceSpan, kind, NULL, ZEND_ACC_PUBLIC)
359+
PHP_ME(OpenCensusTraceSpan, sameProcessAsParentSpan, NULL, ZEND_ACC_PUBLIC)
337360
PHP_FE_END
338361
};
339362

@@ -356,6 +379,7 @@ int opencensus_trace_span_minit(INIT_FUNC_ARGS) {
356379
zend_declare_property_null(opencensus_trace_span_ce, "links", sizeof("links") - 1, ZEND_ACC_PROTECTED TSRMLS_CC);
357380
zend_declare_property_null(opencensus_trace_span_ce, "timeEvents", sizeof("timeEvents") - 1, ZEND_ACC_PROTECTED TSRMLS_CC);
358381
zend_declare_property_null(opencensus_trace_span_ce, "kind", sizeof("kind") - 1, ZEND_ACC_PROTECTED TSRMLS_CC);
382+
zend_declare_property_null(opencensus_trace_span_ce, "sameProcessAsParentSpan", sizeof("sameProcessAsParentSpan") - 1, ZEND_ACC_PROTECTED TSRMLS_CC);
359383

360384
return SUCCESS;
361385
}
@@ -412,6 +436,7 @@ opencensus_trace_span_t *opencensus_trace_span_alloc()
412436
);
413437
span->start = 0;
414438
span->stop = 0;
439+
span->same_process_as_parent_span = 1;
415440
ALLOC_HASHTABLE(span->attributes);
416441
zend_hash_init(span->attributes, 4, NULL, ZVAL_PTR_DTOR, 0);
417442

@@ -540,6 +565,10 @@ int opencensus_trace_span_apply_span_options(opencensus_trace_span_t *span, zval
540565
zend_string_release(span->kind);
541566
}
542567
span->kind = zend_string_copy(Z_STR_P(v));
568+
} else if (strcmp(ZSTR_VAL(k), "sameProcessAsParentSpan") == 0) {
569+
if (Z_TYPE_P(v) == IS_FALSE) {
570+
span->same_process_as_parent_span = 0;
571+
}
543572
}
544573
} ZEND_HASH_FOREACH_END();
545574
return SUCCESS;
@@ -611,6 +640,7 @@ int opencensus_trace_span_to_zval(opencensus_trace_span_t *trace_span, zval *spa
611640
if (trace_span->kind) {
612641
zend_update_property_str(opencensus_trace_span_ce, span, "kind", sizeof("kind") - 1, trace_span->kind);
613642
}
643+
zend_update_property_bool(opencensus_trace_span_ce, span, "sameProcessAsParentSpan", sizeof("sameProcessAsParentSpan") - 1, trace_span->same_process_as_parent_span);
614644

615645
return SUCCESS;
616646
}

ext/opencensus_trace_span.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ typedef struct opencensus_trace_span_t {
3232
double stop;
3333
struct opencensus_trace_span_t *parent;
3434
zval stackTrace;
35+
zend_long same_process_as_parent_span;
3536

3637
// zend_string* => zval*
3738
HashTable *attributes;

ext/tests/manual_spans_default_options.phpt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ Array
4545
)
4646

4747
[kind:protected] => SPAN_KIND_UNSPECIFIED
48+
[sameProcessAsParentSpan:protected] => 1
4849
)
4950

5051
[1] => OpenCensus\Trace\Ext\Span Object
@@ -71,6 +72,7 @@ Array
7172
)
7273

7374
[kind:protected] => SPAN_KIND_UNSPECIFIED
75+
[sameProcessAsParentSpan:protected] => 1
7476
)
7577

7678
)
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
--TEST--
2+
OpenCensus Trace: Set span sameProcessAsParentSpan
3+
--FILE--
4+
<?php
5+
opencensus_trace_begin('/', [
6+
'startTime' => 0.1,
7+
'sameProcessAsParentSpan' => true
8+
]);
9+
opencensus_trace_begin('inner-1', [
10+
'sameProcessAsParentSpan' => false
11+
]);
12+
opencensus_trace_finish();
13+
opencensus_trace_finish();
14+
$traces = opencensus_trace_list();
15+
echo "Number of traces: " . count($traces) . "\n";
16+
var_dump($traces[0]->sameProcessAsParentSpan());
17+
var_dump($traces[1]->sameProcessAsParentSpan());
18+
?>
19+
--EXPECT--
20+
Number of traces: 2
21+
bool(true)
22+
bool(false)

src/Trace/RequestHandler.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,8 @@ public function __construct(
116116
'startTime' => $this->startTimeFromHeaders($this->headers),
117117
'name' => $this->nameFromHeaders($this->headers),
118118
'attributes' => [],
119-
'kind' => Span::KIND_SERVER
119+
'kind' => Span::KIND_SERVER,
120+
'sameProcessAsParentSpan' => false
120121
];
121122
$this->rootSpan = $this->tracer->startSpan($spanOptions);
122123
$this->scope = $this->tracer->withSpan($this->rootSpan);

src/Trace/Span.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ public function __construct($options = [])
174174
'links' => [],
175175
'parentSpanId' => null,
176176
'status' => null,
177-
'sameProcessAsParentSpan' => null,
177+
'sameProcessAsParentSpan' => true,
178178
'kind' => self::KIND_UNSPECIFIED
179179
];
180180

src/Trace/Tracer/ContextTracer.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,9 @@ public function __construct(SpanContext $initialContext = null)
6060
*/
6161
public function inSpan(array $spanOptions, callable $callable, array $arguments = [])
6262
{
63-
$span = $this->startSpan($spanOptions);
63+
$span = $this->startSpan($spanOptions + [
64+
'sameProcessAsParentSpan' => !empty($this->spans)
65+
]);
6466
$scope = $this->withSpan($span);
6567
try {
6668
return call_user_func_array($callable, $arguments);

src/Trace/Tracer/ExtensionTracer.php

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@
3131
*/
3232
class ExtensionTracer implements TracerInterface
3333
{
34+
/**
35+
* @var bool
36+
*/
37+
private $hasSpans = false;
38+
3439
public function __construct(SpanContext $initialContext = null)
3540
{
3641
if ($initialContext) {
@@ -49,7 +54,9 @@ public function __construct(SpanContext $initialContext = null)
4954
*/
5055
public function inSpan(array $spanOptions, callable $callable, array $arguments = [])
5156
{
52-
$span = $this->startSpan($spanOptions);
57+
$span = $this->startSpan($spanOptions + [
58+
'sameProcessAsParentSpan' => $this->hasSpans
59+
]);
5360
$scope = $this->withSpan($span);
5461
try {
5562
return call_user_func_array($callable, $arguments);
@@ -91,9 +98,11 @@ public function withSpan(Span $span)
9198
'startTime' => $startTime,
9299
'attributes' => $spanData->attributes(),
93100
'stackTrace' => $spanData->stackTrace(),
94-
'kind' => $spanData->kind()
101+
'kind' => $spanData->kind(),
102+
'sameProcessAsParentSpan' => $spanData->sameProcessAsParentSpan()
95103
];
96104
opencensus_trace_begin($spanData->name(), $info);
105+
$this->hasSpans = true;
97106
return new Scope(function () {
98107
opencensus_trace_finish();
99108
});
@@ -249,7 +258,8 @@ private function mapSpan($span)
249258
'stackTrace' => $span->stackTrace(),
250259
'links' => array_map([$this, 'mapLink'], $span->links()),
251260
'timeEvents' => array_map([$this, 'mapTimeEvent'], $span->timeEvents()),
252-
'kind' => $this->getKind($span)
261+
'kind' => $this->getKind($span),
262+
'sameProcessAsParentSpan' => $this->getSameProcessAsParentSpan($span)
253263
]);
254264
}
255265

@@ -261,6 +271,14 @@ private function getKind($span)
261271
return Span::KIND_UNSPECIFIED;
262272
}
263273

274+
private function getSameProcessAsParentSpan($span)
275+
{
276+
if (method_exists($span, 'sameProcessAsParentSpan')) {
277+
return $span->sameProcessAsParentSpan();
278+
}
279+
return true;
280+
}
281+
264282
private function mapLink($link)
265283
{
266284
return new Link($link->traceId(), $link->spanId(), $link->options());

tests/unit/Trace/Tracer/AbstractTracerTest.php

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,38 @@ public function testSetSpanKind()
359359
$this->assertEquals(Span::KIND_SERVER, $spanData->kind());
360360
}
361361

362+
public function testDefaultSameProcessAsParentSpan()
363+
{
364+
$class = $this->getTracerClass();
365+
$tracer = new $class();
366+
$tracer->inSpan(['name' => 'main'], function () use ($tracer) {
367+
$tracer->inSpan(['name' => 'inner'], function () {
368+
// do nothing
369+
});
370+
});
371+
372+
$spans = $tracer->spans();
373+
$this->assertCount(2, $spans);
374+
$this->assertFalse($spans[0]->spanData()->sameProcessAsParentSpan());
375+
$this->assertTrue($spans[1]->spanData()->sameProcessAsParentSpan());
376+
}
377+
378+
public function testSameProcessAsParentSpan()
379+
{
380+
$class = $this->getTracerClass();
381+
$tracer = new $class();
382+
$tracer->inSpan(['name' => 'main', 'sameProcessAsParentSpan' => true], function () use ($tracer) {
383+
$tracer->inSpan(['name' => 'inner', 'sameProcessAsParentSpan' => false], function () {
384+
// do nothing
385+
});
386+
});
387+
388+
$spans = $tracer->spans();
389+
$this->assertCount(2, $spans);
390+
$this->assertTrue($spans[0]->spanData()->sameProcessAsParentSpan());
391+
$this->assertFalse($spans[1]->spanData()->sameProcessAsParentSpan());
392+
}
393+
362394
private function assertEquivalentTimestamps($expected, $value)
363395
{
364396
$this->assertEquals((float)($expected->format('U.u')), (float)($value->format('U.u')), '', 0.000001);

0 commit comments

Comments
 (0)