Skip to content

Commit c8ed125

Browse files
Added parent trace ID
1 parent 5306100 commit c8ed125

5 files changed

Lines changed: 104 additions & 12 deletions

File tree

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
],
2222
"require": {
2323
"php": "^8.2",
24-
"dragon-code/request-tracker": "^1.1",
24+
"dragon-code/request-tracker": "^1.4",
2525
"illuminate/http": "^11.0 || ^12.0 || ^13.0",
2626
"illuminate/support": "^11.0 || ^12.0 || ^13.0"
2727
},

src/Helpers/ContextHelper.php

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace DragonCode\LaravelRequestTracker\Helpers;
6+
7+
use Illuminate\Contracts\Support\Arrayable;
8+
use Illuminate\Support\Facades\Context;
9+
10+
class ContextHelper implements Arrayable
11+
{
12+
protected ?string $userId = null;
13+
14+
protected ?string $ip = null;
15+
16+
protected ?string $traceId = null;
17+
18+
public function userId(?string $id): static
19+
{
20+
$this->userId = $id;
21+
22+
return $this;
23+
}
24+
25+
public function ip(?string $ip): static
26+
{
27+
$this->ip = $ip;
28+
29+
return $this;
30+
}
31+
32+
public function traceId(?string $id): static
33+
{
34+
$this->traceId = $id;
35+
36+
return $this;
37+
}
38+
39+
public function toArray(): array
40+
{
41+
$result = [];
42+
43+
if ($this->userId) {
44+
$result['userId'] = $this->userId;
45+
}
46+
47+
if ($this->ip) {
48+
$result['ip'] = $this->ip;
49+
}
50+
51+
if ($this->traceId) {
52+
$result['traceId'] = $this->traceId;
53+
}
54+
55+
if ($trace = $this->getParentTraceId()) {
56+
$result['parentTraceId'] = $trace;
57+
}
58+
59+
return $result;
60+
}
61+
62+
public function store(): void
63+
{
64+
Context::add(TrackerConfig::contextKey(), $this->toArray());
65+
}
66+
67+
protected function getParentTraceId(): ?string
68+
{
69+
$context = Context::get(TrackerConfig::contextKey(), []);
70+
71+
if ($parent = $context['parentTraceId'] ?? null) {
72+
return $parent;
73+
}
74+
75+
$trace = $context['traceId'] ?? null;
76+
77+
return $trace === $this->traceId ? null : $trace;
78+
}
79+
}

src/Http/Middleware/RequestTrackerMiddleware.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
namespace DragonCode\LaravelRequestTracker\Http\Middleware;
66

77
use Closure;
8+
use DragonCode\LaravelRequestTracker\Helpers\ContextHelper;
89
use DragonCode\LaravelRequestTracker\Helpers\TrackerConfig;
910
use DragonCode\RequestTracker\TrackerHeader;
1011
use DragonCode\RequestTracker\TrackerRequest;
1112
use Illuminate\Http\Request;
12-
use Illuminate\Support\Facades\Context;
1313
use Symfony\Component\HttpFoundation\Response;
1414

1515
class RequestTrackerMiddleware
@@ -54,10 +54,10 @@ protected function headers(): TrackerHeader
5454

5555
protected function context(TrackerRequest $request): void
5656
{
57-
Context::add(TrackerConfig::contextKey(), [
58-
'userId' => $request->getUserId(),
59-
'ip' => $request->getIp(),
60-
'traceId' => $request->getTraceId(),
61-
]);
57+
(new ContextHelper)
58+
->userId($request->getUserId())
59+
->ip($request->getIp())
60+
->traceId($request->getTraceId())
61+
->store();
6262
}
6363
}

src/LaravelRequestTrackerServiceProvider.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44

55
namespace DragonCode\LaravelRequestTracker;
66

7+
use DragonCode\LaravelRequestTracker\Helpers\ContextHelper;
78
use DragonCode\LaravelRequestTracker\Http\Middleware\RequestTrackerMiddleware;
9+
use DragonCode\RequestTracker\TrackerUuid;
810
use Illuminate\Support\ServiceProvider;
911

1012
class LaravelRequestTrackerServiceProvider extends ServiceProvider
@@ -20,6 +22,7 @@ public function register(): void
2022
{
2123
$this->registerConfig();
2224
$this->registerMiddleware();
25+
$this->registerTrackingData();
2326
}
2427

2528
protected function registerConfig(): void
@@ -38,4 +41,11 @@ protected function registerMiddleware(): void
3841
$router->prependMiddlewareToGroup($name, RequestTrackerMiddleware::class);
3942
}
4043
}
44+
45+
protected function registerTrackingData(): void
46+
{
47+
(new ContextHelper)
48+
->traceId(TrackerUuid::get())
49+
->store();
50+
}
4151
}

tests/Feature/MiddlewareTest.php

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,13 @@ function (Request $request) use (&$captured): Response {
3535

3636
expect($context)
3737
->toBeArray()
38-
->toHaveKeys(['userId', 'ip', 'traceId']);
38+
->toHaveKeys(['ip', 'traceId', 'parentTraceId'])
39+
->not
40+
->toHaveKey('userId');
3941

40-
expect($context['userId'])->toBeEmpty();
4142
expect($context['ip'])->toBe('198.51.100.42');
42-
expect($context['traceId'])->toBe($trace);
43+
expect($context['traceId'])->toBeUuid()->toBe($trace);
44+
expect($context['parentTraceId'])->toBeUuid();
4345
});
4446

4547
it('uses authenticated user id when available', function () {
@@ -76,8 +78,8 @@ function (Request $request) use (&$captured): Response {
7678
$middleware = new RequestTrackerMiddleware;
7779

7880
$existing = [
79-
'X-Tracker-User-Id' => '777',
80-
'X-Tracker-Ip' => '192.0.2.55',
81+
'X-Tracker-User-Id' => '777',
82+
'X-Tracker-Ip' => '192.0.2.55',
8183
'X-Tracker-Trace-Id' => (string) Str::uuid(),
8284
];
8385

@@ -101,4 +103,5 @@ function (Request $request) use (&$captured): Response {
101103
expect($context['userId'])->toBe('777');
102104
expect($context['ip'])->toBe('192.0.2.55');
103105
expect($context['traceId'])->toBe($existing['X-Tracker-Trace-Id']);
106+
expect($context['parentTraceId'])->toBeUuid();
104107
});

0 commit comments

Comments
 (0)