summaryrefslogtreecommitdiff
path: root/vendor/open-telemetry/sdk/Trace/TracerProvider.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/open-telemetry/sdk/Trace/TracerProvider.php')
-rw-r--r--vendor/open-telemetry/sdk/Trace/TracerProvider.php99
1 files changed, 99 insertions, 0 deletions
diff --git a/vendor/open-telemetry/sdk/Trace/TracerProvider.php b/vendor/open-telemetry/sdk/Trace/TracerProvider.php
new file mode 100644
index 000000000..fdae4aea2
--- /dev/null
+++ b/vendor/open-telemetry/sdk/Trace/TracerProvider.php
@@ -0,0 +1,99 @@
+<?php
+
+declare(strict_types=1);
+
+namespace OpenTelemetry\SDK\Trace;
+
+use function is_array;
+use OpenTelemetry\API\Trace as API;
+use OpenTelemetry\API\Trace\NoopTracer;
+use OpenTelemetry\SDK\Common\Attribute\Attributes;
+use OpenTelemetry\SDK\Common\Future\CancellationInterface;
+use OpenTelemetry\SDK\Common\Instrumentation\InstrumentationScopeFactory;
+use OpenTelemetry\SDK\Common\Instrumentation\InstrumentationScopeFactoryInterface;
+use OpenTelemetry\SDK\Resource\ResourceInfo;
+use OpenTelemetry\SDK\Resource\ResourceInfoFactory;
+use OpenTelemetry\SDK\Trace\Sampler\AlwaysOnSampler;
+use OpenTelemetry\SDK\Trace\Sampler\ParentBased;
+
+final class TracerProvider implements TracerProviderInterface
+{
+ /** @readonly */
+ private TracerSharedState $tracerSharedState;
+ private InstrumentationScopeFactoryInterface $instrumentationScopeFactory;
+
+ /** @param list<SpanProcessorInterface>|SpanProcessorInterface|null $spanProcessors */
+ public function __construct(
+ $spanProcessors = [],
+ SamplerInterface $sampler = null,
+ ResourceInfo $resource = null,
+ SpanLimits $spanLimits = null,
+ IdGeneratorInterface $idGenerator = null,
+ ?InstrumentationScopeFactoryInterface $instrumentationScopeFactory = null
+ ) {
+ if (null === $spanProcessors) {
+ $spanProcessors = [];
+ }
+
+ $spanProcessors = is_array($spanProcessors) ? $spanProcessors : [$spanProcessors];
+ $resource ??= ResourceInfoFactory::defaultResource();
+ $sampler ??= new ParentBased(new AlwaysOnSampler());
+ $idGenerator ??= new RandomIdGenerator();
+ $spanLimits ??= (new SpanLimitsBuilder())->build();
+
+ $this->tracerSharedState = new TracerSharedState(
+ $idGenerator,
+ $resource,
+ $spanLimits,
+ $sampler,
+ $spanProcessors
+ );
+ $this->instrumentationScopeFactory = $instrumentationScopeFactory ?? new InstrumentationScopeFactory(Attributes::factory());
+ }
+
+ public function forceFlush(?CancellationInterface $cancellation = null): bool
+ {
+ return $this->tracerSharedState->getSpanProcessor()->forceFlush($cancellation);
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getTracer(
+ string $name,
+ ?string $version = null,
+ ?string $schemaUrl = null,
+ iterable $attributes = []
+ ): API\TracerInterface {
+ if ($this->tracerSharedState->hasShutdown()) {
+ return NoopTracer::getInstance();
+ }
+
+ return new Tracer(
+ $this->tracerSharedState,
+ $this->instrumentationScopeFactory->create($name, $version, $schemaUrl, $attributes),
+ );
+ }
+
+ public function getSampler(): SamplerInterface
+ {
+ return $this->tracerSharedState->getSampler();
+ }
+
+ /**
+ * Returns `false` is the provider is already shutdown, otherwise `true`.
+ */
+ public function shutdown(?CancellationInterface $cancellation = null): bool
+ {
+ if ($this->tracerSharedState->hasShutdown()) {
+ return true;
+ }
+
+ return $this->tracerSharedState->shutdown($cancellation);
+ }
+
+ public static function builder(): TracerProviderBuilder
+ {
+ return new TracerProviderBuilder();
+ }
+}