client = $client; $this->requestFactory = $requestFactory; $this->logger = $logger; $this->endpoint = $uri; $this->serviceName = $serviceName; $this->hostName = $hostName; } /** @inheritDoc */ public function export( TracerState $tracerState ): void { $spanContexts = $tracerState->getSpanContexts(); if ( count( $spanContexts ) === 0 ) { return; } $resourceInfo = array_filter( [ 'service.name' => $this->serviceName, 'host.name' => $this->hostName, "server.socket.address" => $_SERVER['SERVER_ADDR'] ?? null, ] ); $data = [ 'resourceSpans' => [ [ 'resource' => [ 'attributes' => OtlpSerializer::serializeKeyValuePairs( $resourceInfo ) ], 'scopeSpans' => [ [ 'scope' => [ 'name' => 'org.wikimedia.telemetry', ], 'spans' => $spanContexts ] ] ] ] ]; $request = $this->requestFactory->createRequest( 'POST', $this->endpoint ) ->withHeader( 'Content-Type', 'application/json' ) ->withBody( Utils::streamFor( json_encode( $data ) ) ); try { $response = $this->client->sendRequest( $request ); if ( $response->getStatusCode() !== 200 ) { $this->logger->error( 'Failed to export trace data' ); } } catch ( ClientExceptionInterface $e ) { $this->logger->error( 'Failed to connect to exporter', [ 'exception' => $e ] ); } // Clear out finished spans after exporting them. $tracerState->clearSpanContexts(); } }