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

openzipkin / zipkin-php / #597

pending completion
#597

push

php-coveralls

web-flow
Convert carrier key to string. (#226)

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

811 of 997 relevant lines covered (81.34%)

10.91 hits per line

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

77.78
/src/Zipkin/Instrumentation/Http/Client/Psr18/Client.php
1
<?php
2

3
declare(strict_types=1);
4

5
namespace Zipkin\Instrumentation\Http\Client\Psr18;
6

7
use Zipkin\Tracer;
8
use Zipkin\SpanCustomizerShield;
9
use Zipkin\Propagation\TraceContext;
10
use Zipkin\Kind;
11
use Zipkin\Instrumentation\Http\Client\Psr18\Propagation\RequestHeaders;
12
use Zipkin\Instrumentation\Http\Client\HttpClientTracing;
13
use Zipkin\Instrumentation\Http\Client\HttpClientParser;
14
use Throwable;
15
use Psr\Http\Message\ResponseInterface;
16
use Psr\Http\Message\RequestInterface;
17
use Psr\Http\Client\ClientInterface;
18

19
final class Client implements ClientInterface
20
{
21
    private ClientInterface $delegate;
22

23
    /**
24
     * @var callable(TraceContext,mixed):void
25
     */
26
    private $injector;
27

28
    private Tracer $tracer;
29

30
    private HttpClientParser $parser;
31

32
    /**
33
     * @var (callable(Request):?bool)|null
34
     */
35
    private $requestSampler;
36

37
    public function __construct(ClientInterface $client, HttpClientTracing $tracing)
38
    {
39
        $this->delegate = $client;
3✔
40
        $this->injector = $tracing->getTracing()->getPropagation()->getInjector(new RequestHeaders());
3✔
41
        $this->tracer = $tracing->getTracing()->getTracer();
3✔
42
        $this->parser = $tracing->getParser();
3✔
43
        $this->requestSampler = $tracing->getRequestSampler();
3✔
44
    }
45

46
    public function sendRequest(RequestInterface $request): ResponseInterface
47
    {
48
        $parsedRequest = new Request($request);
3✔
49
        if ($this->requestSampler === null) {
3✔
50
            $span = $this->tracer->nextSpan();
3✔
51
        } else {
52
            $span = $this->tracer->nextSpanWithSampler(
×
53
                $this->requestSampler,
×
54
                [$parsedRequest]
×
55
            );
×
56
        }
57

58
        ($this->injector)($span->getContext(), $request);
3✔
59

60
        if ($span->isNoop()) {
3✔
61
            try {
62
                return $this->delegate->sendRequest($request);
×
63
            } finally {
64
                $span->finish();
×
65
            }
66
        }
67

68
        $span->setKind(Kind\CLIENT);
3✔
69
        // If span is NOOP it does not make sense to add customizations
70
        // to it like tags or annotations.
71
        $spanCustomizer = new SpanCustomizerShield($span);
3✔
72
        $this->parser->request($parsedRequest, $span->getContext(), $spanCustomizer);
3✔
73

74
        try {
75
            $span->start();
3✔
76
            $response = $this->delegate->sendRequest($request);
3✔
77
            $this->parser->response(new Response($response, $parsedRequest), $span->getContext(), $spanCustomizer);
2✔
78
            return $response;
2✔
79
        } catch (Throwable $e) {
1✔
80
            $span->setError($e);
1✔
81
            throw $e;
1✔
82
        } finally {
83
            $span->finish();
3✔
84
        }
85
    }
86
}
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

© 2026 Coveralls, Inc