Uses BatchSpanProcessor by default from SDK configuration
Sample Code
Custom tracer class
<?phpnamespaceApp\Service\Tracing;useOpenTelemetry\API\Globals;useOpenTelemetry\API\Trace\SpanInterface;useOpenTelemetry\API\Trace\TracerInterface;classTracer{protectedTracerInterface$tracer;protected?SpanInterface$lastSpan=null;protected?SpanInterface$rootSpan=null;protectedarray$spanMap=[];publicfunction__construct(){$this->tracer=Globals::tracerProvider()->getTracer('io.opentelemetry.contrib.php.laravel');}// Methods for span management
publicstaticfunctiongetInstance():Tracer{/*...*/}publicfunctionstartRootSpan($name):void{/*...*/}publicfunctionstartAndEndLastSpan($name):SpanInterface{/*...*/}publicfunctionstartSpan($name):SpanInterface{/*...*/}publicfunctionendRootSpan():void{/*...*/}publicfunctionendLastSpan():void{/*...*/}publicfunctionendSpan(?SpanInterface$span):void{/*...*/}}
Controller usage
classIndexAlbumsControllerextendsController{publicfunctionindex(){$tracer=Tracer::getInstance();$tracer->startRootSpan('root');// Business logic with spans
$tracer->endRootSpan();}}
The Problem
Occasional hundreds of milliseconds delay during $span->end()
Missing time segments in tracing data
Missing segments
Root Cause Analysis
The BatchSpanProcessor’s flush() method causes blocking during span export