Skip to content

Commit 8be0cdf

Browse files
authored
feature: psr7 and symfony http foundation telemetry bridges (#2167)
* feature: psr7 and symfony http foundation telemetry bridges - added: New flow-php/symfony-http-foundation-telemetry-bridge package for Symfony HttpFoundation telemetry context propagation - added: PHPStan generics support to Carrier interface - added: Unified unwrap() method to all Carrier implementations - added: Fluent chaining support for Carrier::set() - changed: [BC] Carrier::set() return type changed from void to static - changed: [BC] ArrayCarrier::toArray() replaced by unwrap() - changed: [BC] ResponseCarrier::getResponse() replaced by unwrap() * fix: regenerated dsl definitions * fix: added missing psr7 bridge repo elements
1 parent 1b19bc8 commit 8be0cdf

53 files changed

Lines changed: 1693 additions & 63 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/monorepo-split.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,12 @@ jobs:
8888
split_repository: 'monolog-telemetry-bridge'
8989
- local_path: 'src/bridge/openapi/specification'
9090
split_repository: 'openapi-specification-bridge'
91+
- local_path: 'src/bridge/psr7/telemetry'
92+
split_repository: 'psr7-telemetry-bridge'
9193
- local_path: 'src/bridge/symfony/http-foundation'
9294
split_repository: 'symfony-http-foundation-bridge'
95+
- local_path: 'src/bridge/symfony/http-foundation-telemetry'
96+
split_repository: 'symfony-http-foundation-telemetry-bridge'
9397
- local_path: 'src/bridge/telemetry/otlp'
9498
split_repository: 'telemetry-otlp-bridge'
9599

bin/docs.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ public function execute(InputInterface $input, OutputInterface $output) : int
6767
__DIR__ . '/../src/bridge/filesystem/azure/src/Flow/Filesystem/Bridge/Azure/DSL/functions.php',
6868
__DIR__ . '/../src/bridge/filesystem/async-aws/src/Flow/Filesystem/Bridge/AsyncAWS/DSL/functions.php',
6969
__DIR__ . '/../src/bridge/monolog/telemetry/src/Flow/Bridge/Monolog/Telemetry/DSL/functions.php',
70+
__DIR__ . '/../src/bridge/symfony/http-foundation-telemetry/src/Flow/Bridge/Symfony/HttpFoundationTelemetry/DSL/functions.php',
71+
__DIR__ . '/../src/bridge/psr7/telemetry/src/Flow/Bridge/Psr7/Telemetry/DSL/functions.php',
7072
__DIR__ . '/../src/bridge/telemetry/otlp/src/Flow/Bridge/Telemetry/OTLP/DSL/functions.php',
7173
];
7274

composer.json

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@
9999
"flow-php/postgresql": "self.version",
100100
"flow-php/snappy": "self.version",
101101
"flow-php/symfony-http-foundation-bridge": "self.version",
102+
"flow-php/symfony-http-foundation-telemetry-bridge": "self.version",
103+
"flow-php/psr7-telemetry-bridge": "self.version",
102104
"flow-php/telemetry": "self.version",
103105
"flow-php/telemetry-otlp-bridge": "self.version",
104106
"flow-php/types": "self.version"
@@ -128,7 +130,9 @@
128130
"src/bridge/monolog/http/src/Flow",
129131
"src/bridge/monolog/telemetry/src/Flow",
130132
"src/bridge/openapi/specification/src/Flow",
133+
"src/bridge/psr7/telemetry/src/Flow",
131134
"src/bridge/symfony/http-foundation/src/Flow",
135+
"src/bridge/symfony/http-foundation-telemetry/src/Flow",
132136
"src/bridge/telemetry/otlp/src/Flow",
133137
"src/cli/src/Flow",
134138
"src/core/etl/src/Flow",
@@ -172,7 +176,9 @@
172176
"src/bridge/monolog/http/src/Flow/Bridge/Monolog/Http/DSL/functions.php",
173177
"src/bridge/monolog/telemetry/src/Flow/Bridge/Monolog/Telemetry/DSL/functions.php",
174178
"src/bridge/openapi/specification/src/Flow/Bridge/OpenAPI/Specification/DSL/functions.php",
179+
"src/bridge/psr7/telemetry/src/Flow/Bridge/Psr7/Telemetry/DSL/functions.php",
175180
"src/bridge/symfony/http-foundation/src/Flow/Bridge/Symfony/HttpFoundation/functions.php",
181+
"src/bridge/symfony/http-foundation-telemetry/src/Flow/Bridge/Symfony/HttpFoundationTelemetry/DSL/functions.php",
176182
"src/bridge/telemetry/otlp/src/Flow/Bridge/Telemetry/OTLP/DSL/functions.php",
177183
"src/cli/src/Flow/CLI/DSL/functions.php",
178184
"src/core/etl/src/Flow/ETL/DSL/functions.php",
@@ -212,7 +218,9 @@
212218
"src/bridge/monolog/http/tests/Flow",
213219
"src/bridge/monolog/telemetry/tests/Flow",
214220
"src/bridge/openapi/specification/tests/Flow",
221+
"src/bridge/psr7/telemetry/tests/Flow",
215222
"src/bridge/symfony/http-foundation/tests/Flow",
223+
"src/bridge/symfony/http-foundation-telemetry/tests/Flow",
216224
"src/bridge/telemetry/otlp/tests/Flow",
217225
"src/cli/tests/Flow",
218226
"src/core/etl/tests/Flow",
@@ -281,7 +289,9 @@
281289
"@test:bridge:monolog-http",
282290
"@test:bridge:monolog-telemetry",
283291
"@test:bridge:openapi-specification",
292+
"@test:bridge:psr7-telemetry",
284293
"@test:bridge:symfony-http-foundation",
294+
"@test:bridge:symfony-http-foundation-telemetry",
285295
"@test:bridge:telemetry-otlp"
286296
],
287297
"test:adapters": [
@@ -359,10 +369,18 @@
359369
"test:bridge:openapi-specification": [
360370
"tools/phpunit/vendor/bin/phpunit --testsuite=bridge-openapi-specification-unit --log-junit ./var/phpunit/logs/bridge-openapi-specification-unit.junit.xml --coverage-clover=./var/phpunit/coverage/clover/bridge-openapi-specification-unit.coverage.xml --coverage-html=./var/phpunit/coverage/html/bridge-openapi-specification-unit"
361371
],
372+
"test:bridge:psr7-telemetry": [
373+
"tools/phpunit/vendor/bin/phpunit --testsuite=bridge-psr7-telemetry-unit --log-junit ./var/phpunit/logs/bridge-psr7-telemetry-unit.junit.xml --coverage-clover=./var/phpunit/coverage/clover/bridge-psr7-telemetry-unit.coverage.xml --coverage-html=./var/phpunit/coverage/html/bridge-psr7-telemetry-unit",
374+
"tools/phpunit/vendor/bin/phpunit --testsuite=bridge-psr7-telemetry-integration --log-junit ./var/phpunit/logs/bridge-psr7-telemetry-integration.junit.xml --coverage-clover=./var/phpunit/coverage/clover/bridge-psr7-telemetry-integration.coverage.xml --coverage-html=./var/phpunit/coverage/html/bridge-psr7-telemetry-integration"
375+
],
362376
"test:bridge:symfony-http-foundation": [
363377
"tools/phpunit/vendor/bin/phpunit --testsuite=bridge-symfony-http-foundation-unit --log-junit ./var/phpunit/logs/bridge-symfony-http-foundation-unit.junit.xml --coverage-clover=./var/phpunit/coverage/clover/bridge-symfony-http-foundation-unit.coverage.xml --coverage-html=./var/phpunit/coverage/html/bridge-symfony-http-foundation-unit",
364378
"tools/phpunit/vendor/bin/phpunit --testsuite=bridge-symfony-http-foundation-integration --log-junit ./var/phpunit/logs/bridge-symfony-http-foundation-integration.junit.xml --coverage-clover=./var/phpunit/coverage/clover/bridge-symfony-http-foundation-integration.coverage.xml --coverage-html=./var/phpunit/coverage/html/bridge-symfony-http-foundation-integration"
365379
],
380+
"test:bridge:symfony-http-foundation-telemetry": [
381+
"tools/phpunit/vendor/bin/phpunit --testsuite=bridge-symfony-http-foundation-telemetry-unit --log-junit ./var/phpunit/logs/bridge-symfony-http-foundation-telemetry-unit.junit.xml --coverage-clover=./var/phpunit/coverage/clover/bridge-symfony-http-foundation-telemetry-unit.coverage.xml --coverage-html=./var/phpunit/coverage/html/bridge-symfony-http-foundation-telemetry-unit",
382+
"tools/phpunit/vendor/bin/phpunit --testsuite=bridge-symfony-http-foundation-telemetry-integration --log-junit ./var/phpunit/logs/bridge-symfony-http-foundation-telemetry-integration.junit.xml --coverage-clover=./var/phpunit/coverage/clover/bridge-symfony-http-foundation-telemetry-integration.coverage.xml --coverage-html=./var/phpunit/coverage/html/bridge-symfony-http-foundation-telemetry-integration"
383+
],
366384
"test:bridge:telemetry-otlp": [
367385
"tools/phpunit/vendor/bin/phpunit --testsuite=bridge-telemetry-otlp-unit --log-junit ./var/phpunit/logs/bridge-telemetry-otlp-unit.junit.xml --coverage-clover=./var/phpunit/coverage/clover/bridge-telemetry-otlp-unit.coverage.xml --coverage-html=./var/phpunit/coverage/html/bridge-telemetry-otlp-unit",
368386
"tools/phpunit/vendor/bin/phpunit --testsuite=bridge-telemetry-otlp-integration --log-junit ./var/phpunit/logs/bridge-telemetry-otlp-integration.junit.xml --coverage-clover=./var/phpunit/coverage/clover/bridge-telemetry-otlp-integration.coverage.xml --coverage-html=./var/phpunit/coverage/html/bridge-telemetry-otlp-integration"
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
# PSR-7 Telemetry Bridge
2+
3+
Flow PSR-7 Telemetry Bridge provides carriers for propagators that can pass and read telemetry context
4+
and baggage via PSR-7 request and response objects.
5+
6+
- [Back](/documentation/introduction.md)
7+
- [Packagist](https://packagist.org/packages/flow-php/psr7-telemetry-bridge)
8+
- [GitHub](https://github.com/flow-php/psr7-telemetry-bridge)
9+
10+
[TOC]
11+
12+
## Installation
13+
14+
```
15+
composer require flow-php/psr7-telemetry-bridge:~--FLOW_PHP_VERSION--
16+
```
17+
18+
## Overview
19+
20+
This bridge connects Flow PHP's Telemetry library with PSR-7 compliant HTTP message implementations, enabling telemetry
21+
context propagation in HTTP-based applications. It provides carriers that allow propagators to inject and extract
22+
telemetry context (trace context, baggage) through HTTP headers in PSR-7 Request and Response objects.
23+
24+
This is particularly useful for:
25+
26+
- Distributed tracing across microservices
27+
- Propagating correlation IDs through HTTP calls
28+
- Passing baggage data (key-value pairs) across service boundaries
29+
- Integration with OpenTelemetry-based observability stacks
30+
- Framework-agnostic telemetry integration
31+
32+
> **Note:** This bridge works with any PSR-7 compliant HTTP message implementation (Nyholm/PSR-7, Guzzle, Laminas, etc.).
33+
> Due to PSR-7's immutable nature, use `unwrap()` on the `ResponseCarrier` to retrieve the modified response after
34+
> injecting headers.
35+
36+
## Requirements
37+
38+
- PHP 8.3+
39+
- flow-php/telemetry
40+
- psr/http-message ^1.1 || ^2.0
41+
42+
## Usage
43+
44+
### Extracting context from incoming requests
45+
46+
```php
47+
use Flow\Bridge\Psr7\Telemetry\RequestCarrier;
48+
use Flow\Telemetry\Propagation\CompositePropagator;
49+
use Flow\Telemetry\Propagation\W3CTraceContext;
50+
use Flow\Telemetry\Propagation\W3CBaggage;
51+
52+
// Create propagator
53+
$propagator = new CompositePropagator([
54+
new W3CTraceContext(),
55+
new W3CBaggage(),
56+
]);
57+
58+
// $request is a PSR-7 ServerRequestInterface
59+
$carrier = new RequestCarrier($request);
60+
$ctx = $propagator->extract($carrier);
61+
62+
// Use extracted context
63+
if ($ctx->spanContext !== null) {
64+
$traceId = $ctx->spanContext->traceId->toHex();
65+
// ...
66+
}
67+
```
68+
69+
### Injecting context into outgoing responses
70+
71+
```php
72+
use Flow\Bridge\Psr7\Telemetry\ResponseCarrier;
73+
use Flow\Telemetry\Propagation\CompositePropagator;
74+
use Flow\Telemetry\Propagation\W3CTraceContext;
75+
use Flow\Telemetry\Propagation\W3CBaggage;
76+
use Flow\Telemetry\Propagation\PropagationContext;
77+
78+
// Create propagator
79+
$propagator = new CompositePropagator([
80+
new W3CTraceContext(),
81+
new W3CBaggage(),
82+
]);
83+
84+
// $response is a PSR-7 ResponseInterface
85+
$carrier = new ResponseCarrier($response);
86+
$propagator->inject($ctx, $carrier);
87+
88+
// Get the modified response (PSR-7 responses are immutable)
89+
$response = $carrier->unwrap();
90+
```
91+
92+
### DSL Functions
93+
94+
The bridge provides convenient DSL functions:
95+
96+
```php
97+
use function Flow\Bridge\Psr7\Telemetry\DSL\psr7_request_carrier;
98+
use function Flow\Bridge\Psr7\Telemetry\DSL\psr7_response_carrier;
99+
100+
$requestCarrier = psr7_request_carrier($request);
101+
$responseCarrier = psr7_response_carrier($response);
102+
```
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# Symfony HttpFoundation Telemetry Bridge
2+
3+
Flow Symfony HttpFoundation Telemetry Bridge provides carriers for propagators that can pass and read telemetry context
4+
and baggage via Symfony HttpFoundation request and response objects.
5+
6+
- [⬅️️ Back](/documentation/introduction.md)
7+
- [📦Packagist](https://packagist.org/packages/flow-php/symfony-http-foundation-telemetry-bridge)
8+
- [🐙GitHub](https://github.com/flow-php/symfony-http-foundation-telemetry-bridge)
9+
10+
[TOC]
11+
12+
## Installation
13+
14+
```
15+
composer require flow-php/symfony-http-foundation-telemetry-bridge:~--FLOW_PHP_VERSION--
16+
```
17+
18+
## Overview
19+
20+
This bridge connects Flow PHP's Telemetry library with Symfony's HttpFoundation component, enabling telemetry context
21+
propagation in HTTP-based applications. It provides carriers that allow propagators to inject and extract telemetry
22+
context (trace context, baggage) through HTTP headers in Symfony Request and Response objects.
23+
24+
This is particularly useful for:
25+
26+
- Distributed tracing across microservices
27+
- Propagating correlation IDs through HTTP calls
28+
- Passing baggage data (key-value pairs) across service boundaries
29+
- Integration with OpenTelemetry-based observability stacks
30+
31+
> **Note:** This bridge is separate from the `flow-php/symfony-http-foundation-bridge` which is designed for ETL
32+
> operations. This bridge focuses specifically on telemetry integration, allowing users who only need telemetry
33+
> support to avoid bringing in the entire ETL framework as a dependency.
34+
35+
## Requirements
36+
37+
- PHP 8.3+
38+
- flow-php/telemetry
39+
- symfony/http-foundation ^6.4 || ^7.3 || ^8.0

infection.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
"src/lib/parquet/src",
99
"src/lib/telemetry/src",
1010
"src/bridge/monolog/telemetry/src",
11+
"src/bridge/psr7/telemetry/src",
12+
"src/bridge/symfony/http-foundation-telemetry/src",
1113
"src/bridge/telemetry/otlp/src"
1214
],
1315
"excludes": [
@@ -26,7 +28,9 @@
2628
"Flow/Telemetry/Provider/Void",
2729
"Flow/Telemetry/Provider/Console",
2830
"Flow/Bridge/Telemetry/OTLP/Exception",
29-
"Flow/Bridge/Monolog/Telemetry/Exception"
31+
"Flow/Bridge/Monolog/Telemetry/Exception",
32+
"Flow/Bridge/Psr7/Telemetry/Exception",
33+
"Flow/Bridge/Symfony/HttpFoundationTelemetry/Exception"
3034
]
3135
},
3236
"logs": {

phpstan.neon

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@ parameters:
2828
- src/bridge/monolog/http/src
2929
- src/bridge/monolog/telemetry/src
3030
- src/bridge/openapi/specification/src
31+
- src/bridge/psr7/telemetry/src
3132
- src/bridge/symfony/http-foundation/src
33+
- src/bridge/symfony/http-foundation-telemetry/src
3234
- src/bridge/telemetry/otlp/src
3335
- src/lib/array-dot/src
3436
- src/lib/azure-sdk/src
@@ -63,7 +65,9 @@ parameters:
6365
- src/bridge/monolog/http/tests
6466
- src/bridge/monolog/telemetry/tests
6567
- src/bridge/openapi/specification/tests
68+
- src/bridge/psr7/telemetry/tests
6669
- src/bridge/symfony/http-foundation/tests
70+
- src/bridge/symfony/http-foundation-telemetry/tests
6771
- src/bridge/telemetry/otlp/tests
6872
- src/lib/telemetry/tests
6973

phpunit.xml.dist

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,12 @@
116116
<testsuite name="bridge-openapi-specification-unit">
117117
<directory>src/bridge/openapi/specification/tests/Flow/Bridge/OpenAPI/Specification/Tests/Unit</directory>
118118
</testsuite>
119+
<testsuite name="bridge-psr7-telemetry-unit">
120+
<directory>src/bridge/psr7/telemetry/tests/Flow/Bridge/Psr7/Telemetry/Tests/Unit</directory>
121+
</testsuite>
122+
<testsuite name="bridge-psr7-telemetry-integration">
123+
<directory>src/bridge/psr7/telemetry/tests/Flow/Bridge/Psr7/Telemetry/Tests/Integration</directory>
124+
</testsuite>
119125
<testsuite name="bridge-symfony-http-foundation-unit">
120126
<directory>src/bridge/symfony/http-foundation/tests/Flow/Bridge/Symfony/HttpFoundation/Tests/Unit
121127
</directory>
@@ -124,6 +130,12 @@
124130
<directory>src/bridge/symfony/http-foundation/tests/Flow/Bridge/Symfony/HttpFoundation/Tests/Integration
125131
</directory>
126132
</testsuite>
133+
<testsuite name="bridge-symfony-http-foundation-telemetry-unit">
134+
<directory>src/bridge/symfony/http-foundation-telemetry/tests/Flow/Bridge/Symfony/HttpFoundationTelemetry/Tests/Unit</directory>
135+
</testsuite>
136+
<testsuite name="bridge-symfony-http-foundation-telemetry-integration">
137+
<directory>src/bridge/symfony/http-foundation-telemetry/tests/Flow/Bridge/Symfony/HttpFoundationTelemetry/Tests/Integration</directory>
138+
</testsuite>
127139
<testsuite name="bridge-telemetry-otlp-unit">
128140
<directory>src/bridge/telemetry/otlp/tests/Flow/Bridge/Telemetry/OTLP/Tests/Unit</directory>
129141
</testsuite>
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
*.php text eol=lf
2+
3+
/.github export-ignore
4+
/tests export-ignore
5+
6+
/README.md export-ignore
7+
8+
/.gitattributes export-ignore
9+
/.gitignore export-ignore
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
name: Readonly
2+
3+
on:
4+
pull_request_target:
5+
types: [opened]
6+
7+
jobs:
8+
run:
9+
runs-on: ubuntu-latest
10+
steps:
11+
- uses: superbrothers/close-pull-request@v3
12+
with:
13+
comment: |
14+
Hi, thank you for your contribution.
15+
Unfortunately, this repository is read-only. It's a split from our main monorepo repository.
16+
In order to proceed with this PR please open it against https://github.com/flow-php/flow repository.
17+
Thank you.

0 commit comments

Comments
 (0)