summaryrefslogtreecommitdiff
path: root/vendor/open-telemetry/exporter-otlp/SpanExporterFactory.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/open-telemetry/exporter-otlp/SpanExporterFactory.php')
-rw-r--r--vendor/open-telemetry/exporter-otlp/SpanExporterFactory.php96
1 files changed, 96 insertions, 0 deletions
diff --git a/vendor/open-telemetry/exporter-otlp/SpanExporterFactory.php b/vendor/open-telemetry/exporter-otlp/SpanExporterFactory.php
new file mode 100644
index 000000000..ce0550735
--- /dev/null
+++ b/vendor/open-telemetry/exporter-otlp/SpanExporterFactory.php
@@ -0,0 +1,96 @@
+<?php
+
+declare(strict_types=1);
+
+namespace OpenTelemetry\Contrib\Otlp;
+
+use OpenTelemetry\API\Behavior\LogsMessagesTrait;
+use OpenTelemetry\API\Signals;
+use OpenTelemetry\SDK\Common\Configuration\Configuration;
+use OpenTelemetry\SDK\Common\Configuration\Defaults;
+use OpenTelemetry\SDK\Common\Configuration\Variables;
+use OpenTelemetry\SDK\Common\Export\TransportFactoryInterface;
+use OpenTelemetry\SDK\Common\Export\TransportInterface;
+use OpenTelemetry\SDK\Registry;
+use OpenTelemetry\SDK\Trace\SpanExporter\SpanExporterFactoryInterface;
+use OpenTelemetry\SDK\Trace\SpanExporterInterface;
+
+class SpanExporterFactory implements SpanExporterFactoryInterface
+{
+ use LogsMessagesTrait;
+
+ private ?TransportFactoryInterface $transportFactory;
+
+ private const DEFAULT_COMPRESSION = 'none';
+
+ public function __construct(?TransportFactoryInterface $transportFactory = null)
+ {
+ $this->transportFactory = $transportFactory;
+ }
+
+ /**
+ * @psalm-suppress ArgumentTypeCoercion
+ */
+ public function create(): SpanExporterInterface
+ {
+ $transport = $this->buildTransport();
+
+ return new SpanExporter($transport);
+ }
+
+ /**
+ * @psalm-suppress ArgumentTypeCoercion
+ * @psalm-suppress UndefinedClass
+ */
+ private function buildTransport(): TransportInterface
+ {
+ $protocol = $this->getProtocol();
+ $contentType = Protocols::contentType($protocol);
+ $endpoint = $this->getEndpoint($protocol);
+ $headers = $this->getHeaders();
+ $compression = $this->getCompression();
+
+ $factoryClass = Registry::transportFactory($protocol);
+ $factory = $this->transportFactory ?: new $factoryClass();
+
+ return $factory->create($endpoint, $contentType, $headers, $compression);
+ }
+
+ private function getProtocol(): string
+ {
+ return Configuration::has(Variables::OTEL_EXPORTER_OTLP_TRACES_PROTOCOL) ?
+ Configuration::getEnum(Variables::OTEL_EXPORTER_OTLP_TRACES_PROTOCOL) :
+ Configuration::getEnum(Variables::OTEL_EXPORTER_OTLP_PROTOCOL);
+ }
+
+ private function getEndpoint(string $protocol): string
+ {
+ if (Configuration::has(Variables::OTEL_EXPORTER_OTLP_TRACES_ENDPOINT)) {
+ return Configuration::getString(Variables::OTEL_EXPORTER_OTLP_TRACES_ENDPOINT);
+ }
+ $endpoint = Configuration::has(Variables::OTEL_EXPORTER_OTLP_ENDPOINT)
+ ? Configuration::getString(Variables::OTEL_EXPORTER_OTLP_ENDPOINT)
+ : Defaults::OTEL_EXPORTER_OTLP_ENDPOINT;
+ if ($protocol === Protocols::GRPC) {
+ return $endpoint . OtlpUtil::method(Signals::TRACE);
+ }
+
+ return HttpEndpointResolver::create()->resolveToString($endpoint, Signals::TRACE);
+ }
+
+ private function getHeaders(): array
+ {
+ $headers = Configuration::has(Variables::OTEL_EXPORTER_OTLP_TRACES_HEADERS) ?
+ Configuration::getMap(Variables::OTEL_EXPORTER_OTLP_TRACES_HEADERS) :
+ Configuration::getMap(Variables::OTEL_EXPORTER_OTLP_HEADERS);
+
+ return $headers + OtlpUtil::getUserAgentHeader();
+ }
+
+ private function getCompression(): string
+ {
+ return Configuration::has(Variables::OTEL_EXPORTER_OTLP_TRACES_COMPRESSION) ?
+ Configuration::getEnum(Variables::OTEL_EXPORTER_OTLP_TRACES_COMPRESSION) :
+ Configuration::getEnum(Variables::OTEL_EXPORTER_OTLP_COMPRESSION, self::DEFAULT_COMPRESSION);
+ }
+}