aboutsummaryrefslogtreecommitdiff
path: root/vendor/open-telemetry/api/Trace/TraceState.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/open-telemetry/api/Trace/TraceState.php')
-rw-r--r--vendor/open-telemetry/api/Trace/TraceState.php190
1 files changed, 0 insertions, 190 deletions
diff --git a/vendor/open-telemetry/api/Trace/TraceState.php b/vendor/open-telemetry/api/Trace/TraceState.php
deleted file mode 100644
index 306a63322..000000000
--- a/vendor/open-telemetry/api/Trace/TraceState.php
+++ /dev/null
@@ -1,190 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace OpenTelemetry\API\Trace;
-
-use function array_reverse;
-use OpenTelemetry\API\Behavior\LogsMessagesTrait;
-use function strlen;
-
-class TraceState implements TraceStateInterface
-{
- use LogsMessagesTrait;
-
- public const MAX_LIST_MEMBERS = 32; //@see https://www.w3.org/TR/trace-context/#tracestate-header-field-values
- public const MAX_COMBINED_LENGTH = 512; //@see https://www.w3.org/TR/trace-context/#tracestate-limits
- public const LIST_MEMBERS_SEPARATOR = ',';
- public const LIST_MEMBER_KEY_VALUE_SPLITTER = '=';
- private const VALID_KEY_CHAR_RANGE = '[_0-9a-z-*\/]';
- private const VALID_KEY = '[a-z]' . self::VALID_KEY_CHAR_RANGE . '{0,255}';
- private const VALID_VENDOR_KEY = '[a-z0-9]' . self::VALID_KEY_CHAR_RANGE . '{0,240}@[a-z]' . self::VALID_KEY_CHAR_RANGE . '{0,13}';
- private const VALID_KEY_REGEX = '/^(?:' . self::VALID_KEY . '|' . self::VALID_VENDOR_KEY . ')$/';
- private const VALID_VALUE_BASE_REGEX = '/^[ -~]{0,255}[!-~]$/';
- private const INVALID_VALUE_COMMA_EQUAL_REGEX = '/,|=/';
-
- /**
- * @var string[]
- */
- private array $traceState = [];
-
- public function __construct(string $rawTracestate = null)
- {
- if ($rawTracestate === null || trim($rawTracestate) === '') {
- return;
- }
- $this->traceState = $this->parse($rawTracestate);
- }
-
- /**
- * {@inheritdoc}
- */
- public function with(string $key, string $value): TraceStateInterface
- {
- $clonedTracestate = clone $this;
-
- if ($this->validateKey($key) && $this->validateValue($value)) {
-
- /*
- * Only one entry per key is allowed. In this case we need to overwrite the vendor entry
- * upon reentry to the tracing system and ensure the updated entry is at the beginning of
- * the list. This means we place it the back for now and it will be at the beginning once
- * we reverse the order back during __toString().
- */
- if (array_key_exists($key, $clonedTracestate->traceState)) {
- unset($clonedTracestate->traceState[$key]);
- }
-
- // Add new or updated entry to the back of the list.
- $clonedTracestate->traceState[$key] = $value;
- } else {
- self::logWarning('Invalid tracetrace key/value for: ' . $key);
- }
-
- return $clonedTracestate;
- }
-
- /**
- * {@inheritdoc}
- */
- public function without(string $key): TraceStateInterface
- {
- $clonedTracestate = clone $this;
-
- if ($key !== '') {
- unset($clonedTracestate->traceState[$key]);
- }
-
- return $clonedTracestate;
- }
-
- /**
- * {@inheritdoc}
- */
- public function get(string $key): ?string
- {
- return $this->traceState[$key] ?? null;
- }
-
- /**
- * {@inheritdoc}
- */
- public function getListMemberCount(): int
- {
- return count($this->traceState);
- }
-
- /**
- * {@inheritdoc}
- */
- public function __toString(): string
- {
- if ($this->traceState === []) {
- return '';
- }
- $traceStateString='';
- foreach (array_reverse($this->traceState) as $k => $v) {
- $traceStateString .=$k . self::LIST_MEMBER_KEY_VALUE_SPLITTER . $v . self::LIST_MEMBERS_SEPARATOR;
- }
-
- return rtrim($traceStateString, ',');
- }
-
- /**
- * Parse the raw tracestate header into the TraceState object. Since new or updated entries must
- * be added to the beginning of the list, the key-value pairs in the TraceState object will be
- * stored in reverse order. This ensures new entries added to the TraceState object are at the
- * beginning when we reverse the order back again while building the final tracestate header.
- *
- * Ex:
- * tracestate = 'vendor1=value1,vendor2=value2'
- *
- * ||
- * \/
- *
- * $this->tracestate = ['vendor2' => 'value2' ,'vendor1' => 'value1']
- *
- */
- private function parse(string $rawTracestate): array
- {
- if (strlen($rawTracestate) > self::MAX_COMBINED_LENGTH) {
- self::logWarning('tracestate discarded, exceeds max combined length: ' . self::MAX_COMBINED_LENGTH);
-
- return [];
- }
- $parsedTracestate = [];
- $listMembers = explode(self::LIST_MEMBERS_SEPARATOR, $rawTracestate);
-
- if (count($listMembers) > self::MAX_LIST_MEMBERS) {
- self::logWarning('tracestate discarded, too many members');
-
- return [];
- }
-
- foreach ($listMembers as $listMember) {
- $vendor = explode(self::LIST_MEMBER_KEY_VALUE_SPLITTER, trim($listMember));
-
- // There should only be one list-member per vendor separated by '='
- if (count($vendor) !== 2 || !$this->validateKey($vendor[0]) || !$this->validateValue($vendor[1])) {
- self::logWarning('tracestate discarded, invalid member: ' . $listMember);
-
- return [];
- }
- $parsedTracestate[$vendor[0]] = $vendor[1];
- }
-
- /*
- * Reversing the tracestate ensures the new entries added to the TraceState object are at
- * the beginning when we reverse it back during __toString().
- */
- return array_reverse($parsedTracestate);
- }
-
- /**
- * The Key is opaque string that is an identifier for a vendor. It can be up
- * to 256 characters and MUST begin with a lowercase letter or a digit, and can
- * only contain lowercase letters (a-z), digits (0-9), underscores (_), dashes (-),
- * asterisks (*), and forward slashes (/). For multi-tenant vendor scenarios, an at
- * sign (@) can be used to prefix the vendor name. Vendors SHOULD set the tenant ID
- * at the beginning of the key.
- *
- * @see https://www.w3.org/TR/trace-context/#key
- */
- private function validateKey(string $key): bool
- {
- return preg_match(self::VALID_KEY_REGEX, $key) !== 0;
- }
-
- /**
- * The value is an opaque string containing up to 256 printable ASCII [RFC0020]
- * characters (i.e., the range 0x20 to 0x7E) except comma (,) and (=). Note that
- * this also excludes tabs, newlines, carriage returns, etc.
- *
- * @see https://www.w3.org/TR/trace-context/#value
- */
- private function validateValue(string $key): bool
- {
- return (preg_match(self::VALID_VALUE_BASE_REGEX, $key) !== 0)
- && (preg_match(self::INVALID_VALUE_COMMA_EQUAL_REGEX, $key) === 0);
- }
-}