summaryrefslogtreecommitdiff
path: root/vendor/open-telemetry/sdk/Trace/SpanExporter
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/open-telemetry/sdk/Trace/SpanExporter')
-rw-r--r--vendor/open-telemetry/sdk/Trace/SpanExporter/AbstractDecorator.php12
-rw-r--r--vendor/open-telemetry/sdk/Trace/SpanExporter/ConsoleSpanExporter.php57
-rw-r--r--vendor/open-telemetry/sdk/Trace/SpanExporter/ConsoleSpanExporterFactory.php18
-rw-r--r--vendor/open-telemetry/sdk/Trace/SpanExporter/FriendlySpanConverter.php173
-rw-r--r--vendor/open-telemetry/sdk/Trace/SpanExporter/InMemoryExporter.php40
-rw-r--r--vendor/open-telemetry/sdk/Trace/SpanExporter/InMemorySpanExporterFactory.php15
-rw-r--r--vendor/open-telemetry/sdk/Trace/SpanExporter/LoggerDecorator.php58
-rw-r--r--vendor/open-telemetry/sdk/Trace/SpanExporter/LoggerExporter.php96
-rw-r--r--vendor/open-telemetry/sdk/Trace/SpanExporter/NullSpanConverter.php15
-rw-r--r--vendor/open-telemetry/sdk/Trace/SpanExporter/SpanExporterFactoryInterface.php12
-rw-r--r--vendor/open-telemetry/sdk/Trace/SpanExporter/_register.php7
11 files changed, 503 insertions, 0 deletions
diff --git a/vendor/open-telemetry/sdk/Trace/SpanExporter/AbstractDecorator.php b/vendor/open-telemetry/sdk/Trace/SpanExporter/AbstractDecorator.php
new file mode 100644
index 000000000..42f49e815
--- /dev/null
+++ b/vendor/open-telemetry/sdk/Trace/SpanExporter/AbstractDecorator.php
@@ -0,0 +1,12 @@
+<?php
+
+declare(strict_types=1);
+
+namespace OpenTelemetry\SDK\Trace\SpanExporter;
+
+use OpenTelemetry\SDK\Trace\Behavior\SpanExporterDecoratorTrait;
+
+abstract class AbstractDecorator
+{
+ use SpanExporterDecoratorTrait;
+}
diff --git a/vendor/open-telemetry/sdk/Trace/SpanExporter/ConsoleSpanExporter.php b/vendor/open-telemetry/sdk/Trace/SpanExporter/ConsoleSpanExporter.php
new file mode 100644
index 000000000..482d122cc
--- /dev/null
+++ b/vendor/open-telemetry/sdk/Trace/SpanExporter/ConsoleSpanExporter.php
@@ -0,0 +1,57 @@
+<?php
+
+declare(strict_types=1);
+
+namespace OpenTelemetry\SDK\Trace\SpanExporter;
+
+use JsonException;
+use OpenTelemetry\API\Behavior\LogsMessagesTrait;
+use OpenTelemetry\SDK\Common\Export\TransportInterface;
+use OpenTelemetry\SDK\Common\Future\CancellationInterface;
+use OpenTelemetry\SDK\Common\Future\FutureInterface;
+use OpenTelemetry\SDK\Trace\Behavior\UsesSpanConverterTrait;
+use OpenTelemetry\SDK\Trace\SpanConverterInterface;
+use OpenTelemetry\SDK\Trace\SpanExporterInterface;
+
+class ConsoleSpanExporter implements SpanExporterInterface
+{
+ use UsesSpanConverterTrait;
+ use LogsMessagesTrait;
+
+ private TransportInterface $transport;
+
+ public function __construct(TransportInterface $transport, ?SpanConverterInterface $converter = null)
+ {
+ $this->transport = $transport;
+ $this->setSpanConverter($converter ?? new FriendlySpanConverter());
+ }
+
+ public function export(iterable $batch, ?CancellationInterface $cancellation = null): FutureInterface
+ {
+ $payload = '';
+ foreach ($batch as $span) {
+ try {
+ $payload .= json_encode(
+ $this->getSpanConverter()->convert([$span]),
+ JSON_THROW_ON_ERROR | JSON_PRETTY_PRINT
+ ) . PHP_EOL;
+ } catch (JsonException $e) {
+ self::logWarning('Error converting span: ' . $e->getMessage());
+ }
+ }
+
+ return $this->transport->send($payload)
+ ->map(fn () => true)
+ ->catch(fn () => false);
+ }
+
+ public function shutdown(?CancellationInterface $cancellation = null): bool
+ {
+ return $this->transport->shutdown();
+ }
+
+ public function forceFlush(?CancellationInterface $cancellation = null): bool
+ {
+ return $this->transport->forceFlush();
+ }
+}
diff --git a/vendor/open-telemetry/sdk/Trace/SpanExporter/ConsoleSpanExporterFactory.php b/vendor/open-telemetry/sdk/Trace/SpanExporter/ConsoleSpanExporterFactory.php
new file mode 100644
index 000000000..7e45fb549
--- /dev/null
+++ b/vendor/open-telemetry/sdk/Trace/SpanExporter/ConsoleSpanExporterFactory.php
@@ -0,0 +1,18 @@
+<?php
+
+declare(strict_types=1);
+
+namespace OpenTelemetry\SDK\Trace\SpanExporter;
+
+use OpenTelemetry\SDK\Registry;
+use OpenTelemetry\SDK\Trace\SpanExporterInterface;
+
+class ConsoleSpanExporterFactory implements SpanExporterFactoryInterface
+{
+ public function create(): SpanExporterInterface
+ {
+ $transport = Registry::transportFactory('stream')->create('php://stdout', 'application/json');
+
+ return new ConsoleSpanExporter($transport);
+ }
+}
diff --git a/vendor/open-telemetry/sdk/Trace/SpanExporter/FriendlySpanConverter.php b/vendor/open-telemetry/sdk/Trace/SpanExporter/FriendlySpanConverter.php
new file mode 100644
index 000000000..1f8178e10
--- /dev/null
+++ b/vendor/open-telemetry/sdk/Trace/SpanExporter/FriendlySpanConverter.php
@@ -0,0 +1,173 @@
+<?php
+
+declare(strict_types=1);
+
+namespace OpenTelemetry\SDK\Trace\SpanExporter;
+
+use OpenTelemetry\API\Trace\SpanContextInterface;
+use OpenTelemetry\API\Trace\SpanKind;
+use OpenTelemetry\SDK\Common\Attribute\AttributesInterface;
+use OpenTelemetry\SDK\Resource\ResourceInfo;
+use OpenTelemetry\SDK\Trace\EventInterface;
+use OpenTelemetry\SDK\Trace\LinkInterface;
+use OpenTelemetry\SDK\Trace\SpanConverterInterface;
+use OpenTelemetry\SDK\Trace\SpanDataInterface;
+use OpenTelemetry\SDK\Trace\StatusDataInterface;
+use ReflectionClass;
+
+class FriendlySpanConverter implements SpanConverterInterface
+{
+ private const NAME_ATTR = 'name';
+ private const CONTEXT_ATTR = 'context';
+ private const TRACE_ID_ATTR = 'trace_id';
+ private const SPAN_ID_ATTR = 'span_id';
+ private const TRACE_STATE_ATTR = 'trace_state';
+ private const RESOURCE_ATTR = 'resource';
+ private const PARENT_SPAN_ATTR = 'parent_span_id';
+ private const KIND_ATTR = 'kind';
+ private const START_ATTR = 'start';
+ private const END_ATTR = 'end';
+ private const ATTRIBUTES_ATTR = 'attributes';
+ private const STATUS_ATTR = 'status';
+ private const CODE_ATTR = 'code';
+ private const DESCRIPTION_ATTR = 'description';
+ private const EVENTS_ATTR = 'events';
+ private const TIMESTAMP_ATTR = 'timestamp';
+ private const LINKS_ATTR = 'links';
+
+ public function convert(iterable $spans): array
+ {
+ $aggregate = [];
+ foreach ($spans as $span) {
+ $aggregate[] = $this->convertSpan($span);
+ }
+
+ return $aggregate;
+ }
+
+ /**
+ * friendlySpan does the heavy lifting converting a span into an array
+ *
+ * @param SpanDataInterface $span
+ * @return array
+ */
+ private function convertSpan(SpanDataInterface $span): array
+ {
+ return [
+ self::NAME_ATTR => $span->getName(),
+ self::CONTEXT_ATTR => $this->convertContext($span->getContext()),
+ self::RESOURCE_ATTR => $this->convertResource($span->getResource()),
+ self::PARENT_SPAN_ATTR => $this->covertParentContext($span->getParentContext()),
+ self::KIND_ATTR => $this->convertKind($span->getKind()),
+ self::START_ATTR => $span->getStartEpochNanos(),
+ self::END_ATTR => $span->getEndEpochNanos(),
+ self::ATTRIBUTES_ATTR => $this->convertAttributes($span->getAttributes()),
+ self::STATUS_ATTR => $this->covertStatus($span->getStatus()),
+ self::EVENTS_ATTR => $this->convertEvents($span->getEvents()),
+ self::LINKS_ATTR => $this->convertLinks($span->getLinks()),
+ ];
+ }
+
+ /**
+ * @param SpanContextInterface $context
+ * @return array
+ */
+ private function convertContext(SpanContextInterface $context): array
+ {
+ return [
+ self::TRACE_ID_ATTR => $context->getTraceId(),
+ self::SPAN_ID_ATTR => $context->getSpanId(),
+ self::TRACE_STATE_ATTR => (string) $context->getTraceState(),
+ ];
+ }
+
+ /**
+ * @param ResourceInfo $resource
+ * @return array
+ */
+ private function convertResource(ResourceInfo $resource): array
+ {
+ return $resource->getAttributes()->toArray();
+ }
+
+ /**
+ * @param SpanContextInterface $context
+ * @return string
+ */
+ private function covertParentContext(SpanContextInterface $context): string
+ {
+ return $context->isValid() ? $context->getSpanId() : '';
+ }
+
+ /**
+ * Translates SpanKind from its integer representation to a more human friendly string.
+ *
+ * @param int $kind
+ * @return string
+ */
+ private function convertKind(int $kind): string
+ {
+ return array_flip(
+ (new ReflectionClass(SpanKind::class))
+ ->getConstants()
+ )[$kind];
+ }
+
+ /**
+ * @param \OpenTelemetry\SDK\Common\Attribute\AttributesInterface $attributes
+ * @return array
+ */
+ private function convertAttributes(AttributesInterface $attributes): array
+ {
+ return $attributes->toArray();
+ }
+
+ /**
+ * @param StatusDataInterface $status
+ * @return array
+ */
+ private function covertStatus(StatusDataInterface $status): array
+ {
+ return [
+ self::CODE_ATTR => $status->getCode(),
+ self::DESCRIPTION_ATTR => $status->getDescription(),
+ ];
+ }
+
+ /**
+ * @param array<EventInterface> $events
+ * @return array
+ */
+ private function convertEvents(array $events): array
+ {
+ $result = [];
+
+ foreach ($events as $event) {
+ $result[] = [
+ self::NAME_ATTR => $event->getName(),
+ self::TIMESTAMP_ATTR => $event->getEpochNanos(),
+ self::ATTRIBUTES_ATTR => $this->convertAttributes($event->getAttributes()),
+ ];
+ }
+
+ return $result;
+ }
+
+ /**
+ * @param array<LinkInterface> $links
+ * @return array
+ */
+ private function convertLinks(array $links): array
+ {
+ $result = [];
+
+ foreach ($links as $link) {
+ $result[] = [
+ self::CONTEXT_ATTR => $this->convertContext($link->getSpanContext()),
+ self::ATTRIBUTES_ATTR => $this->convertAttributes($link->getAttributes()),
+ ];
+ }
+
+ return $result;
+ }
+}
diff --git a/vendor/open-telemetry/sdk/Trace/SpanExporter/InMemoryExporter.php b/vendor/open-telemetry/sdk/Trace/SpanExporter/InMemoryExporter.php
new file mode 100644
index 000000000..ebb022595
--- /dev/null
+++ b/vendor/open-telemetry/sdk/Trace/SpanExporter/InMemoryExporter.php
@@ -0,0 +1,40 @@
+<?php
+
+declare(strict_types=1);
+
+namespace OpenTelemetry\SDK\Trace\SpanExporter;
+
+use ArrayObject;
+use OpenTelemetry\SDK\Trace\Behavior\SpanExporterTrait;
+use OpenTelemetry\SDK\Trace\SpanExporterInterface;
+
+class InMemoryExporter implements SpanExporterInterface
+{
+ use SpanExporterTrait;
+
+ private ArrayObject $storage;
+
+ public function __construct(?ArrayObject $storage = null)
+ {
+ $this->storage = $storage ?? new ArrayObject();
+ }
+
+ protected function doExport(iterable $spans): bool
+ {
+ foreach ($spans as $span) {
+ $this->storage[] = $span;
+ }
+
+ return true;
+ }
+
+ public function getSpans(): array
+ {
+ return (array) $this->storage;
+ }
+
+ public function getStorage(): ArrayObject
+ {
+ return $this->storage;
+ }
+}
diff --git a/vendor/open-telemetry/sdk/Trace/SpanExporter/InMemorySpanExporterFactory.php b/vendor/open-telemetry/sdk/Trace/SpanExporter/InMemorySpanExporterFactory.php
new file mode 100644
index 000000000..c19686fac
--- /dev/null
+++ b/vendor/open-telemetry/sdk/Trace/SpanExporter/InMemorySpanExporterFactory.php
@@ -0,0 +1,15 @@
+<?php
+
+declare(strict_types=1);
+
+namespace OpenTelemetry\SDK\Trace\SpanExporter;
+
+use OpenTelemetry\SDK\Trace\SpanExporterInterface;
+
+class InMemorySpanExporterFactory implements SpanExporterFactoryInterface
+{
+ public function create(): SpanExporterInterface
+ {
+ return new InMemoryExporter();
+ }
+}
diff --git a/vendor/open-telemetry/sdk/Trace/SpanExporter/LoggerDecorator.php b/vendor/open-telemetry/sdk/Trace/SpanExporter/LoggerDecorator.php
new file mode 100644
index 000000000..b7cf511a5
--- /dev/null
+++ b/vendor/open-telemetry/sdk/Trace/SpanExporter/LoggerDecorator.php
@@ -0,0 +1,58 @@
+<?php
+
+declare(strict_types=1);
+
+namespace OpenTelemetry\SDK\Trace\SpanExporter;
+
+use OpenTelemetry\SDK\Trace\Behavior\LoggerAwareTrait;
+use OpenTelemetry\SDK\Trace\Behavior\SpanExporterDecoratorTrait;
+use OpenTelemetry\SDK\Trace\Behavior\UsesSpanConverterTrait;
+use OpenTelemetry\SDK\Trace\SpanConverterInterface;
+use OpenTelemetry\SDK\Trace\SpanExporterInterface;
+use Psr\Log\LoggerAwareInterface;
+use Psr\Log\LoggerInterface;
+use Psr\Log\LogLevel;
+use Psr\Log\NullLogger;
+
+class LoggerDecorator implements SpanExporterInterface, LoggerAwareInterface
+{
+ use SpanExporterDecoratorTrait;
+ use UsesSpanConverterTrait;
+ use LoggerAwareTrait;
+
+ public function __construct(
+ SpanExporterInterface $decorated,
+ ?LoggerInterface $logger = null,
+ ?SpanConverterInterface $converter = null
+ ) {
+ $this->setDecorated($decorated);
+ $this->setLogger($logger ?? new NullLogger());
+ $this->setSpanConverter($converter ?? new FriendlySpanConverter());
+ }
+
+ protected function beforeExport(iterable $spans): iterable
+ {
+ return $spans;
+ }
+
+ /**
+ * @param iterable $spans
+ * @param bool $exportSuccess
+ */
+ protected function afterExport(iterable $spans, bool $exportSuccess): void
+ {
+ if ($exportSuccess) {
+ $this->log(
+ 'Status Success',
+ $this->getSpanConverter()->convert($spans),
+ LogLevel::INFO,
+ );
+ } else {
+ $this->log(
+ 'Status Failed Retryable',
+ $this->getSpanConverter()->convert($spans),
+ LogLevel::ERROR,
+ );
+ }
+ }
+}
diff --git a/vendor/open-telemetry/sdk/Trace/SpanExporter/LoggerExporter.php b/vendor/open-telemetry/sdk/Trace/SpanExporter/LoggerExporter.php
new file mode 100644
index 000000000..1969a5426
--- /dev/null
+++ b/vendor/open-telemetry/sdk/Trace/SpanExporter/LoggerExporter.php
@@ -0,0 +1,96 @@
+<?php
+
+declare(strict_types=1);
+
+namespace OpenTelemetry\SDK\Trace\SpanExporter;
+
+use OpenTelemetry\SDK\Trace\Behavior\LoggerAwareTrait;
+use OpenTelemetry\SDK\Trace\Behavior\SpanExporterTrait;
+use OpenTelemetry\SDK\Trace\Behavior\UsesSpanConverterTrait;
+use OpenTelemetry\SDK\Trace\SpanConverterInterface;
+use OpenTelemetry\SDK\Trace\SpanExporterInterface;
+use Psr\Log\LoggerAwareInterface;
+use Psr\Log\LoggerInterface;
+use Psr\Log\LogLevel;
+use Psr\Log\NullLogger;
+use Throwable;
+
+class LoggerExporter implements SpanExporterInterface, LoggerAwareInterface
+{
+ use SpanExporterTrait;
+ use UsesSpanConverterTrait;
+ use LoggerAwareTrait;
+
+ public const GRANULARITY_AGGREGATE = 1;
+ public const GRANULARITY_SPAN = 2;
+
+ private string $serviceName;
+ private int $granularity = self::GRANULARITY_AGGREGATE;
+
+ /**
+ * @param string $serviceName
+ * @param LoggerInterface|null $logger
+ * @param string|null $defaultLogLevel
+ * @param SpanConverterInterface|null $converter
+ * @param int $granularity
+ */
+ public function __construct(
+ string $serviceName,
+ ?LoggerInterface $logger = null,
+ ?string $defaultLogLevel = LogLevel::DEBUG,
+ ?SpanConverterInterface $converter = null,
+ int $granularity = 1
+ ) {
+ $this->setServiceName($serviceName);
+ $this->setLogger($logger ?? new NullLogger());
+ $this->setDefaultLogLevel($defaultLogLevel ?? LogLevel::DEBUG);
+ $this->setSpanConverter($converter ?? new FriendlySpanConverter());
+ $this->setGranularity($granularity);
+ }
+
+ /** @inheritDoc */
+ public function doExport(iterable $spans): bool
+ {
+ try {
+ $this->doLog($spans);
+ } catch (Throwable $t) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * @param string $serviceName
+ */
+ private function setServiceName(string $serviceName): void
+ {
+ $this->serviceName = $serviceName;
+ }
+
+ /**
+ * @param int $granularity
+ */
+ public function setGranularity(int $granularity): void
+ {
+ $this->granularity = $granularity === self::GRANULARITY_SPAN
+ ? self::GRANULARITY_SPAN
+ : self::GRANULARITY_AGGREGATE;
+ }
+
+ /**
+ * @param iterable $spans
+ */
+ private function doLog(iterable $spans): void
+ {
+ if ($this->granularity === self::GRANULARITY_AGGREGATE) {
+ $this->log($this->serviceName, $this->getSpanConverter()->convert($spans));
+
+ return;
+ }
+
+ foreach ($spans as $span) {
+ $this->log($this->serviceName, $this->getSpanConverter()->convert([$span]));
+ }
+ }
+}
diff --git a/vendor/open-telemetry/sdk/Trace/SpanExporter/NullSpanConverter.php b/vendor/open-telemetry/sdk/Trace/SpanExporter/NullSpanConverter.php
new file mode 100644
index 000000000..1e55431a8
--- /dev/null
+++ b/vendor/open-telemetry/sdk/Trace/SpanExporter/NullSpanConverter.php
@@ -0,0 +1,15 @@
+<?php
+
+declare(strict_types=1);
+
+namespace OpenTelemetry\SDK\Trace\SpanExporter;
+
+use OpenTelemetry\SDK\Trace\SpanConverterInterface;
+
+class NullSpanConverter implements SpanConverterInterface
+{
+ public function convert(iterable $spans): array
+ {
+ return [[]];
+ }
+}
diff --git a/vendor/open-telemetry/sdk/Trace/SpanExporter/SpanExporterFactoryInterface.php b/vendor/open-telemetry/sdk/Trace/SpanExporter/SpanExporterFactoryInterface.php
new file mode 100644
index 000000000..8d44b35eb
--- /dev/null
+++ b/vendor/open-telemetry/sdk/Trace/SpanExporter/SpanExporterFactoryInterface.php
@@ -0,0 +1,12 @@
+<?php
+
+declare(strict_types=1);
+
+namespace OpenTelemetry\SDK\Trace\SpanExporter;
+
+use OpenTelemetry\SDK\Trace\SpanExporterInterface;
+
+interface SpanExporterFactoryInterface
+{
+ public function create(): SpanExporterInterface;
+}
diff --git a/vendor/open-telemetry/sdk/Trace/SpanExporter/_register.php b/vendor/open-telemetry/sdk/Trace/SpanExporter/_register.php
new file mode 100644
index 000000000..aad07be42
--- /dev/null
+++ b/vendor/open-telemetry/sdk/Trace/SpanExporter/_register.php
@@ -0,0 +1,7 @@
+<?php
+
+declare(strict_types=1);
+\OpenTelemetry\SDK\Registry::registerSpanExporterFactory('console', \OpenTelemetry\SDK\Trace\SpanExporter\ConsoleSpanExporterFactory::class);
+\OpenTelemetry\SDK\Registry::registerSpanExporterFactory('memory', \OpenTelemetry\SDK\Trace\SpanExporter\InMemorySpanExporterFactory::class);
+
+\OpenTelemetry\SDK\Registry::registerTransportFactory('stream', \OpenTelemetry\SDK\Common\Export\Stream\StreamTransportFactory::class);