Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 1c2f43f

Browse files
committed
[Messenger][Profiler] Show dispatch caller
1 parent 7fb7cf2 commit 1c2f43f

File tree

6 files changed

+125
-8
lines changed

6 files changed

+125
-8
lines changed

src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/messenger.html.twig

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@
5555
5656
.message-bus .badge.status-some-errors { line-height: 16px; border-bottom: 2px solid #B0413E; }
5757
58-
.message-item .sf-toggle-content.sf-toggle-visible { display: table-row-group; }
58+
.message-item tbody.sf-toggle-content.sf-toggle-visible { display: table-row-group; }
59+
td.message-bus-dispatch-caller { background: #f1f2f3; }
5960
</style>
6061
{% endblock %}
6162

@@ -100,12 +101,12 @@
100101

101102
{% macro render_bus_messages(messages, showBus = false) %}
102103
{% set discr = random() %}
103-
{% for i, dispatchCall in messages %}
104+
{% for dispatchCall in messages %}
104105
<table class="message-item">
105106
<thead>
106107
<tr>
107108
<th colspan="2" class="sf-toggle"
108-
data-toggle-selector="#message-item-{{ discr }}-{{ i }}-details"
109+
data-toggle-selector="#message-item-{{ discr }}-{{ loop.index0 }}-details"
109110
data-toggle-initial="{{ loop.first ? 'display' }}"
110111
>
111112
<span class="dump-inline">{{ profiler_dump(dispatchCall.message.type) }}</span>
@@ -122,7 +123,31 @@
122123
</th>
123124
</tr>
124125
</thead>
125-
<tbody id="message-item-{{ discr }}-{{ i }}-details" class="sf-toggle-content">
126+
<tbody id="message-item-{{ discr }}-{{ loop.index0 }}-details" class="sf-toggle-content">
127+
<tr>
128+
<td colspan="2" class="message-bus-dispatch-caller">
129+
<span class="metadata">In
130+
{% set caller = dispatchCall.caller %}
131+
{% if caller.line %}
132+
{% set link = caller.file|file_link(caller.line) %}
133+
{% if link %}
134+
<a href="{{ link }}" title="{{ caller.file }}">{{ caller.name }}</a>
135+
{% else %}
136+
<abbr title="{{ caller.file }}">{{ caller.name }}</abbr>
137+
{% endif %}
138+
{% else %}
139+
{{ caller.name }}
140+
{% endif %}
141+
line <a class="text-small sf-toggle" data-toggle-selector="#sf-trace-{{ discr }}-{{ loop.index0 }}">{{ caller.line }}</a>
142+
</span>
143+
144+
<div class="hidden" id="sf-trace-{{ discr }}-{{ loop.index0 }}">
145+
<div class="trace">
146+
{{ caller.file|file_excerpt(caller.line) }}
147+
</div>
148+
</div>
149+
</td>
150+
</tr>
126151
{% if showBus %}
127152
<tr>
128153
<td class="text-bold">Bus</td>

src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/profiler.css.twig

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -913,6 +913,27 @@ table.logs .metadata {
913913
background: rgba(255, 255, 153, 0.5);
914914
}
915915

916+
{# Messenger panel
917+
========================================================================= #}
918+
919+
#collector-content .message-bus .trace {
920+
border: 1px solid #DDD;
921+
background: #FFF;
922+
padding: 10px;
923+
margin: 0.5em 0;
924+
overflow: auto;
925+
}
926+
#collector-content .message-bus .trace {
927+
font-size: 12px;
928+
}
929+
#collector-content .message-bus .trace li {
930+
margin-bottom: 0;
931+
padding: 0;
932+
}
933+
#collector-content .message-bus .trace li.selected {
934+
background: rgba(255, 255, 153, 0.5);
935+
}
936+
916937
{# Dump panel
917938
========================================================================= #}
918939
#collector-content .sf-dump {

src/Symfony/Component/Messenger/DataCollector/MessengerDataCollector.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ private function collectMessage(string $busName, array $tracedMessage)
9797
'type' => new ClassStub(\get_class($message)),
9898
'value' => $message,
9999
),
100+
'caller' => $tracedMessage['caller'],
100101
);
101102

102103
if (array_key_exists('result', $tracedMessage)) {

src/Symfony/Component/Messenger/Tests/DataCollector/MessengerDataCollectorTest.php

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ public function testHandle($returnedValue, $expected)
5959

6060
public function getHandleTestData()
6161
{
62+
$file = __FILE__;
6263
$messageDump = <<<DUMP
6364
"bus" => "default"
6465
"envelopeItems" => null
@@ -68,12 +69,17 @@ public function getHandleTestData()
6869
-message: "dummy message"
6970
}
7071
]
72+
"caller" => array:3 [
73+
"name" => "MessengerDataCollectorTest.php"
74+
"file" => "$file"
75+
"line" => %d
76+
]
7177
DUMP;
7278

7379
yield 'no returned value' => array(
7480
null,
7581
<<<DUMP
76-
array:4 [
82+
array:5 [
7783
$messageDump
7884
"result" => array:2 [
7985
"type" => "NULL"
@@ -86,7 +92,7 @@ public function getHandleTestData()
8692
yield 'scalar returned value' => array(
8793
'returned value',
8894
<<<DUMP
89-
array:4 [
95+
array:5 [
9096
$messageDump
9197
"result" => array:2 [
9298
"type" => "string"
@@ -99,7 +105,7 @@ public function getHandleTestData()
99105
yield 'array returned value' => array(
100106
array('returned value'),
101107
<<<DUMP
102-
array:4 [
108+
array:5 [
103109
$messageDump
104110
"result" => array:2 [
105111
"type" => "array"
@@ -124,6 +130,7 @@ public function testHandleWithException()
124130
$collector->registerBus('default', $bus);
125131

126132
try {
133+
$line = __LINE__ + 1;
127134
$bus->dispatch($message);
128135
} catch (\Throwable $e) {
129136
// Ignore.
@@ -134,8 +141,9 @@ public function testHandleWithException()
134141
$messages = $collector->getMessages();
135142
$this->assertCount(1, $messages);
136143

144+
$file = __FILE__;
137145
$this->assertStringMatchesFormat(<<<DUMP
138-
array:4 [
146+
array:5 [
139147
"bus" => "default"
140148
"envelopeItems" => null
141149
"message" => array:2 [
@@ -144,6 +152,11 @@ public function testHandleWithException()
144152
-message: "dummy message"
145153
}
146154
]
155+
"caller" => array:3 [
156+
"name" => "MessengerDataCollectorTest.php"
157+
"file" => "$file"
158+
"line" => $line
159+
]
147160
"exception" => array:2 [
148161
"type" => "RuntimeException"
149162
"value" => RuntimeException %A

src/Symfony/Component/Messenger/Tests/TraceableMessageBusTest.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,18 @@ public function testItTracesResult()
2828
$bus->expects($this->once())->method('dispatch')->with($message)->willReturn($result = array('foo' => 'bar'));
2929

3030
$traceableBus = new TraceableMessageBus($bus);
31+
$line = __LINE__ + 1;
3132
$this->assertSame($result, $traceableBus->dispatch($message));
3233
$this->assertCount(1, $tracedMessages = $traceableBus->getDispatchedMessages());
3334
$this->assertArraySubset(array(
3435
'message' => $message,
3536
'result' => $result,
3637
'envelopeItems' => null,
38+
'caller' => array(
39+
'name' => 'TraceableMessageBusTest.php',
40+
'file' => __FILE__,
41+
'line' => $line,
42+
),
3743
), $tracedMessages[0], true);
3844
}
3945

@@ -45,12 +51,18 @@ public function testItTracesResultWithEnvelope()
4551
$bus->expects($this->once())->method('dispatch')->with($envelope)->willReturn($result = array('foo' => 'bar'));
4652

4753
$traceableBus = new TraceableMessageBus($bus);
54+
$line = __LINE__ + 1;
4855
$this->assertSame($result, $traceableBus->dispatch($envelope));
4956
$this->assertCount(1, $tracedMessages = $traceableBus->getDispatchedMessages());
5057
$this->assertArraySubset(array(
5158
'message' => $message,
5259
'result' => $result,
5360
'envelopeItems' => array($envelopeItem),
61+
'caller' => array(
62+
'name' => 'TraceableMessageBusTest.php',
63+
'file' => __FILE__,
64+
'line' => $line,
65+
),
5466
), $tracedMessages[0], true);
5567
}
5668

@@ -64,6 +76,7 @@ public function testItTracesExceptions()
6476
$traceableBus = new TraceableMessageBus($bus);
6577

6678
try {
79+
$line = __LINE__ + 1;
6780
$traceableBus->dispatch($message);
6881
} catch (\RuntimeException $e) {
6982
$this->assertSame($exception, $e);
@@ -74,6 +87,11 @@ public function testItTracesExceptions()
7487
'message' => $message,
7588
'exception' => $exception,
7689
'envelopeItems' => null,
90+
'caller' => array(
91+
'name' => 'TraceableMessageBusTest.php',
92+
'file' => __FILE__,
93+
'line' => $line,
94+
),
7795
), $tracedMessages[0], true);
7896
}
7997
}

src/Symfony/Component/Messenger/TraceableMessageBus.php

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ public function __construct(MessageBusInterface $decoratedBus)
2929
*/
3030
public function dispatch($message)
3131
{
32+
$caller = $this->getCaller();
3233
$callTime = microtime(true);
3334
$messageToTrace = $message instanceof Envelope ? $message->getMessage() : $message;
3435
$envelopeItems = $message instanceof Envelope ? array_values($message->all()) : null;
@@ -41,6 +42,7 @@ public function dispatch($message)
4142
'message' => $messageToTrace,
4243
'result' => $result,
4344
'callTime' => $callTime,
45+
'caller' => $caller,
4446
);
4547

4648
return $result;
@@ -50,6 +52,7 @@ public function dispatch($message)
5052
'message' => $messageToTrace,
5153
'exception' => $e,
5254
'callTime' => $callTime,
55+
'caller' => $caller,
5356
);
5457

5558
throw $e;
@@ -65,4 +68,40 @@ public function reset()
6568
{
6669
$this->dispatchedMessages = array();
6770
}
71+
72+
private function getCaller(): array
73+
{
74+
$trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 8);
75+
76+
$file = $trace[1]['file'];
77+
$line = $trace[1]['line'];
78+
79+
for ($i = 2; $i < 8; ++$i) {
80+
if (isset($trace[$i]['class'], $trace[$i]['function'])
81+
&& 'dispatch' === $trace[$i]['function']
82+
&& is_a($trace[$i]['class'], MessageBusInterface::class, true)
83+
) {
84+
$file = $trace[$i]['file'];
85+
$line = $trace[$i]['line'];
86+
87+
while (++$i < 8) {
88+
if (isset($trace[$i]['function'], $trace[$i]['file']) && empty($trace[$i]['class']) && 0 !== strpos(
89+
$trace[$i]['function'],
90+
'call_user_func'
91+
)) {
92+
$file = $trace[$i]['file'];
93+
$line = $trace[$i]['line'];
94+
95+
break;
96+
}
97+
}
98+
break;
99+
}
100+
}
101+
102+
$name = str_replace('\\', '/', $file);
103+
$name = substr($name, strrpos($name, '/') + 1);
104+
105+
return compact('name', 'file', 'line');
106+
}
68107
}

0 commit comments

Comments
 (0)