tracerProvider = $tracerProvider; $this->meterProvider = $meterProvider; $this->loggerProvider = $loggerProvider; $this->propagator = $propagator; } public static function tracerProvider(): TracerProviderInterface { return Context::getCurrent()->get(ContextKeys::tracerProvider()) ?? self::globals()->tracerProvider; } public static function meterProvider(): MeterProviderInterface { return Context::getCurrent()->get(ContextKeys::meterProvider()) ?? self::globals()->meterProvider; } public static function propagator(): TextMapPropagatorInterface { return Context::getCurrent()->get(ContextKeys::propagator()) ?? self::globals()->propagator; } public static function loggerProvider(): LoggerProviderInterface { return Context::getCurrent()->get(ContextKeys::loggerProvider()) ?? self::globals()->loggerProvider; } /** * @param Closure(Configurator): Configurator $initializer * * @interal * @psalm-internal OpenTelemetry */ public static function registerInitializer(Closure $initializer): void { self::$initializers[] = $initializer; } /** * @phan-suppress PhanTypeMismatchReturnNullable */ private static function globals(): self { if (self::$globals !== null) { return self::$globals; } $configurator = Configurator::createNoop(); $scope = $configurator->activate(); try { foreach (self::$initializers as $initializer) { try { $configurator = $initializer($configurator); } catch (Throwable $e) { trigger_error(sprintf("Error during opentelemetry initialization: %s\n%s", $e->getMessage(), $e->getTraceAsString()), E_USER_WARNING); } } } finally { $scope->detach(); } $context = $configurator->storeInContext(); $tracerProvider = $context->get(ContextKeys::tracerProvider()); $meterProvider = $context->get(ContextKeys::meterProvider()); $propagator = $context->get(ContextKeys::propagator()); $loggerProvider = $context->get(ContextKeys::loggerProvider()); assert(isset($tracerProvider, $meterProvider, $loggerProvider, $propagator)); return self::$globals = new self($tracerProvider, $meterProvider, $loggerProvider, $propagator); } /** * @internal */ public static function reset(): void { self::$globals = null; self::$initializers = []; } }