Skip to content

Commit 61d17c0

Browse files
IonBazanjeremyFreeAgent
authored andcommitted
[HttpClient] track multiple clients
1 parent 324a011 commit 61d17c0

File tree

10 files changed

+259
-190
lines changed

10 files changed

+259
-190
lines changed

src/Symfony/Bundle/FrameworkBundle/DataCollector/HttpClientDataCollector.php

Lines changed: 0 additions & 101 deletions
This file was deleted.

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
use Symfony\Component\Form\FormTypeInterface;
6363
use Symfony\Component\HttpClient\Psr18Client;
6464
use Symfony\Component\HttpClient\ScopingHttpClient;
65+
use Symfony\Component\HttpClient\TraceableHttpClient;
6566
use Symfony\Component\HttpKernel\CacheClearer\CacheClearerInterface;
6667
use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerInterface;
6768
use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface;
@@ -1800,13 +1801,17 @@ private function registerHttpClientConfiguration(array $config, ContainerBuilder
18001801
{
18011802
$loader->load('http_client.xml');
18021803

1804+
$debug = $container->getParameter('kernel.debug');
1805+
18031806
$container->getDefinition('http_client')->setArguments([$config['default_options'] ?? [], $config['max_host_connections'] ?? 6]);
18041807

18051808
if (!$hasPsr18 = interface_exists(ClientInterface::class)) {
18061809
$container->removeDefinition('psr18.http_client');
18071810
$container->removeAlias(ClientInterface::class);
18081811
}
18091812

1813+
$collectorDefinition = $container->getDefinition('data_collector.http_client');
1814+
18101815
foreach ($config['scoped_clients'] as $name => $scopeConfig) {
18111816
if ('http_client' === $name) {
18121817
throw new InvalidArgumentException(sprintf('Invalid scope name: "%s" is reserved.', $name));
@@ -1818,6 +1823,19 @@ private function registerHttpClientConfiguration(array $config, ContainerBuilder
18181823
$container->register($name, ScopingHttpClient::class)
18191824
->setArguments([new Reference('http_client'), [$scope => $scopeConfig], $scope]);
18201825

1826+
if ($debug) {
1827+
$definition = $container->getDefinition($name);
1828+
$traceableDefinition = new Definition(TraceableHttpClient::class);
1829+
$traceableDefinition->setArguments([new Reference($innerId = $name.'.inner')]);
1830+
$traceableDefinition->setPublic($definition->isPublic());
1831+
$definition->setPublic(false);
1832+
$definition->replaceArgument(0, new Reference('debug.http_client.inner'));
1833+
$container->setDefinition($innerId, $definition);
1834+
$container->setDefinition($name, $traceableDefinition);
1835+
1836+
$collectorDefinition->addMethodCall('addClient', [$name, new Reference($name)]);
1837+
}
1838+
18211839
$container->registerAliasForArgument($name, HttpClientInterface::class);
18221840

18231841
if ($hasPsr18) {

src/Symfony/Bundle/FrameworkBundle/Resources/config/collectors.xml

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,12 @@
5454
<tag name="data_collector" template="@WebProfiler/Collector/router.html.twig" id="router" priority="285" />
5555
</service>
5656

57-
<service id="data_collector.http_client" class="Symfony\Bundle\FrameworkBundle\DataCollector\HttpClientDataCollector">
58-
<argument type="service" id="Symfony\Contracts\HttpClient\HttpClientInterface" on-invalid="ignore" />
59-
<tag name="data_collector" template="@Framework/Collector/http_client.html.twig" id="http_client" priority="240" />
57+
<service id="data_collector.http_client" class="Symfony\Component\HttpClient\DataCollector\HttpClientDataCollector">
58+
<call method="addClient">
59+
<argument>http_client</argument>
60+
<argument type="service" id="debug.http_client" />
61+
</call>
62+
<tag name="data_collector" template="@WebProfiler/Collector/http_client.html.twig" id="http_client" priority="240" />
6063
</service>
6164
</services>
6265
</container>

src/Symfony/Bundle/FrameworkBundle/Resources/config/debug.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,5 +29,9 @@
2929
<tag name="controller.argument_value_resolver" priority="-200" />
3030
<argument />
3131
</service>
32+
33+
<service id="debug.http_client" class="Symfony\Component\HttpClient\TraceableHttpClient" decorates="http_client">
34+
<argument type="service" id="debug.http_client.inner" />
35+
</service>
3236
</services>
3337
</container>

src/Symfony/Bundle/FrameworkBundle/Resources/config/http_client.xml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,5 @@
2020
<argument type="service" id="http_client" />
2121
</service>
2222
<service id="Psr\Http\Client\ClientInterface" alias="psr18.http_client" />
23-
24-
<service id="traceable_http_client" class="Symfony\Bundle\FrameworkBundle\HttpClient\TraceableHttpClient" decorates="Symfony\Contracts\HttpClient\HttpClientInterface">
25-
<argument type="service" id="traceable_http_client.inner" />
26-
</service>
2723
</services>
2824
</container>

src/Symfony/Bundle/FrameworkBundle/Resources/views/Collector/http_client.html.twig

Lines changed: 0 additions & 70 deletions
This file was deleted.

src/Symfony/Bundle/FrameworkBundle/Resources/views/Icon/http-client.svg

Lines changed: 0 additions & 10 deletions
This file was deleted.
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
{% extends '@WebProfiler/Profiler/layout.html.twig' %}
2+
3+
{% block toolbar %}
4+
{% if collector.requestCount %}
5+
{% set icon %}
6+
{{ include('@WebProfiler/Icon/http-client.svg') }}
7+
{% set status_color = '' %}
8+
<span class="sf-toolbar-value">{{ collector.requestCount }}</span>
9+
{% endset %}
10+
11+
{{ include('@WebProfiler/Profiler/toolbar_item.html.twig', { link: profiler_url, status: status_color }) }}
12+
{% endif %}
13+
{% endblock %}
14+
15+
{% block menu %}
16+
<span class="label {{ collector.requestCount == 0 ? 'disabled' }}">
17+
<span class="icon">{{ include('@WebProfiler/Icon/http-client.svg') }}</span>
18+
<strong>HTTP Client</strong>
19+
{% if collector.requestCount %}
20+
<span class="count">
21+
{{ collector.requestCount }}
22+
</span>
23+
{% endif %}
24+
</span>
25+
{% endblock %}
26+
27+
{% block panel %}
28+
<h2>HTTP Client</h2>
29+
{% if collector.requestCount == 0 %}
30+
<div class="empty">
31+
<p>No HTTP requests were made.</p>
32+
</div>
33+
{% else %}
34+
<div class="metrics">
35+
<div class="metric">
36+
<span class="value">{{ collector.requestCount }}</span>
37+
<span class="label">Total requests</span>
38+
</div>
39+
<div class="metric">
40+
<span class="value">{{ collector.errors }}</span>
41+
<span class="label">Total errors</span>
42+
</div>
43+
</div>
44+
<h2>Clients</h2>
45+
<div class="sf-tabs">
46+
{% for name, client in collector.clients %}
47+
<div class="tab {{ client.traces|length == 0 ? 'disabled' }}">
48+
<h3 class="tab-title">{{ name }} <span class="badge">{{ client.traces|length }}</span></h3>
49+
<div class="tab-content">
50+
{% if client.traces|length == 0 %}
51+
<div class="empty">
52+
<p>No requests were made for {{ name }} client.</p>
53+
</div>
54+
{% else %}
55+
<h4>Requests</h4>
56+
{% for trace in client.traces %}
57+
<table>
58+
<thead>
59+
<tr>
60+
<th colspan="2">
61+
<span class="label">{{ trace.request.method }}</span>&nbsp;{{ trace.request.url }}
62+
</th>
63+
</tr>
64+
</thead>
65+
<tbody>
66+
<tr>
67+
<th nowrap>Response Status Code</th>
68+
<td>
69+
{% if trace.response.statusCode >= 500 %}
70+
{% set responseStatus = 'error' %}
71+
{% elseif trace.response.statusCode >= 400 %}
72+
{% set responseStatus = 'warning' %}
73+
{% else %}
74+
{% set responseStatus = 'success' %}
75+
{% endif %}
76+
<span class="label status-{{ responseStatus }}">
77+
{{ trace.response.statusCode }}
78+
</span>
79+
</td>
80+
</tr>
81+
<tr>
82+
<th nowrap>Response Headers</th>
83+
<td>
84+
{% for header in trace.response.headers %}
85+
<div>{{ header }}</div>
86+
{% endfor %}
87+
</td>
88+
</tr>
89+
<tr>
90+
<th nowrap>Options</th>
91+
<td>
92+
{{ trace.request.options is empty ? 'none' : profiler_dump(trace.request.options, maxDepth=1) }}
93+
</td>
94+
</tr>
95+
</tbody>
96+
</table>
97+
{% endfor %}
98+
{% endif %}
99+
</div>
100+
</div>
101+
{% endfor %}
102+
{% endif %}
103+
</div>
104+
{% endblock %}

0 commit comments

Comments
 (0)