• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

FriendsOfOpenTelemetry / opentelemetry-bundle / 13324971106

14 Feb 2025 08:01AM UTC coverage: 88.719% (+0.06%) from 88.655%
13324971106

push

github

gaelreyrol
test(OpenTelemetry): ensure produced logs have span/trace context

3 of 3 new or added lines in 1 file covered. (100.0%)

9 existing lines in 9 files now uncovered.

2084 of 2349 relevant lines covered (88.72%)

10.43 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

72.73
/src/Instrumentation/Symfony/HttpClient/TraceableHttpClient.php
1
<?php
2

3
namespace FriendsOfOpenTelemetry\OpenTelemetryBundle\Instrumentation\Symfony\HttpClient;
4

5
use GuzzleHttp\Psr7\Uri;
6
use OpenTelemetry\API\Trace\SpanKind;
7
use OpenTelemetry\API\Trace\TracerInterface;
8
use OpenTelemetry\Context\Context;
9
use OpenTelemetry\SemConv\TraceAttributes;
10
use Psr\Log\LoggerAwareInterface;
11
use Psr\Log\LoggerInterface;
12
use Symfony\Component\HttpClient\Response\ResponseStream;
13
use Symfony\Contracts\HttpClient\HttpClientInterface;
14
use Symfony\Contracts\HttpClient\ResponseInterface;
15
use Symfony\Contracts\HttpClient\ResponseStreamInterface;
16
use Symfony\Contracts\Service\ResetInterface;
17

18
final class TraceableHttpClient implements HttpClientInterface, LoggerAwareInterface, ResetInterface
19
{
20
    public function __construct(
21
        private HttpClientInterface $client,
22
        private readonly TracerInterface $tracer,
23
        private ?LoggerInterface $logger = null,
24
    ) {
25
    }
6✔
26

27
    /**
28
     * @param array<mixed> $options
29
     */
30
    public function request(string $method, string $url, array $options = []): ResponseInterface
31
    {
32
        $scope = Context::storage()->scope();
4✔
33
        if (null !== $scope) {
4✔
34
            $this->logger?->debug(sprintf('Using scope "%s"', spl_object_id($scope)));
4✔
35
        } else {
UNCOV
36
            $this->logger?->debug('No active scope');
×
37
        }
38

39
        $uri = new Uri($url);
4✔
40

41
        $spanBuilder = $this->tracer
4✔
42
            ->spanBuilder('http.client')
4✔
43
            ->setSpanKind(SpanKind::KIND_CLIENT)
4✔
44
            ->setParent($scope?->context())
4✔
45
            ->setAttribute(TraceAttributes::URL_FULL, $url)
4✔
46
            ->setAttribute(TraceAttributes::URL_SCHEME, $uri->getScheme())
4✔
47
            ->setAttribute(TraceAttributes::URL_PATH, $uri->getPath())
4✔
48
            ->setAttribute(TraceAttributes::URL_QUERY, $uri->getQuery())
4✔
49
            ->setAttribute(TraceAttributes::URL_FRAGMENT, $uri->getFragment())
4✔
50
            ->setAttribute(TraceAttributes::HTTP_REQUEST_METHOD, $method)
4✔
51
        ;
4✔
52

53
        $span = $spanBuilder->startSpan();
4✔
54

55
        $this->logger?->debug(sprintf('Starting span "%s"', $span->getContext()->getSpanId()));
4✔
56

57
        return new TraceableResponse($this->client, $this->client->request($method, $url, $options), $span);
4✔
58
    }
59

60
    public function stream(iterable|ResponseInterface $responses, ?float $timeout = null): ResponseStreamInterface
61
    {
62
        if ($responses instanceof TraceableResponse) {
1✔
63
            $responses = [$responses];
1✔
64
        } elseif (!is_iterable($responses)) {
×
65
            throw new \TypeError(sprintf('"%s()" expects parameter 1 to be an iterable of TraceableResponse objects, "%s" given.', __METHOD__, get_debug_type($responses)));
×
66
        }
67

68
        return new ResponseStream(TraceableResponse::stream($this->client, $responses, $timeout));
1✔
69
    }
70

71
    /**
72
     * @param array<mixed> $options
73
     */
74
    public function withOptions(array $options): static
75
    {
76
        $clone = clone $this;
×
77
        $clone->client = $this->client->withOptions($options);
×
78

79
        return $clone;
×
80
    }
81

82
    public function setLogger(LoggerInterface $logger): void
83
    {
84
        if ($this->client instanceof LoggerAwareInterface) {
×
85
            $this->client->setLogger($logger);
×
86
        }
87
        $this->logger = $logger;
×
88
    }
89

90
    public function reset(): void
91
    {
92
        if ($this->client instanceof ResetInterface) {
2✔
93
            $this->client->reset();
2✔
94
        }
95
    }
96
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc