create($OPENTELEMETRY_ENDPOINT, 'application/x-protobuf'); $exporter = new SpanExporter($transport); } else { $exporter = new InMemoryExporter(); } $resource = ResourceInfoFactory::emptyResource()->merge( ResourceInfo::create(Attributes::create( [ResourceAttributes::SERVICE_NAME => Config::get(Config::OPENTELEMETRY_SERVICE)] ), ResourceAttributes::SCHEMA_URL), ); $tracerProvider = new TracerProvider(new SimpleSpanProcessor($exporter), null, $resource); $this->tracer = $tracerProvider->getTracer('io.opentelemetry.contrib.php'); $context = TraceContextPropagator::getInstance()->extract(getallheaders()); $span = $this->tracer->spanBuilder('root') ->setParent($context) ->setAttribute('http.request', json_encode($_REQUEST)) ->startSpan(); $scope = $span->activate(); register_shutdown_function(function() use ($span, $tracerProvider, $scope) { $span->end(); $scope->detach(); $tracerProvider->shutdown(); }); } /** * @param string $name * @return OpenTelemetry\API\Trace\SpanInterface */ private function _start(string $name) { $span = $this->tracer->spanBuilder($name)->startSpan(); $span->activate(); return $span; } /** * @param string $name * @return OpenTelemetry\API\Trace\SpanInterface */ public static function start(string $name) { return self::get_instance()->_start($name); } public static function get_instance() : Tracer { if (self::$instance == null) self::$instance = new self(); return self::$instance; } }