summaryrefslogtreecommitdiff
path: root/vendor/open-telemetry/exporter-otlp/LogsConverter.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/open-telemetry/exporter-otlp/LogsConverter.php')
-rw-r--r--vendor/open-telemetry/exporter-otlp/LogsConverter.php142
1 files changed, 142 insertions, 0 deletions
diff --git a/vendor/open-telemetry/exporter-otlp/LogsConverter.php b/vendor/open-telemetry/exporter-otlp/LogsConverter.php
new file mode 100644
index 000000000..1da53ad1f
--- /dev/null
+++ b/vendor/open-telemetry/exporter-otlp/LogsConverter.php
@@ -0,0 +1,142 @@
+<?php
+
+declare(strict_types=1);
+
+namespace OpenTelemetry\Contrib\Otlp;
+
+use Opentelemetry\Proto\Collector\Logs\V1\ExportLogsServiceRequest;
+use Opentelemetry\Proto\Common\V1\InstrumentationScope;
+use Opentelemetry\Proto\Common\V1\KeyValue;
+use Opentelemetry\Proto\Logs\V1\LogRecord;
+use Opentelemetry\Proto\Logs\V1\ResourceLogs;
+use Opentelemetry\Proto\Logs\V1\ScopeLogs;
+use Opentelemetry\Proto\Resource\V1\Resource as Resource_;
+use OpenTelemetry\SDK\Common\Attribute\AttributesInterface;
+use OpenTelemetry\SDK\Common\Instrumentation\InstrumentationScopeInterface;
+use OpenTelemetry\SDK\Logs\ReadableLogRecord;
+use OpenTelemetry\SDK\Resource\ResourceInfo;
+
+class LogsConverter
+{
+ private ProtobufSerializer $serializer;
+
+ public function __construct(?ProtobufSerializer $serializer = null)
+ {
+ $this->serializer = $serializer ?? ProtobufSerializer::getDefault();
+ }
+
+ /**
+ * @param iterable<ReadableLogRecord> $logs
+ * @psalm-suppress InvalidArgument
+ */
+ public function convert(iterable $logs): ExportLogsServiceRequest
+ {
+ $pExportLogsServiceRequest = new ExportLogsServiceRequest();
+ $scopeLogs = [];
+ $resourceLogs = [];
+ $resourceCache = [];
+ $scopeCache = [];
+
+ foreach ($logs as $log) {
+ $resource = $log->getResource();
+ $instrumentationScope = $log->getInstrumentationScope();
+
+ $resourceId = $resourceCache[spl_object_id($resource)] ??= serialize([
+ $resource->getSchemaUrl(),
+ $resource->getAttributes()->toArray(),
+ $resource->getAttributes()->getDroppedAttributesCount(),
+ ]);
+ $instrumentationScopeId = $scopeCache[spl_object_id($instrumentationScope)] ??= serialize([
+ $instrumentationScope->getName(),
+ $instrumentationScope->getVersion(),
+ $instrumentationScope->getSchemaUrl(),
+ $instrumentationScope->getAttributes()->toArray(),
+ $instrumentationScope->getAttributes()->getDroppedAttributesCount(),
+ ]);
+
+ if (($pResourceLogs = $resourceLogs[$resourceId] ?? null) === null) {
+ /** @psalm-suppress InvalidArgument */
+ $pExportLogsServiceRequest->getResourceLogs()[]
+ = $resourceLogs[$resourceId]
+ = $pResourceLogs
+ = $this->convertResourceLogs($resource);
+ }
+
+ if (($pScopeLogs = $scopeLogs[$resourceId][$instrumentationScopeId] ?? null) === null) {
+ $pResourceLogs->getScopeLogs()[]
+ = $scopeLogs[$resourceId][$instrumentationScopeId]
+ = $pScopeLogs
+ = $this->convertInstrumentationScope($instrumentationScope);
+ }
+
+ $pScopeLogs->getLogRecords()[] = $this->convertLogRecord($log);
+ }
+
+ return $pExportLogsServiceRequest;
+ }
+
+ private function convertLogRecord(ReadableLogRecord $record): LogRecord
+ {
+ $pLogRecord = new LogRecord();
+ $pLogRecord->setBody(AttributesConverter::convertAnyValue($record->getBody()));
+ $pLogRecord->setTimeUnixNano($record->getTimestamp() ?? 0);
+ $pLogRecord->setObservedTimeUnixNano($record->getObservedTimestamp() ?? 0);
+ $spanContext = $record->getSpanContext();
+ if ($spanContext !== null && $spanContext->isValid()) {
+ $pLogRecord->setTraceId($this->serializer->serializeTraceId($spanContext->getTraceIdBinary()));
+ $pLogRecord->setSpanId($this->serializer->serializeSpanId($spanContext->getSpanIdBinary()));
+ $pLogRecord->setFlags($spanContext->getTraceFlags());
+ }
+ $severityNumber = $record->getSeverityNumber();
+ if ($severityNumber !== null) {
+ $pLogRecord->setSeverityNumber($severityNumber);
+ }
+ $severityText = $record->getSeverityText();
+ if ($severityText !== null) {
+ $pLogRecord->setSeverityText($severityText);
+ }
+ $this->setAttributes($pLogRecord, $record->getAttributes());
+ $pLogRecord->setDroppedAttributesCount($record->getAttributes()->getDroppedAttributesCount());
+
+ return $pLogRecord;
+ }
+
+ private function convertInstrumentationScope(InstrumentationScopeInterface $instrumentationScope): ScopeLogs
+ {
+ $pScopeLogs = new ScopeLogs();
+ $pInstrumentationScope = new InstrumentationScope();
+ $pInstrumentationScope->setName($instrumentationScope->getName());
+ $pInstrumentationScope->setVersion((string) $instrumentationScope->getVersion());
+ $this->setAttributes($pInstrumentationScope, $instrumentationScope->getAttributes());
+ $pInstrumentationScope->setDroppedAttributesCount($instrumentationScope->getAttributes()->getDroppedAttributesCount());
+ $pScopeLogs->setScope($pInstrumentationScope);
+ $pScopeLogs->setSchemaUrl((string) $instrumentationScope->getSchemaUrl());
+
+ return $pScopeLogs;
+ }
+
+ private function convertResourceLogs(ResourceInfo $resource): ResourceLogs
+ {
+ $pResourceLogs = new ResourceLogs();
+ $pResource = new Resource_();
+ $this->setAttributes($pResource, $resource->getAttributes());
+ $pResource->setDroppedAttributesCount($resource->getAttributes()->getDroppedAttributesCount());
+ $pResourceLogs->setResource($pResource);
+
+ return $pResourceLogs;
+ }
+
+ /**
+ * @param Resource_|LogRecord|InstrumentationScope $pElement
+ */
+ private function setAttributes($pElement, AttributesInterface $attributes): void
+ {
+ foreach ($attributes as $key => $value) {
+ /** @psalm-suppress InvalidArgument */
+ $pElement->getAttributes()[] = (new KeyValue())
+ ->setKey($key)
+ ->setValue(AttributesConverter::convertAnyValue($value));
+ }
+ $pElement->setDroppedAttributesCount($attributes->getDroppedAttributesCount());
+ }
+}