Skip to content

Commit 00d44ec

Browse files
Merge pull request #19 from spatie/livewire-tracing
Add support for livewire tracing
2 parents 126b8bc + 89346d1 commit 00d44ec

24 files changed

+689
-43
lines changed

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
"ext-mbstring": "*",
2323
"illuminate/support": "^11.46|^12.0",
2424
"spatie/error-solutions": "^2.0",
25-
"spatie/flare-client-php": "^2.3",
25+
"spatie/flare-client-php": "^2.3.3",
2626
"spatie/laravel-error-share": "^1.0.3",
2727
"symfony/console": "^7.2.1",
2828
"symfony/var-dumper": "^7.2.3"

config/flare.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@
186186
'sampler' => [
187187
'class' => \Spatie\FlareClient\Sampling\RateSampler::class,
188188
'config' => [
189-
'rate' => 0.1,
189+
'rate' => env('FLARE_SAMPLER_RATE', 0.1),
190190
],
191191
],
192192

config/flare.php.stub

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ return [
138138
'sampler' => [
139139
'class' => \Spatie\FlareClient\Sampling\RateSampler::class,
140140
'config' => [
141-
'rate' => 0.1,
141+
'rate' => env('FLARE_SAMPLER_RATE', 0.1),
142142
],
143143
],
144144
];

phpstan-baseline.neon

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ parameters:
9393
-
9494
message: '#^Property Spatie\\FlareClient\\Support\\CollectsResolver\:\:\$middlewares \(array\<class\-string\<Spatie\\FlareClient\\FlareMiddleware\\FlareMiddleware\>, array\<string, mixed\>\>\) does not accept array\<string, array\<string, mixed\>\>\.$#'
9595
identifier: assign.propertyType
96-
count: 1
96+
count: 2
9797
path: src/Support/CollectsResolver.php
9898

9999
-

src/AttributesProviders/LaravelJobAttributesProvider.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ protected function resolveCommandProperties(object $command, int $maxChainDepth)
204204
'deleteWhenMissingModels',
205205
'messageGroup',
206206
'deduplicator',
207+
'tries',
207208
];
208209

209210
$properties = $jobProperties

src/AttributesProviders/LaravelRequestAttributesProvider.php

Lines changed: 62 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,30 @@
22

33
namespace Spatie\LaravelFlare\AttributesProviders;
44

5+
use Closure;
56
use Illuminate\Database\Eloquent\Model;
67
use Illuminate\Http\Request as LaravelRequest;
8+
use Illuminate\Routing\RedirectController;
79
use Illuminate\Routing\Route;
10+
use Illuminate\Routing\ViewController;
811
use Livewire\LivewireManager;
12+
use ReflectionFunction;
913
use Spatie\FlareClient\AttributesProviders\RequestAttributesProvider as BaseRequestAttributesProvider;
14+
use Spatie\LaravelFlare\Enums\LaravelRouteActionType;
1015
use Symfony\Component\HttpFoundation\Request;
1116
use Throwable;
1217

1318
class LaravelRequestAttributesProvider extends BaseRequestAttributesProvider
1419
{
15-
public function toArray(Request $request, bool $includeContents = true, bool $includeLivewireComponents = false): array
16-
{
20+
/**
21+
* @param array<string> $ignoreLivewireComponents
22+
*/
23+
public function toArray(
24+
Request $request,
25+
bool $includeContents = true,
26+
bool $includeLivewireComponents = false,
27+
array $ignoreLivewireComponents = []
28+
): array {
1729
if (! $request instanceof LaravelRequest) {
1830
return parent::toArray($request, $includeContents);
1931
}
@@ -34,7 +46,7 @@ public function toArray(Request $request, bool $includeContents = true, bool $in
3446

3547
return array_merge(
3648
$attributes,
37-
$provider->toArray($request, $livewireManager)
49+
$provider->toArray($request, $livewireManager, $ignoreLivewireComponents),
3850
);
3951
} catch (Throwable) {
4052
return $attributes;
@@ -72,10 +84,8 @@ protected function getRoute(LaravelRequest $request): array
7284
'http.route' => $route->uri(),
7385
'laravel.route.name' => $route->getName(),
7486
'laravel.route.parameters' => $this->getRouteParameters($route),
75-
'laravel.route.action' => $route->getActionName(),
7687
'laravel.route.middleware' => array_values($route->gatherMiddleware()),
77-
78-
'flare.entry_point.class' => $route->getActionName(),
88+
...$this->getActionAttributes($route),
7989
];
8090
}
8191

@@ -99,4 +109,50 @@ protected function isRunningLiveWire(LaravelRequest $request): bool
99109
{
100110
return $request->hasHeader('x-livewire') && $request->hasHeader('referer');
101111
}
112+
113+
protected function getActionAttributes(Route $route): array
114+
{
115+
$actionName = $route->getActionName();
116+
$type = LaravelRouteActionType::Controller;
117+
118+
if ($actionName === '\\'.ViewController::class
119+
&& ($view = $route->parameter('view'))
120+
&& is_string($view)
121+
) {
122+
$actionName = "view: {$view}";
123+
$type = LaravelRouteActionType::View;
124+
}
125+
126+
if ($actionName === '\\'.RedirectController::class
127+
&& ($destination = $route->parameter('destination'))
128+
&& is_string($destination)
129+
) {
130+
$actionName = "redirect: {$destination}";
131+
$type = LaravelRouteActionType::Redirect;
132+
}
133+
134+
if ($actionName === 'Closure' && $route->getAction('uses') instanceof Closure) {
135+
try {
136+
$closure = $route->getAction('uses');
137+
138+
$reflection = new ReflectionFunction($closure);
139+
140+
$filename = str_replace(
141+
rtrim(base_path(), '/').'/',
142+
'',
143+
$reflection->getFileName() ?: 'unknown file',
144+
);
145+
146+
$actionName = "closure: {$filename}";
147+
$type = LaravelRouteActionType::Closure;
148+
} catch (Throwable) {
149+
}
150+
}
151+
152+
return [
153+
'laravel.route.action' => $actionName,
154+
'laravel.route.action_type' => $type,
155+
'flare.entry_point.class' => $actionName,
156+
];
157+
}
102158
}

src/AttributesProviders/LivewireAttributesProvider.php

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,13 @@
1010

1111
class LivewireAttributesProvider
1212
{
13+
/**
14+
* @param array<string> $ignore
15+
*/
1316
public function toArray(
1417
Request $request,
1518
LivewireManager $livewire,
19+
array $ignore = [],
1620
): array {
1721
return [
1822
'http.request.method' => $livewire->originalMethod(),
@@ -21,11 +25,14 @@ public function toArray(
2125
'url.path' => parse_url($livewire->originalUrl(), PHP_URL_PATH),
2226
'url.query' => parse_url($livewire->originalUrl(), PHP_URL_QUERY),
2327
'flare.entry_point.value' => $livewire->originalUrl(),
24-
'livewire.components' => $this->getLivewire($request, $livewire),
28+
'livewire.components' => $this->getLivewire($request, $livewire, $ignore),
2529
];
2630
}
2731

28-
protected function getLivewire(Request $request, LivewireManager $livewireManager): array
32+
/**
33+
* @param array<string> $ignore
34+
*/
35+
protected function getLivewire(Request $request, LivewireManager $livewireManager, array $ignore): array
2936
{
3037
if ($request->has('components')) {
3138
$data = [];
@@ -35,6 +42,10 @@ protected function getLivewire(Request $request, LivewireManager $livewireManage
3542

3643
$class = app(ComponentRegistry::class)->getClass($snapshot['memo']['name']);
3744

45+
if (in_array($class, $ignore)) {
46+
continue;
47+
}
48+
3849
$data[] = [
3950
'component_class' => $class ?? null,
4051
'data' => $snapshot['data'],
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php
2+
3+
namespace Spatie\LaravelFlare\Enums;
4+
5+
enum LaravelRouteActionType: string
6+
{
7+
case Controller = 'controller';
8+
case Closure = 'closure';
9+
case View = 'view';
10+
case Redirect = 'redirect';
11+
case Unknown = 'unknown';
12+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
namespace Spatie\LaravelFlare\Enums;
4+
5+
enum LivewireComponentPhase: string
6+
{
7+
case Mounting = 'mounting';
8+
case Hydrating = 'hydrating';
9+
case Calling = 'calling';
10+
case Rendering = 'rendering';
11+
case Dehydrating = 'dehydrating';
12+
13+
public static function fromLivewireProfileEvent(string $name): ?self
14+
{
15+
if (str_starts_with($name, 'call')) {
16+
$name = 'call';
17+
}
18+
19+
return match ($name) {
20+
'mount' => self::Mounting,
21+
'hydrate' => self::Hydrating,
22+
'call' => self::Calling,
23+
'render' => self::Rendering,
24+
'dehydrate' => self::Dehydrating,
25+
default => null,
26+
};
27+
}
28+
}

src/Enums/SpanType.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,12 @@ enum SpanType: string implements FlareSpanType
99
case Response = 'laravel_response';
1010
case Queueing = 'laravel_queueing';
1111
case Job = 'laravel_job';
12+
13+
case LivewireComponent = 'laravel_livewire_component';
14+
case LivewireComponentMounting = 'laravel_livewire_component_mounting';
15+
case LivewireComponentPreMounting = 'laravel_livewire_component_premounting';
16+
case LivewireComponentHydrating = 'laravel_livewire_component_hydrating';
17+
case LivewireComponentCall = 'laravel_livewire_component_call';
18+
case LivewireComponentRendering = 'laravel_livewire_component_rendering';
19+
case LivewireComponentDehydrating = 'laravel_livewire_component_dehydrating';
1220
}

0 commit comments

Comments
 (0)