diff options
Diffstat (limited to 'vendor/open-telemetry/api/Behavior')
9 files changed, 308 insertions, 0 deletions
diff --git a/vendor/open-telemetry/api/Behavior/Internal/LogWriter/ErrorLogWriter.php b/vendor/open-telemetry/api/Behavior/Internal/LogWriter/ErrorLogWriter.php new file mode 100644 index 000000000..1b9f785aa --- /dev/null +++ b/vendor/open-telemetry/api/Behavior/Internal/LogWriter/ErrorLogWriter.php @@ -0,0 +1,13 @@ +<?php + +declare(strict_types=1); + +namespace OpenTelemetry\API\Behavior\Internal\LogWriter; + +class ErrorLogWriter implements LogWriterInterface +{ + public function write($level, string $message, array $context): void + { + error_log(Formatter::format($level, $message, $context)); + } +} diff --git a/vendor/open-telemetry/api/Behavior/Internal/LogWriter/Formatter.php b/vendor/open-telemetry/api/Behavior/Internal/LogWriter/Formatter.php new file mode 100644 index 000000000..4cfd6f9d4 --- /dev/null +++ b/vendor/open-telemetry/api/Behavior/Internal/LogWriter/Formatter.php @@ -0,0 +1,37 @@ +<?php + +declare(strict_types=1); + +namespace OpenTelemetry\API\Behavior\Internal\LogWriter; + +class Formatter +{ + public static function format($level, string $message, array $context): string + { + $exception = (array_key_exists('exception', $context) && $context['exception'] instanceof \Throwable) + ? $context['exception'] + : null; + if ($exception) { + $message = sprintf( + 'OpenTelemetry: [%s] %s [exception] %s%s%s', + $level, + $message, + $exception->getMessage(), + PHP_EOL, + $exception->getTraceAsString() + ); + } else { + //get calling location, skipping over trait, formatter etc + $caller = debug_backtrace()[3]; + $message = sprintf( + 'OpenTelemetry: [%s] %s in %s(%s)', + $level, + $message, + $caller['file'], + $caller['line'], + ); + } + + return $message; + } +} diff --git a/vendor/open-telemetry/api/Behavior/Internal/LogWriter/LogWriterInterface.php b/vendor/open-telemetry/api/Behavior/Internal/LogWriter/LogWriterInterface.php new file mode 100644 index 000000000..046d21fc9 --- /dev/null +++ b/vendor/open-telemetry/api/Behavior/Internal/LogWriter/LogWriterInterface.php @@ -0,0 +1,10 @@ +<?php + +declare(strict_types=1); + +namespace OpenTelemetry\API\Behavior\Internal\LogWriter; + +interface LogWriterInterface +{ + public function write($level, string $message, array $context): void; +} diff --git a/vendor/open-telemetry/api/Behavior/Internal/LogWriter/NoopLogWriter.php b/vendor/open-telemetry/api/Behavior/Internal/LogWriter/NoopLogWriter.php new file mode 100644 index 000000000..f7529c082 --- /dev/null +++ b/vendor/open-telemetry/api/Behavior/Internal/LogWriter/NoopLogWriter.php @@ -0,0 +1,13 @@ +<?php + +declare(strict_types=1); + +namespace OpenTelemetry\API\Behavior\Internal\LogWriter; + +class NoopLogWriter implements LogWriterInterface +{ + public function write($level, string $message, array $context): void + { + //do nothing + } +} diff --git a/vendor/open-telemetry/api/Behavior/Internal/LogWriter/Psr3LogWriter.php b/vendor/open-telemetry/api/Behavior/Internal/LogWriter/Psr3LogWriter.php new file mode 100644 index 000000000..5b2d19c15 --- /dev/null +++ b/vendor/open-telemetry/api/Behavior/Internal/LogWriter/Psr3LogWriter.php @@ -0,0 +1,22 @@ +<?php + +declare(strict_types=1); + +namespace OpenTelemetry\API\Behavior\Internal\LogWriter; + +use Psr\Log\LoggerInterface; + +class Psr3LogWriter implements LogWriterInterface +{ + private LoggerInterface $logger; + + public function __construct(LoggerInterface $logger) + { + $this->logger = $logger; + } + + public function write($level, string $message, array $context): void + { + $this->logger->log($level, $message, $context); + } +} diff --git a/vendor/open-telemetry/api/Behavior/Internal/LogWriter/StreamLogWriter.php b/vendor/open-telemetry/api/Behavior/Internal/LogWriter/StreamLogWriter.php new file mode 100644 index 000000000..f65f1e856 --- /dev/null +++ b/vendor/open-telemetry/api/Behavior/Internal/LogWriter/StreamLogWriter.php @@ -0,0 +1,25 @@ +<?php + +declare(strict_types=1); + +namespace OpenTelemetry\API\Behavior\Internal\LogWriter; + +class StreamLogWriter implements LogWriterInterface +{ + private $stream; + + public function __construct(string $destination) + { + $stream = fopen($destination, 'a'); + if ($stream) { + $this->stream = $stream; + } else { + throw new \RuntimeException(sprintf('Unable to open %s for writing', $destination)); + } + } + + public function write($level, string $message, array $context): void + { + fwrite($this->stream, Formatter::format($level, $message, $context)); + } +} diff --git a/vendor/open-telemetry/api/Behavior/Internal/LogWriterFactory.php b/vendor/open-telemetry/api/Behavior/Internal/LogWriterFactory.php new file mode 100644 index 000000000..07c48cea5 --- /dev/null +++ b/vendor/open-telemetry/api/Behavior/Internal/LogWriterFactory.php @@ -0,0 +1,48 @@ +<?php + +declare(strict_types=1); + +namespace OpenTelemetry\API\Behavior\Internal; + +use OpenTelemetry\API\Behavior\Internal\LogWriter\ErrorLogWriter; +use OpenTelemetry\API\Behavior\Internal\LogWriter\LogWriterInterface; +use OpenTelemetry\API\Behavior\Internal\LogWriter\NoopLogWriter; +use OpenTelemetry\API\Behavior\Internal\LogWriter\Psr3LogWriter; +use OpenTelemetry\API\Behavior\Internal\LogWriter\StreamLogWriter; +use OpenTelemetry\API\Instrumentation\ConfigurationResolver; +use OpenTelemetry\API\LoggerHolder; + +class LogWriterFactory +{ + private const OTEL_PHP_LOG_DESTINATION = 'OTEL_PHP_LOG_DESTINATION'; + + public function create(): LogWriterInterface + { + $dest = (new ConfigurationResolver())->getString(self::OTEL_PHP_LOG_DESTINATION); + $logger = LoggerHolder::get(); + + switch ($dest) { + case 'none': + return new NoopLogWriter(); + case 'stderr': + return new StreamLogWriter('php://stderr'); + case 'stdout': + return new StreamLogWriter('php://stdout'); + case 'psr3': + if ($logger) { + return new Psr3LogWriter($logger); + } + error_log('OpenTelemetry: cannot use OTEL_PHP_LOG_DESTINATION=psr3 without providing a PSR-3 logger'); + //default to error log + return new ErrorLogWriter(); + case 'error_log': + return new ErrorLogWriter(); + default: + if ($logger) { + return new Psr3LogWriter($logger); + } + + return new ErrorLogWriter(); + } + } +} diff --git a/vendor/open-telemetry/api/Behavior/Internal/Logging.php b/vendor/open-telemetry/api/Behavior/Internal/Logging.php new file mode 100644 index 000000000..e5bec7ab5 --- /dev/null +++ b/vendor/open-telemetry/api/Behavior/Internal/Logging.php @@ -0,0 +1,90 @@ +<?php + +declare(strict_types=1); + +namespace OpenTelemetry\API\Behavior\Internal; + +use OpenTelemetry\API\Behavior\Internal\LogWriter\LogWriterInterface; +use Psr\Log\LogLevel; + +/** + * Logging utility functions for internal logging (of OpenTelemetry errors/warnings etc). + * This is not part of SDK configuration to avoid creating a dependency on SDK from any package which does logging. + * @todo this should be `@internal`, but deptrac is not happy with that. + */ +class Logging +{ + private const OTEL_LOG_LEVEL = 'OTEL_LOG_LEVEL'; + private const DEFAULT_LEVEL = LogLevel::INFO; + private const NONE = 'none'; + private const LEVELS = [ + LogLevel::DEBUG, + LogLevel::INFO, + LogLevel::NOTICE, + LogLevel::WARNING, + LogLevel::ERROR, + LogLevel::CRITICAL, + LogLevel::ALERT, + LogLevel::EMERGENCY, + self::NONE, //highest priority so that nothing is logged + ]; + + /** + * The minimum log level. Messages with lower severity than this will be ignored. + */ + private static ?int $logLevel = null; + private static ?LogWriterInterface $writer = null; + + public static function setLogWriter(LogWriterInterface $writer): void + { + self::$writer = $writer; + } + + public static function logWriter(): LogWriterInterface + { + self::$writer ??= (new LogWriterFactory())->create(); + + return self::$writer; + } + + /** + * Get level priority from level name + */ + public static function level(string $level): int + { + $value = array_search($level, self::LEVELS); + + return $value ?: 1; //'info' + } + + /** + * Get defined OTEL_LOG_LEVEL, or default + */ + public static function logLevel(): int + { + self::$logLevel ??= self::getLogLevel(); + + return self::$logLevel; + } + + private static function getLogLevel(): int + { + $level = array_key_exists(self::OTEL_LOG_LEVEL, $_SERVER) + ? $_SERVER[self::OTEL_LOG_LEVEL] + : getenv(self::OTEL_LOG_LEVEL); + if (!$level) { + $level = ini_get(self::OTEL_LOG_LEVEL); + } + if (!$level) { + $level = self::DEFAULT_LEVEL; + } + + return self::level($level); + } + + public static function reset(): void + { + self::$logLevel = null; + self::$writer = null; + } +} diff --git a/vendor/open-telemetry/api/Behavior/LogsMessagesTrait.php b/vendor/open-telemetry/api/Behavior/LogsMessagesTrait.php new file mode 100644 index 000000000..d0207e4b1 --- /dev/null +++ b/vendor/open-telemetry/api/Behavior/LogsMessagesTrait.php @@ -0,0 +1,50 @@ +<?php + +declare(strict_types=1); + +namespace OpenTelemetry\API\Behavior; + +use OpenTelemetry\API\Behavior\Internal\Logging; +use Psr\Log\LogLevel; + +trait LogsMessagesTrait +{ + private static function shouldLog(string $level): bool + { + return Logging::level($level) >= Logging::logLevel(); + } + + private static function doLog(string $level, string $message, array $context): void + { + $writer = Logging::logWriter(); + if (self::shouldLog($level)) { + $context['source'] = get_called_class(); + $writer->write($level, $message, $context); + } + } + + protected static function logDebug(string $message, array $context = []): void + { + self::doLog(LogLevel::DEBUG, $message, $context); + } + + protected static function logInfo(string $message, array $context = []): void + { + self::doLog(LogLevel::INFO, $message, $context); + } + + protected static function logNotice(string $message, array $context = []): void + { + self::doLog(LogLevel::NOTICE, $message, $context); + } + + protected static function logWarning(string $message, array $context = []): void + { + self::doLog(LogLevel::WARNING, $message, $context); + } + + protected static function logError(string $message, array $context = []): void + { + self::doLog(LogLevel::ERROR, $message, $context); + } +} |