summaryrefslogtreecommitdiff
path: root/vendor/open-telemetry/api/Instrumentation/CachedInstrumentation.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/open-telemetry/api/Instrumentation/CachedInstrumentation.php')
-rw-r--r--vendor/open-telemetry/api/Instrumentation/CachedInstrumentation.php97
1 files changed, 97 insertions, 0 deletions
diff --git a/vendor/open-telemetry/api/Instrumentation/CachedInstrumentation.php b/vendor/open-telemetry/api/Instrumentation/CachedInstrumentation.php
new file mode 100644
index 000000000..5ffb3950d
--- /dev/null
+++ b/vendor/open-telemetry/api/Instrumentation/CachedInstrumentation.php
@@ -0,0 +1,97 @@
+<?php
+
+declare(strict_types=1);
+
+namespace OpenTelemetry\API\Instrumentation;
+
+use ArrayAccess;
+use function assert;
+use function class_exists;
+use OpenTelemetry\API\Globals;
+use OpenTelemetry\API\Logs\LoggerInterface;
+use OpenTelemetry\API\Logs\LoggerProviderInterface;
+use OpenTelemetry\API\Metrics\MeterInterface;
+use OpenTelemetry\API\Metrics\MeterProviderInterface;
+use OpenTelemetry\API\Trace\TracerInterface;
+use OpenTelemetry\API\Trace\TracerProviderInterface;
+use const PHP_VERSION_ID;
+
+/**
+ * Provides access to cached {@link TracerInterface} and {@link MeterInterface}
+ * instances.
+ *
+ * Autoinstrumentation should prefer using a {@link CachedInstrumentation}
+ * instance over repeatedly obtaining instrumentation instances from
+ * {@link Globals}.
+ */
+final class CachedInstrumentation
+{
+ private string $name;
+ private ?string $version;
+ private ?string $schemaUrl;
+ private iterable $attributes;
+ /** @var ArrayAccess<TracerProviderInterface, TracerInterface>|null */
+ private ?ArrayAccess $tracers;
+ /** @var ArrayAccess<MeterProviderInterface, MeterInterface>|null */
+ private ?ArrayAccess $meters;
+ /** @var ArrayAccess<LoggerProviderInterface, LoggerInterface>|null */
+ private ?ArrayAccess $loggers;
+
+ public function __construct(string $name, ?string $version = null, ?string $schemaUrl = null, iterable $attributes = [])
+ {
+ $this->name = $name;
+ $this->version = $version;
+ $this->schemaUrl = $schemaUrl;
+ $this->attributes = $attributes;
+ $this->tracers = self::createWeakMap();
+ $this->meters = self::createWeakMap();
+ $this->loggers = self::createWeakMap();
+ }
+
+ private static function createWeakMap(): ?ArrayAccess
+ {
+ if (PHP_VERSION_ID < 80000) {
+ return null;
+ }
+
+ /** @phan-suppress-next-line PhanUndeclaredClassReference */
+ assert(class_exists(\WeakMap::class, false));
+ /** @phan-suppress-next-line PhanUndeclaredClassMethod */
+ $map = new \WeakMap();
+ assert($map instanceof ArrayAccess);
+
+ return $map;
+ }
+
+ public function tracer(): TracerInterface
+ {
+ $tracerProvider = Globals::tracerProvider();
+
+ if ($this->tracers === null) {
+ return $tracerProvider->getTracer($this->name, $this->version, $this->schemaUrl, $this->attributes);
+ }
+
+ return $this->tracers[$tracerProvider] ??= $tracerProvider->getTracer($this->name, $this->version, $this->schemaUrl, $this->attributes);
+ }
+
+ public function meter(): MeterInterface
+ {
+ $meterProvider = Globals::meterProvider();
+
+ if ($this->meters === null) {
+ return $meterProvider->getMeter($this->name, $this->version, $this->schemaUrl, $this->attributes);
+ }
+
+ return $this->meters[$meterProvider] ??= $meterProvider->getMeter($this->name, $this->version, $this->schemaUrl, $this->attributes);
+ }
+ public function logger(): LoggerInterface
+ {
+ $loggerProvider = Globals::loggerProvider();
+
+ if ($this->loggers === null) {
+ return $loggerProvider->getLogger($this->name, $this->version, $this->schemaUrl, $this->attributes);
+ }
+
+ return $this->loggers[$loggerProvider] ??= $loggerProvider->getLogger($this->name, $this->version, $this->schemaUrl, $this->attributes);
+ }
+}