adtechpotok/symfony-open-tracing
Symfony OpenTracing integration for Symfony apps. Adds tracing support with minimal setup, helping you instrument requests and services, propagate trace context, and export spans to compatible backends for distributed tracing and performance diagnostics.
Since this package is Symfony-focused but can be adapted for Laravel (via Symfony components or bridges like symfony/http-foundation), start by:
Installation
composer require adtechpotok/symfony-open-tracing
Note: Laravel lacks native Symfony integration, so use a bridge like symfony/http-client or symfony/process for compatibility.
Basic Tracing Initialization
use Adtechpotok\OpenTracing\Tracer;
use OpenTracing\Tracer as OpenTracingTracer;
// Initialize a tracer (mock example; replace with Jaeger/Zipkin later)
$tracer = new Tracer();
OpenTracingTracer::setGlobalTracer($tracer);
First Use Case: HTTP Request Tracing
use OpenTracing\Span;
use OpenTracing\Scope;
$span = OpenTracingTracer::global()->buildSpan('http_request')->start();
$scope = $span->activate();
try {
$response = Http::get('https://api.example.com', [
'headers' => ['X-Trace-ID' => $span->context()->toTraceId()]
]);
} finally {
$span->finish();
$scope->close();
}
src/Tracer.php (Core tracer logic)src/Span.php (Span lifecycle)README.md (Symfony-specific examples; adapt for Laravel)Leverage Laravel middleware to inject spans into incoming/outgoing requests:
use OpenTracing\Tracer as OpenTracingTracer;
class TracingMiddleware
{
public function handle($request, Closure $next)
{
$span = OpenTracingTracer::global()->buildSpan('http_incoming')
->withTag('http.method', $request->method())
->withTag('http.path', $request->path())
->start();
try {
$response = $next($request);
$span->setTag('http.status_code', $response->status());
} finally {
$span->finish();
}
return $response;
}
}
Register in app/Http/Kernel.php:
protected $middleware = [
\App\Http\Middleware\TracingMiddleware::class,
];
Wrap business logic in spans:
use OpenTracing\Tracer as OpenTracingTracer;
class UserService
{
public function createUser(array $data)
{
$span = OpenTracingTracer::global()->buildSpan('user_service.create')
->withTag('user.data', json_encode($data))
->start();
try {
// Business logic here
return User::create($data);
} finally {
$span->finish();
}
}
}
Use Laravel’s query log to create spans:
use Illuminate\Support\Facades\DB;
use OpenTracing\Tracer as OpenTracingTracer;
DB::listen(function ($query) {
$span = OpenTracingTracer::global()->buildSpan('db_query')
->withTag('db.type', $query->bindings)
->withTag('db.sql', $query->sql)
->start();
try {
// Execute query (handled by DB listener)
} finally {
$span->finish();
}
});
Propagate trace context across services:
use OpenTracing\Propagation\TextMapAdapter;
use OpenTracing\Tracer as OpenTracingTracer;
$span = OpenTracingTracer::global()->buildSpan('external_api_call')->start();
$carrier = new TextMapCarrier();
OpenTracingTracer::global()->inject(
$span->context(),
\OpenTracing\FORMAT_HTTP_HEADERS,
$carrier
);
$response = Http::withHeaders($carrier->toArray())->get('https://external-api.com');
HttpFoundation or Process. For Laravel:
symfony/http-client for HTTP tracing.Request/Response objects if needed (e.g., via symfony/http-foundation).ContainerInterface. Bind the tracer manually:
$app->singleton(OpenTracingTracer::class, function () {
return new Tracer(); // Or your Jaeger/Zipkin tracer
});
OpenTracingTracer::setGlobalTracer() is called before any spans are created.uber-trace-id or x-b3-traceid are correctly injected/extracted.OpenTracingTracer::global()->setSpanReporter(new \OpenTracing\Reporter\LoggingReporter());
Span to add Laravel-specific tags:
$span->setTag('laravel.route', route()->currentRouteName());
use Jaeger\Reporter\RemoteReporter;
$reporter = new RemoteReporter('http://jaeger:14268/api/traces');
OpenTracingTracer::global()->registerSpanReporter($reporter);
SpanContext to filter sensitive data (e.g., passwords) from traces.OpenTracingTracer::setGlobalTracer(new \OpenTracing\NoopTracer());
$this->assertTrue($span->isFinished());
$this->assertEquals('http_request', $span->operationName());
config/tracing.php:
return [
'service_name' => env('APP_NAME'),
'sampler' => 'const', // 'const', 'probabilistic', or custom
'reporter' => [
'type' => 'jaeger', // or 'zipkin', 'logging'
'endpoint' => env('TRACING_ENDPOINT'),
],
];
How can I help you explore Laravel packages today?