open-telemetry/exporter-zipkin
OpenTelemetry Zipkin Exporter for PHP. Sends OpenTelemetry traces to a Zipkin collector for storage and visualization. Use with the OpenTelemetry PHP SDK to export spans over HTTP, enabling distributed tracing and diagnostics in your applications.
SpanProcessor interface, requiring minimal Laravel code changes.php-http/async-client-implementation), which aligns with Laravel’s non-blocking I/O patterns (e.g., queues, async jobs).X-B3-TraceId headers).| Risk | Mitigation |
|---|---|
| PHP Version Dependency (8.1+) | Laravel 9+ supports PHP 8.1+. If using older Laravel, require a PHP upgrade. |
| Zipkin Server Unavailability | Implement retry logic (e.g., exponential backoff) or fallback buffering (store traces locally if Zipkin is down). |
| Attribute Casting Issues | Validate custom attributes are strings (as per PR #1406). |
| Performance Overhead | Use sampling (e.g., 1–10% of traces) or batch exports to limit impact. |
| Lack of Laravel-Specific Instrumentation | Extend OpenTelemetry’s auto-instrumentation for Laravel components (e.g., queues, HTTP clients). |
telemetryphp/telemetry (auto-instrumentation).open-telemetry/sdk).X-B3-TraceId headers in HTTP requests.Monolog processors).Illuminate\Bus\Queueable.| Step | Action | Laravel Integration | Dependencies |
|---|---|---|---|
| 1 | Upgrade PHP | Ensure PHP 8.1+ | Laravel 9+ |
| 2 | Install OpenTelemetry SDK | Add to composer.json |
open-telemetry/sdk |
| 3 | Instrument Core Components | Auto-instrument HTTP, queues, jobs | OpenTelemetry SDK |
| 4 | Add Zipkin Exporter | Replace/extend exporters | open-telemetry/exporter-zipkin |
| 5 | Configure Middleware | Inject/extract trace headers | Laravel HTTP Kernel |
| 6 | Validate Traces | Test with Zipkin UI | Zipkin collector |
Example Implementation:
// composer.json
"require": {
"open-telemetry/sdk": "^1.0",
"open-telemetry/exporter-zipkin": "^1.2",
"telemetryphp/telemetry": "^1.0" // Optional: Auto-instrumentation
},
// config/telemetry.php
'exporters' => [
\OpenTelemetry\Contrib\Zipkin\Exporter\ZipkinExporter::class => [
'endpoint' => env('ZIPKIN_ENDPOINT', 'http://zipkin:9411/api/v2/spans'),
'timeout' => 2.0,
'batch' => [
'size' => 50,
'interval' => 1000, // ms
],
],
],
// app/Providers/AppServiceProvider.php
use OpenTelemetry\SDK\Trace\SpanProcessor\BatchSpanProcessor;
use OpenTelemetry\Contrib\Zipkin\Exporter\ZipkinExporter;
public function boot()
{
$exporter = new ZipkinExporter(config('telemetry.exporters.zipkin'));
$provider = \OpenTelemetry\SDK\Trace\Provider::getProvider();
$provider->addSpanProcessor(new BatchSpanProcessor($exporter));
}
| Component | Compatibility | Notes |
|---|---|---|
| PHP 8.1+ | ✅ Required | Laravel 9+ supports this. |
| OpenTelemetry SDK v1.0+ | ✅ Full | Package is built for this version. |
| Zipkin v2 API | ✅ Full | Supports modern collectors (Jaeger, Tempo). |
| Laravel HTTP | ✅ Partial | Requires middleware for header injection. |
| Laravel Queues | ✅ Partial | Needs auto-instrumentation for job tracing. |
| Async HTTP Clients | ✅ Full | Uses php-http/async-client-implementation. |
OpenTelemetry\API\Trace\TracerInterface.telemetryphp/telemetry for queue auto-instrumentation.X-B3-TraceId, X-B3-SpanId).// app/Http/Middleware/TraceContext.php
public function handle($request, Closure $next)
{
$traceContext = \OpenTelemetry\API\Trace\Propagation\TextMapPropagator::getInstance()
->extract(\OpenTelemetry\API\GlobalPropagation::get(), $request->headerBag);
// ... inject into current span
return $next($request);
}
| Task | Frequency | Effort | Owner |
|---|---|---|---|
| Exporter Updates | Quarterly | Low | DevOps/Backend |
| Zipkin Server Monitoring | Continuous |
How can I help you explore Laravel packages today?