|
6 | 6 |
|
7 | 7 | use GuzzleHttp\Exception\ConnectException; |
8 | 8 | use GuzzleHttp\Promise\RejectedPromise; |
| 9 | +use GuzzleHttp\Psr7\Request as Psr7Request; |
| 10 | +use GuzzleHttp\Psr7\Response as Psr7Response; |
| 11 | +use Illuminate\Http\Client\Events\ConnectionFailed; |
| 12 | +use Illuminate\Http\Client\Events\ResponseReceived; |
| 13 | +use Illuminate\Http\Client\Pool; |
9 | 14 | use Illuminate\Http\Client\Request; |
| 15 | +use Illuminate\Http\Client\Response; |
| 16 | +use Illuminate\Support\Facades\Event; |
10 | 17 | use Illuminate\Support\Facades\Http; |
11 | 18 | use OpenTelemetry\API\Trace\StatusCode; |
12 | 19 | use OpenTelemetry\SDK\Trace\StatusData; |
| 20 | +use OpenTelemetry\SemConv\Attributes\HttpAttributes; |
13 | 21 | use OpenTelemetry\SemConv\Attributes\UrlAttributes; |
14 | 22 | use OpenTelemetry\Tests\Contrib\Instrumentation\Laravel\Integration\TestCase; |
15 | 23 |
|
@@ -60,4 +68,51 @@ public function test_it_records_connection_failures(): void |
60 | 68 | self::assertEquals('http://fail', $span->getAttributes()->get(UrlAttributes::URL_FULL)); |
61 | 69 | self::assertEquals(StatusData::create(StatusCode::STATUS_ERROR, 'Connection failed'), $span->getStatus()); |
62 | 70 | } |
| 71 | + |
| 72 | + public function test_it_matches_spans_to_responses_for_concurrent_identical_requests(): void |
| 73 | + { |
| 74 | + Http::fake([ |
| 75 | + 'same.opentelemetry.io' => Http::sequence() |
| 76 | + ->push(status: 200) |
| 77 | + ->push(status: 500), |
| 78 | + ]); |
| 79 | + |
| 80 | + $responses = Http::pool(fn (Pool $pool) => [ |
| 81 | + $pool->get('same.opentelemetry.io'), |
| 82 | + $pool->get('same.opentelemetry.io'), |
| 83 | + ]); |
| 84 | + |
| 85 | + self::assertEquals(200, $responses[0]->status()); |
| 86 | + self::assertEquals(500, $responses[1]->status()); |
| 87 | + |
| 88 | + self::assertCount(2, $this->storage); |
| 89 | + |
| 90 | + $firstSpan = $this->storage[0]; |
| 91 | + $secondSpan = $this->storage[1]; |
| 92 | + |
| 93 | + self::assertEquals(200, $firstSpan->getAttributes()->get(HttpAttributes::HTTP_RESPONSE_STATUS_CODE)); |
| 94 | + self::assertEquals(StatusCode::STATUS_UNSET, $firstSpan->getStatus()->getCode()); |
| 95 | + |
| 96 | + self::assertEquals(500, $secondSpan->getAttributes()->get(HttpAttributes::HTTP_RESPONSE_STATUS_CODE)); |
| 97 | + self::assertEquals(StatusCode::STATUS_ERROR, $secondSpan->getStatus()->getCode()); |
| 98 | + } |
| 99 | + |
| 100 | + public function test_it_ignores_response_with_no_matching_request(): void |
| 101 | + { |
| 102 | + $request = new Request(new Psr7Request('GET', 'http://untracked.opentelemetry.io')); |
| 103 | + $response = new Response(new Psr7Response(200)); |
| 104 | + |
| 105 | + Event::dispatch(new ResponseReceived($request, $response)); |
| 106 | + |
| 107 | + self::assertCount(0, $this->storage); |
| 108 | + } |
| 109 | + |
| 110 | + public function test_it_ignores_connection_failure_with_no_matching_request(): void |
| 111 | + { |
| 112 | + $request = new Request(new Psr7Request('GET', 'http://untracked.opentelemetry.io')); |
| 113 | + |
| 114 | + Event::dispatch(new ConnectionFailed($request)); |
| 115 | + |
| 116 | + self::assertCount(0, $this->storage); |
| 117 | + } |
63 | 118 | } |
0 commit comments