Introduction
PSR-18 Telemetry Bridge
Flow PSR-18 Telemetry Bridge provides a traceable HTTP client wrapper for PSR-18 compliant HTTP clients, enabling automatic span creation and telemetry context propagation for outgoing HTTP requests.
Installation
For detailed installation instructions, see the installation page.
Overview
This bridge connects Flow PHP's Telemetry library with PSR-18 compliant HTTP clients, providing automatic tracing for outgoing HTTP requests. It wraps any PSR-18 ClientInterface implementation to create spans with HTTP request/response metadata.
This is particularly useful for:
- Automatic tracing of outgoing HTTP requests
- Recording HTTP method, URL, status code, and other attributes
- Error tracking for failed requests (4xx/5xx responses)
- Exception recording when HTTP clients throw errors
- Integration with OpenTelemetry-based observability stacks
- Framework-agnostic HTTP client instrumentation
Note: This bridge works with any PSR-18 compliant HTTP client implementation (Guzzle, Symfony HttpClient with PSR-18 adapter, Buzz, etc.).
Requirements
- PHP 8.3+
- flow-php/telemetry
- psr/http-client ^1.0
- psr/http-message ^1.0 || ^2.0
Usage
Wrapping a PSR-18 HTTP Client
use Flow\Bridge\Psr18\Telemetry\PSR18TraceableClient;
use Flow\Telemetry\Telemetry;
use Symfony\Component\HttpClient\Psr18Client;
// Create your telemetry instance
$telemetry = /* ... your Telemetry setup ... */;
// Wrap any PSR-18 client
$httpClient = new Psr18Client();
$traceableClient = new PSR18TraceableClient($httpClient, $telemetry);
// Use it like any other PSR-18 client
$request = new Request('GET', 'https://api.example.com/users');
$response = $traceableClient->sendRequest($request);
// A span is automatically created with:
// - Name: "GET api.example.com"
// - Kind: CLIENT
// - Attributes: http.method, http.url, http.scheme, http.host, http.status_code
// - Status: OK for 2xx/3xx, ERROR for 4xx/5xx
Span Attributes
The traceable client automatically records the following span attributes:
| Attribute | Description | Example |
|---|---|---|
http.method |
HTTP method | GET, POST |
http.url |
Full request URL | https://api.example.com/users |
http.scheme |
URL scheme | https |
http.host |
Target host | api.example.com |
http.status_code |
Response status code | 200, 404, 500 |
Error Handling
The client handles errors in two ways:
- HTTP Error Responses (4xx/5xx): The span status is set to ERROR with the message "HTTP {status_code}"
- Exceptions: If the underlying client throws an exception, it is recorded on the span and re-thrown
try {
$response = $traceableClient->sendRequest($request);
} catch (\Throwable $e) {
// Exception is recorded on the span with:
// - exception.type
// - exception.message
// - exception.stacktrace
// The span status is set to ERROR
throw $e;
}
DSL Functions
The bridge provides a convenient DSL function:
use function Flow\Bridge\Psr18\Telemetry\DSL\psr18_traceable_client;
$traceableClient = psr18_traceable_client($httpClient, $telemetry);