Skip to content

Commit d6aceba

Browse files
committed
fix: update tracing and span logic
1 parent 141c063 commit d6aceba

6 files changed

Lines changed: 111 additions & 14 deletions

File tree

src/Tracing/SpanScope.php

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
use LaravelTrace\LaravelTrace\Context\TraceContext;
88
use LaravelTrace\LaravelTrace\Span\Span;
9+
use Throwable;
910

1011
final class SpanScope
1112
{
@@ -22,16 +23,42 @@ public function span(): Span
2223
return $this->span;
2324
}
2425

25-
public function close(): void
26+
public function close(): Span
2627
{
2728
if ($this->closed) {
28-
return;
29+
return $this->span;
2930
}
3031

3132
$this->closed = true;
3233

34+
$completed = $this->tracer->complete(
35+
$this->span,
36+
);
37+
3338
$this->tracer->setContext(
3439
$this->previousContext,
3540
);
41+
42+
return $completed;
43+
}
44+
45+
public function fail(Throwable $exception): Span
46+
{
47+
if ($this->closed) {
48+
return $this->span;
49+
}
50+
51+
$this->closed = true;
52+
53+
$failed = $this->tracer->fail(
54+
$this->span,
55+
$exception,
56+
);
57+
58+
$this->tracer->setContext(
59+
$this->previousContext,
60+
);
61+
62+
return $failed;
3663
}
3764
}

src/Tracing/Tracer.php

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
namespace LaravelTrace\LaravelTrace\Tracing;
66

7+
use DateTimeImmutable;
78
use LaravelTrace\LaravelTrace\Context\TraceContext;
89
use LaravelTrace\LaravelTrace\Contracts\TraceContextStore;
910
use LaravelTrace\LaravelTrace\Contracts\Tracer as TracerContract;
@@ -20,7 +21,15 @@ public function __construct(
2021

2122
public function start(string $name): Trace
2223
{
23-
return Trace::start($name);
24+
$trace = Trace::start($name);
25+
26+
$this->setContext(
27+
new TraceContext(
28+
traceId: $trace->id,
29+
),
30+
);
31+
32+
return $trace;
2433
}
2534

2635
public function span(
@@ -67,4 +76,18 @@ public function clearContext(): void
6776
{
6877
$this->contextStore->clear();
6978
}
79+
80+
public function complete(Span $span): Span
81+
{
82+
return $span->complete(
83+
new DateTimeImmutable,
84+
);
85+
}
86+
87+
public function fail(Span $span): Span
88+
{
89+
return $span->fail(
90+
new DateTimeImmutable,
91+
);
92+
}
7093
}

tests/Unit/Context/TraceContextTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
});
5252

5353
it('sets the trace context when starting a trace', function () {
54-
$store = new InMemoryTraceContextStore();
54+
$store = new InMemoryTraceContextStore;
5555
$tracer = new Tracer($store);
5656

5757
$trace = $tracer->start('CreateOrder');

tests/Unit/Span/SpanTest.php

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,3 +49,45 @@
4949
->and($child->parentId)
5050
->toBe($parent->id);
5151
});
52+
53+
it('completes a span', function () {
54+
$traceId = TraceId::generate();
55+
56+
$span = Span::start(
57+
traceId: $traceId,
58+
name: 'ReserveInventory',
59+
type: SpanType::Action,
60+
);
61+
62+
$finishedAt = new DateTimeImmutable;
63+
64+
$completed = $span->complete($finishedAt);
65+
66+
expect($completed->status)
67+
->toBe(SpanStatus::Completed)
68+
->and($completed->finishedAt)
69+
->toBe($finishedAt)
70+
->and($span->status)
71+
->toBe(SpanStatus::Running);
72+
});
73+
74+
it('fails a span', function () {
75+
$traceId = TraceId::generate();
76+
77+
$span = Span::start(
78+
traceId: $traceId,
79+
name: 'ReserveInventory',
80+
type: SpanType::Action,
81+
);
82+
83+
$finishedAt = new DateTimeImmutable;
84+
85+
$failed = $span->fail($finishedAt);
86+
87+
expect($failed->status)
88+
->toBe(SpanStatus::Failed)
89+
->and($failed->finishedAt)
90+
->toBe($finishedAt)
91+
->and($span->status)
92+
->toBe(SpanStatus::Running);
93+
});

tests/Unit/Tracing/SpanScopeTest.php

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,10 @@
44

55
use LaravelTrace\LaravelTrace\Context\InMemoryTraceContextStore;
66
use LaravelTrace\LaravelTrace\Span\SpanType;
7-
use LaravelTrace\LaravelTrace\Tracing\SpanScope;
87
use LaravelTrace\LaravelTrace\Tracing\Tracer;
98

109
it('restores the previous context when closed', function () {
11-
$store = new InMemoryTraceContextStore();
10+
$store = new InMemoryTraceContextStore;
1211
$tracer = new Tracer($store);
1312

1413
$tracer->start('CreateOrder');

tests/Unit/Tracing/TracerTest.php

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,16 @@
22

33
declare(strict_types=1);
44

5+
use LaravelTrace\LaravelTrace\Context\InMemoryTraceContextStore;
56
use LaravelTrace\LaravelTrace\Span\SpanStatus;
67
use LaravelTrace\LaravelTrace\Span\SpanType;
78
use LaravelTrace\LaravelTrace\Trace\TraceStatus;
89
use LaravelTrace\LaravelTrace\Tracing\Tracer;
910

10-
it('starts a trace', function (): void {
11-
$tracer = new Tracer;
11+
it('starts a trace', function () {
12+
$tracer = new Tracer(
13+
new InMemoryTraceContextStore(),
14+
);
1215

1316
$trace = $tracer->start('CreateOrder');
1417

@@ -18,17 +21,20 @@
1821
->toBe(TraceStatus::Running);
1922
});
2023

21-
it('starts a span inside a trace', function (): void {
22-
$tracer = new Tracer;
24+
it('starts a span inside a trace', function () {
25+
$tracer = new Tracer(
26+
new InMemoryTraceContextStore(),
27+
);
2328

2429
$trace = $tracer->start('CreateOrder');
2530

26-
$span = $tracer->startSpan(
27-
trace: $trace,
28-
name: 'ReserveInventory',
29-
type: SpanType::Action,
31+
$scope = $tracer->span(
32+
'ReserveInventory',
33+
SpanType::Action,
3034
);
3135

36+
$span = $scope->span();
37+
3238
expect($span->traceId)
3339
->toBe($trace->id)
3440
->and($span->name)

0 commit comments

Comments
 (0)