From c46b009878713396643147c75dafe25084d6bf0a Mon Sep 17 00:00:00 2001 From: Brett McBride Date: Fri, 26 Apr 2024 15:37:08 +1000 Subject: [PATCH 01/12] implement events v1.32 implement the events api + sdk per spec v1.32: - event logger is now only retrievable via an event logger provider - domain attribute for events is removed - events accept a subset of logrecord params, rather than an entire logrecord --- examples/autoload_sdk.php | 4 +- examples/load_config.php | 12 ++--- examples/load_config_env.php | 8 +-- examples/logs/exporters/otlp_grpc.php | 20 ++++--- examples/logs/exporters/otlp_http.php | 18 +++---- examples/logs/features/batch_exporting.php | 18 +++---- examples/logs/features/event-logger.php | 20 +++++++ examples/logs/getting_started.php | 12 +++-- examples/logs/logger_builder.php | 8 +-- src/API/Globals.php | 12 ++++- src/API/Instrumentation/Configurator.php | 17 +++++- src/API/Instrumentation/ContextKeys.php | 11 ++++ src/API/Logs/EventLogger.php | 23 -------- src/API/Logs/EventLoggerInterface.php | 14 +++++ src/API/Logs/EventLoggerProviderInterface.php | 20 +++++++ src/API/Logs/LoggerInterface.php | 4 ++ src/API/Logs/NoopEventLogger.php | 29 ++++++++++ src/API/Logs/NoopEventLoggerProvider.php | 29 ++++++++++ src/API/Logs/Severity.php | 33 ++++++++++++ .../ComponentProvider/OpenTelemetrySdk.php | 3 ++ src/SDK/Logs/EventLogger.php | 53 +++++++++++++++++++ src/SDK/Logs/EventLoggerProvider.php | 21 ++++++++ src/SDK/Logs/EventLoggerProviderFactory.php | 21 ++++++++ src/SDK/Sdk.php | 7 +++ src/SDK/SdkAutoloader.php | 3 ++ src/SDK/SdkBuilder.php | 13 +++++ tests/Unit/API/Logs/EventLoggerTest.php | 28 ---------- .../Logs/EventLoggerProviderFactoryTest.php | 53 +++++++++++++++++++ .../Unit/SDK/Logs/EventLoggerProviderTest.php | 26 +++++++++ tests/Unit/SDK/Logs/EventLoggerTest.php | 41 ++++++++++++++ tests/Unit/SDK/SdkAutoloaderTest.php | 2 + tests/Unit/SDK/SdkTest.php | 5 +- tests/coverage/html/.gitkeep | 0 33 files changed, 481 insertions(+), 107 deletions(-) create mode 100644 examples/logs/features/event-logger.php delete mode 100644 src/API/Logs/EventLogger.php create mode 100644 src/API/Logs/EventLoggerProviderInterface.php create mode 100644 src/API/Logs/NoopEventLogger.php create mode 100644 src/API/Logs/NoopEventLoggerProvider.php create mode 100644 src/API/Logs/Severity.php create mode 100644 src/SDK/Logs/EventLogger.php create mode 100644 src/SDK/Logs/EventLoggerProvider.php create mode 100644 src/SDK/Logs/EventLoggerProviderFactory.php delete mode 100644 tests/Unit/API/Logs/EventLoggerTest.php create mode 100644 tests/Unit/SDK/Logs/EventLoggerProviderFactoryTest.php create mode 100644 tests/Unit/SDK/Logs/EventLoggerProviderTest.php create mode 100644 tests/Unit/SDK/Logs/EventLoggerTest.php delete mode 100644 tests/coverage/html/.gitkeep diff --git a/examples/autoload_sdk.php b/examples/autoload_sdk.php index dd5091359..671b07190 100644 --- a/examples/autoload_sdk.php +++ b/examples/autoload_sdk.php @@ -4,8 +4,8 @@ namespace OpenTelemetry\Example; -use OpenTelemetry\API\Logs\EventLogger; use OpenTelemetry\API\Logs\LogRecord; +use OpenTelemetry\SDK\Logs\EventLogger; putenv('OTEL_PHP_AUTOLOAD_ENABLED=true'); putenv('OTEL_TRACES_EXPORTER=otlp'); @@ -25,7 +25,7 @@ $instrumentation->tracer()->spanBuilder('root')->startSpan()->end(); $instrumentation->meter()->createCounter('cnt')->add(1); -$eventLogger = new EventLogger($instrumentation->logger(), 'my-domain'); +$eventLogger = new EventLogger($instrumentation->logger()); $eventLogger->logEvent('foo', new LogRecord('hello, otel')); echo 'Finished!' . PHP_EOL; diff --git a/examples/load_config.php b/examples/load_config.php index 591f3f583..874159bc3 100644 --- a/examples/load_config.php +++ b/examples/load_config.php @@ -2,8 +2,6 @@ declare(strict_types=1); -use OpenTelemetry\API\Logs\EventLogger; -use OpenTelemetry\API\Logs\LogRecord; use OpenTelemetry\Config\SDK\Configuration; require __DIR__ . '/../vendor/autoload.php'; @@ -18,12 +16,14 @@ $tracer = $sdk->getTracerProvider()->getTracer('demo'); $meter = $sdk->getMeterProvider()->getMeter('demo'); -$logger = $sdk->getLoggerProvider()->getLogger('demo'); +$eventLogger = $sdk->getEventLoggerProvider()->getEventLogger('demo'); -$tracer->spanBuilder('root')->startSpan()->end(); +$span = $tracer->spanBuilder('root')->startSpan(); +$scope = $span->activate(); $meter->createCounter('cnt')->add(1); -$eventLogger = new EventLogger($logger, 'my-domain'); -$eventLogger->logEvent('foo', new LogRecord('hello, otel')); +$eventLogger->emit('foo', 'hello, otel'); +$scope->detach(); +$span->end(); echo 'Finished!' . PHP_EOL; diff --git a/examples/load_config_env.php b/examples/load_config_env.php index 6fa447949..1c90d2683 100644 --- a/examples/load_config_env.php +++ b/examples/load_config_env.php @@ -2,8 +2,6 @@ declare(strict_types=1); -use OpenTelemetry\API\Logs\EventLogger; -use OpenTelemetry\API\Logs\LogRecord; use OpenTelemetry\Config\SDK\Configuration; require __DIR__ . '/../vendor/autoload.php'; @@ -23,12 +21,10 @@ $tracer = $sdk->getTracerProvider()->getTracer('demo'); $meter = $sdk->getMeterProvider()->getMeter('demo'); -$logger = $sdk->getLoggerProvider()->getLogger('demo'); +$eventLogger = $sdk->getEventLoggerProvider()->getEventLogger('demo'); $tracer->spanBuilder('root')->startSpan()->end(); $meter->createCounter('cnt')->add(1); - -$eventLogger = new EventLogger($logger, 'my-domain'); -$eventLogger->logEvent('foo', new LogRecord('hello, otel')); +$eventLogger->emit('foo', 'hello, otel'); echo 'Finished!' . PHP_EOL; diff --git a/examples/logs/exporters/otlp_grpc.php b/examples/logs/exporters/otlp_grpc.php index d084ac372..af53353e2 100644 --- a/examples/logs/exporters/otlp_grpc.php +++ b/examples/logs/exporters/otlp_grpc.php @@ -4,15 +4,14 @@ namespace OpenTelemetry\Example; -use OpenTelemetry\API\Logs\EventLogger; -use OpenTelemetry\API\Logs\LogRecord; +use OpenTelemetry\API\Logs\Severity; use OpenTelemetry\API\Signals; use OpenTelemetry\Contrib\Grpc\GrpcTransportFactory; use OpenTelemetry\Contrib\Otlp\LogsExporter; use OpenTelemetry\Contrib\Otlp\OtlpUtil; -use Opentelemetry\Proto\Logs\V1\SeverityNumber; use OpenTelemetry\SDK\Common\Instrumentation\InstrumentationScopeFactory; use OpenTelemetry\SDK\Common\Time\ClockFactory; +use OpenTelemetry\SDK\Logs\EventLogger; use OpenTelemetry\SDK\Logs\LoggerProvider; use OpenTelemetry\SDK\Logs\LogRecordLimitsBuilder; use OpenTelemetry\SDK\Logs\Processor\BatchLogRecordProcessor; @@ -31,18 +30,17 @@ ) ); $logger = $loggerProvider->getLogger('demo', '1.0', 'http://schema.url', ['foo' => 'bar']); -$eventLogger = new EventLogger($logger, 'my-domain'); +$eventLogger = new EventLogger($logger); -$eventLogger->logEvent( - 'foo', - (new LogRecord(['foo' => 'bar', 'baz' => 'bat', 'msg' => 'hello world'])) - ->setSeverityText('INFO') - ->setSeverityNumber(SeverityNumber::SEVERITY_NUMBER_INFO) +$eventLogger->emit( + name: 'foo', + payload: ['foo' => 'bar', 'baz' => 'bat', 'msg' => 'hello world'], + severityNumber: Severity::INFO ); -$eventLogger->logEvent( +$eventLogger->emit( 'foo', - new LogRecord('otel is great') + 'otel is great' ); $loggerProvider->shutdown(); diff --git a/examples/logs/exporters/otlp_http.php b/examples/logs/exporters/otlp_http.php index 42f41040c..59f3709a1 100644 --- a/examples/logs/exporters/otlp_http.php +++ b/examples/logs/exporters/otlp_http.php @@ -4,12 +4,12 @@ namespace OpenTelemetry\Example; -use OpenTelemetry\API\Logs\EventLogger; use OpenTelemetry\API\Logs\LogRecord; +use OpenTelemetry\API\Logs\Severity; use OpenTelemetry\Contrib\Otlp\LogsExporter; use OpenTelemetry\Contrib\Otlp\OtlpHttpTransportFactory; -use Opentelemetry\Proto\Logs\V1\SeverityNumber; use OpenTelemetry\SDK\Common\Instrumentation\InstrumentationScopeFactory; +use OpenTelemetry\SDK\Logs\EventLogger; use OpenTelemetry\SDK\Logs\LoggerProvider; use OpenTelemetry\SDK\Logs\LogRecordLimitsBuilder; use OpenTelemetry\SDK\Logs\Processor\SimpleLogRecordProcessor; @@ -28,11 +28,11 @@ ) ); $logger = $loggerProvider->getLogger('demo', '1.0', 'https://opentelemetry.io/schemas/1.7.1', ['foo' => 'bar']); -$eventLogger = new EventLogger($logger, 'my-domain'); +$eventLogger = new EventLogger($logger); -$record = (new LogRecord(['foo' => 'bar', 'baz' => 'bat', 'msg' => 'hello world'])) - ->setSeverityText('INFO') - ->setTimestamp((new \DateTime())->getTimestamp() * LogRecord::NANOS_PER_SECOND) - ->setSeverityNumber(SeverityNumber::SEVERITY_NUMBER_INFO); - -$eventLogger->logEvent('foo', $record); +$eventLogger->emit( + name: 'foo', + payload: ['foo' => 'bar', 'baz' => 'bat', 'msg' => 'hello world'], + timestamp: (new \DateTime())->getTimestamp() * LogRecord::NANOS_PER_SECOND, + severityNumber: Severity::INFO, +); diff --git a/examples/logs/features/batch_exporting.php b/examples/logs/features/batch_exporting.php index 80befaf47..04895c464 100644 --- a/examples/logs/features/batch_exporting.php +++ b/examples/logs/features/batch_exporting.php @@ -4,11 +4,11 @@ namespace OpenTelemetry\Example; -use OpenTelemetry\API\Logs\EventLogger; -use OpenTelemetry\API\Logs\LogRecord; +use OpenTelemetry\API\Logs\Severity; use OpenTelemetry\SDK\Common\Attribute\Attributes; use OpenTelemetry\SDK\Common\Instrumentation\InstrumentationScopeFactory; use OpenTelemetry\SDK\Common\Time\ClockFactory; +use OpenTelemetry\SDK\Logs\EventLogger; use OpenTelemetry\SDK\Logs\Exporter\ConsoleExporterFactory; use OpenTelemetry\SDK\Logs\LoggerProvider; use OpenTelemetry\SDK\Logs\Processor\BatchLogRecordProcessor; @@ -25,16 +25,14 @@ //get a logger, and emit a log record from an EventLogger. $loggerOne = $loggerProvider->getLogger('demo', '1.0'); $loggerTwo = $loggerProvider->getLogger('demo', '2.0'); -$eventLoggerOne = new EventLogger($loggerOne, 'my-domain'); -$eventLoggerTwo = new EventLogger($loggerTwo, 'my-domain'); +$eventLoggerOne = new EventLogger($loggerOne); +$eventLoggerTwo = new EventLogger($loggerTwo); -$record = (new LogRecord(['foo' => 'bar', 'baz' => 'bat', 'msg' => 'hello world'])) - ->setSeverityText('INFO') - ->setSeverityNumber(9); +$payload = ['foo' => 'bar', 'baz' => 'bat', 'msg' => 'hello world']; -$eventLoggerOne->logEvent('foo', $record); -$eventLoggerOne->logEvent('bar', (new LogRecord('hello world'))); -$eventLoggerTwo->logEvent('foo', $record); +$eventLoggerOne->emit(name: 'foo', payload: $payload, severityNumber: Severity::INFO); +$eventLoggerOne->emit('bar', 'hello world'); +$eventLoggerTwo->emit(name: 'foo', payload: $payload, severityNumber: Severity::INFO); //shut down logger provider $loggerProvider->shutdown(); diff --git a/examples/logs/features/event-logger.php b/examples/logs/features/event-logger.php new file mode 100644 index 000000000..f822ae555 --- /dev/null +++ b/examples/logs/features/event-logger.php @@ -0,0 +1,20 @@ +create((new LoggerProviderFactory())->create()); +$eventLogger = $provider->getEventLogger('my-event-logger', '1.0', 'https://example.com/events'); + +$payload = ['foo' => 'bar', 'baz' => 'bat', 'msg' => 'hello world']; +$eventLogger->emit(name: 'my-event', payload: $payload, severityNumber: Severity::DEBUG); diff --git a/examples/logs/getting_started.php b/examples/logs/getting_started.php index b6033a502..df8af426c 100644 --- a/examples/logs/getting_started.php +++ b/examples/logs/getting_started.php @@ -2,10 +2,12 @@ declare(strict_types=1); -use OpenTelemetry\API\Logs\EventLogger; use OpenTelemetry\API\Logs\LogRecord; +use OpenTelemetry\API\Logs\Severity; use OpenTelemetry\SDK\Common\Attribute\Attributes; use OpenTelemetry\SDK\Common\Instrumentation\InstrumentationScopeFactory; +use OpenTelemetry\SDK\Logs\EventLogger; +use OpenTelemetry\SDK\Logs\EventLoggerProvider; use OpenTelemetry\SDK\Logs\Exporter\ConsoleExporterFactory; use OpenTelemetry\SDK\Logs\LoggerProvider; use OpenTelemetry\SDK\Logs\Processor\SimpleLogRecordProcessor; @@ -26,6 +28,7 @@ ), new InstrumentationScopeFactory(Attributes::factory()) ); +$eventLoggerProvider = new EventLoggerProvider($loggerProvider); $tracerProvider = new TracerProvider(); $tracer = $tracerProvider->getTracer('demo-tracer'); @@ -37,14 +40,13 @@ //get a logger, and emit a log record from an EventLogger. The active context (trace id + span id) will be //attached to the log record -$logger = $loggerProvider->getLogger('demo', '1.0', 'http://schema.url', ['foo' => 'bar']); -$eventLogger = new EventLogger($logger, 'my-domain'); - +$eventLogger = $eventLoggerProvider->getEventLogger('demo', '1.0', 'http://schema.url', ['foo' => 'bar']); +$payload = ['foo' => 'bar', 'baz' => 'bat', 'msg' => 'hello world']; $record = (new LogRecord(['foo' => 'bar', 'baz' => 'bat', 'msg' => 'hello world'])) ->setSeverityText('INFO') ->setSeverityNumber(9); -$eventLogger->logEvent('foo', $record); +$eventLogger->emit(name: 'foo', payload: $record, severityNumber: Severity::INFO); //end span $span->end(); diff --git a/examples/logs/logger_builder.php b/examples/logs/logger_builder.php index 6b0b0cfaa..0c368e35e 100644 --- a/examples/logs/logger_builder.php +++ b/examples/logs/logger_builder.php @@ -2,7 +2,6 @@ declare(strict_types=1); -use OpenTelemetry\API\Logs\EventLogger; use OpenTelemetry\API\Logs\LogRecord; use OpenTelemetry\SDK\Common\Attribute\Attributes; use OpenTelemetry\SDK\Logs\Exporter\ConsoleExporterFactory; @@ -22,11 +21,14 @@ ->build(); $logger = $loggerProvider->getLogger('demo', '1.0', 'http://schema.url', ['foo' => 'bar']); -$eventLogger = new EventLogger($logger, 'my-domain'); $record = (new LogRecord(['foo' => 'bar', 'baz' => 'bat', 'msg' => 'hello world'])) ->setSeverityText('INFO') ->setSeverityNumber(9); -$eventLogger->logEvent('foo', $record); +/** + * Note that Loggers should only be used directly by a log appender. + * @see https://github.com/open-telemetry/opentelemetry-specification/blob/v1.32.0/specification/logs/bridge-api.md#logs-bridge-api + */ +$logger->emit($record); $loggerProvider->shutdown(); diff --git a/src/API/Globals.php b/src/API/Globals.php index 51fe8edbf..7d296f4fc 100644 --- a/src/API/Globals.php +++ b/src/API/Globals.php @@ -9,6 +9,7 @@ use const E_USER_WARNING; use OpenTelemetry\API\Instrumentation\Configurator; use OpenTelemetry\API\Instrumentation\ContextKeys; +use OpenTelemetry\API\Logs\EventLoggerProviderInterface; use OpenTelemetry\API\Logs\LoggerProviderInterface; use OpenTelemetry\API\Metrics\MeterProviderInterface; use OpenTelemetry\API\Trace\TracerProviderInterface; @@ -31,6 +32,7 @@ public function __construct( private readonly TracerProviderInterface $tracerProvider, private readonly MeterProviderInterface $meterProvider, private readonly LoggerProviderInterface $loggerProvider, + private readonly EventLoggerProviderInterface $eventLoggerProvider, private readonly TextMapPropagatorInterface $propagator, ) { } @@ -55,6 +57,11 @@ public static function loggerProvider(): LoggerProviderInterface return Context::getCurrent()->get(ContextKeys::loggerProvider()) ?? self::globals()->loggerProvider; } + public static function eventLoggerProvider(): EventLoggerProviderInterface + { + return Context::getCurrent()->get(ContextKeys::eventLoggerProvider()) ?? self::globals()->eventLoggerProvider; + } + /** * @param Closure(Configurator): Configurator $initializer * @@ -95,10 +102,11 @@ private static function globals(): self $meterProvider = $context->get(ContextKeys::meterProvider()); $propagator = $context->get(ContextKeys::propagator()); $loggerProvider = $context->get(ContextKeys::loggerProvider()); + $eventLoggerProvider = $context->get(ContextKeys::eventLoggerProvider()); - assert(isset($tracerProvider, $meterProvider, $loggerProvider, $propagator)); + assert(isset($tracerProvider, $meterProvider, $loggerProvider, $eventLoggerProvider, $propagator)); - return self::$globals = new self($tracerProvider, $meterProvider, $loggerProvider, $propagator); + return self::$globals = new self($tracerProvider, $meterProvider, $loggerProvider, $eventLoggerProvider, $propagator); } /** diff --git a/src/API/Instrumentation/Configurator.php b/src/API/Instrumentation/Configurator.php index 71d301363..638393a7e 100644 --- a/src/API/Instrumentation/Configurator.php +++ b/src/API/Instrumentation/Configurator.php @@ -4,7 +4,9 @@ namespace OpenTelemetry\API\Instrumentation; +use OpenTelemetry\API\Logs\EventLoggerProviderInterface; use OpenTelemetry\API\Logs\LoggerProviderInterface; +use OpenTelemetry\API\Logs\NoopEventLoggerProvider; use OpenTelemetry\API\Logs\NoopLoggerProvider; use OpenTelemetry\API\Metrics\MeterProviderInterface; use OpenTelemetry\API\Metrics\Noop\NoopMeterProvider; @@ -28,6 +30,7 @@ final class Configurator implements ImplicitContextKeyedInterface private ?MeterProviderInterface $meterProvider = null; private ?TextMapPropagatorInterface $propagator = null; private ?LoggerProviderInterface $loggerProvider = null; + private ?EventLoggerProviderInterface $eventLoggerProvider = null; private function __construct() { @@ -50,7 +53,8 @@ public static function createNoop(): Configurator ->withTracerProvider(new NoopTracerProvider()) ->withMeterProvider(new NoopMeterProvider()) ->withPropagator(new NoopTextMapPropagator()) - ->withLoggerProvider(new NoopLoggerProvider()) + ->withLoggerProvider(NoopLoggerProvider::getInstance()) + ->withEventLoggerProvider(new NoopEventLoggerProvider(NoopLoggerProvider::getInstance())) ; } @@ -75,6 +79,9 @@ public function storeInContext(?ContextInterface $context = null): ContextInterf if ($this->loggerProvider !== null) { $context = $context->with(ContextKeys::loggerProvider(), $this->loggerProvider); } + if ($this->eventLoggerProvider !== null) { + $context = $context->with(ContextKeys::eventLoggerProvider(), $this->eventLoggerProvider); + } return $context; } @@ -110,4 +117,12 @@ public function withLoggerProvider(?LoggerProviderInterface $loggerProvider): Co return $self; } + + public function withEventLoggerProvider(?EventLoggerProviderInterface $eventLoggerProvider): Configurator + { + $self = clone $this; + $self->eventLoggerProvider = $eventLoggerProvider; + + return $self; + } } diff --git a/src/API/Instrumentation/ContextKeys.php b/src/API/Instrumentation/ContextKeys.php index ea1a66416..9f53e5b86 100644 --- a/src/API/Instrumentation/ContextKeys.php +++ b/src/API/Instrumentation/ContextKeys.php @@ -4,6 +4,7 @@ namespace OpenTelemetry\API\Instrumentation; +use OpenTelemetry\API\Logs\EventLoggerProviderInterface; use OpenTelemetry\API\Logs\LoggerProviderInterface; use OpenTelemetry\API\Metrics\MeterProviderInterface; use OpenTelemetry\API\Trace\TracerProviderInterface; @@ -55,4 +56,14 @@ public static function loggerProvider(): ContextKeyInterface return $instance ??= Context::createKey(LoggerProviderInterface::class); } + + /** + * @return ContextKeyInterface + */ + public static function eventLoggerProvider(): ContextKeyInterface + { + static $instance; + + return $instance ??= Context::createKey(EventLoggerProviderInterface::class); + } } diff --git a/src/API/Logs/EventLogger.php b/src/API/Logs/EventLogger.php deleted file mode 100644 index abbe54b97..000000000 --- a/src/API/Logs/EventLogger.php +++ /dev/null @@ -1,23 +0,0 @@ -setAttributes([ - 'event.name' => $eventName, - 'event.domain' => $this->domain, - ]); - $this->logger->emit($logRecord); - } -} diff --git a/src/API/Logs/EventLoggerInterface.php b/src/API/Logs/EventLoggerInterface.php index a2096b9b7..45aa59971 100644 --- a/src/API/Logs/EventLoggerInterface.php +++ b/src/API/Logs/EventLoggerInterface.php @@ -4,10 +4,24 @@ namespace OpenTelemetry\API\Logs; +use OpenTelemetry\Context\ContextInterface; + /** * @see https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/logs/event-api.md#events-api-interface */ interface EventLoggerInterface { + public function emit( + string $name, + mixed $payload = null, + ?int $timestamp = null, + ?ContextInterface $context = null, + ?int $severityNumber = null, + ?array $attributes = [], + ): void; + + /** + * @deprecated Use `emit` + */ public function logEvent(string $eventName, LogRecord $logRecord): void; } diff --git a/src/API/Logs/EventLoggerProviderInterface.php b/src/API/Logs/EventLoggerProviderInterface.php new file mode 100644 index 000000000..e321a7f8e --- /dev/null +++ b/src/API/Logs/EventLoggerProviderInterface.php @@ -0,0 +1,20 @@ + $sdkBuilder->setTracerProvider($tracerProvider); $sdkBuilder->setMeterProvider($meterProvider); $sdkBuilder->setLoggerProvider($loggerProvider); + $sdkBuilder->setEventLoggerProvider($eventLoggerProvider); return $sdkBuilder; } diff --git a/src/SDK/Logs/EventLogger.php b/src/SDK/Logs/EventLogger.php new file mode 100644 index 000000000..ded3b36ec --- /dev/null +++ b/src/SDK/Logs/EventLogger.php @@ -0,0 +1,53 @@ + $name]; + $logRecord->setAttributes($attributes); + $payload && $logRecord->setBody($payload); + $logRecord->setTimestamp($timestamp ?? (int) (microtime(true)*LogRecord::NANOS_PER_SECOND)); + $context && $logRecord->setContext($context); + $logRecord->setSeverityNumber($severityNumber ?? Severity::INFO); + + $this->logger->emit($logRecord); + } + + /** + * @deprecated Use `EventLogger::emit` + */ + public function logEvent(string $eventName, LogRecord $logRecord): void + { + $logRecord->setAttributes([ + 'event.name' => $eventName, + ]); + $this->logger->emit($logRecord); + } +} diff --git a/src/SDK/Logs/EventLoggerProvider.php b/src/SDK/Logs/EventLoggerProvider.php new file mode 100644 index 000000000..f330adc9d --- /dev/null +++ b/src/SDK/Logs/EventLoggerProvider.php @@ -0,0 +1,21 @@ +loggerProvider->getLogger($name, $version, $schemaUrl, $attributes)); + } +} diff --git a/src/SDK/Logs/EventLoggerProviderFactory.php b/src/SDK/Logs/EventLoggerProviderFactory.php new file mode 100644 index 000000000..89d8cd814 --- /dev/null +++ b/src/SDK/Logs/EventLoggerProviderFactory.php @@ -0,0 +1,21 @@ +loggerProvider; } + public function getEventLoggerProvider(): EventLoggerProviderInterface + { + return $this->eventLoggerProvider; + } + public function getPropagator(): TextMapPropagatorInterface { return $this->propagator; diff --git a/src/SDK/SdkAutoloader.php b/src/SDK/SdkAutoloader.php index b1d5edca9..f204d8540 100644 --- a/src/SDK/SdkAutoloader.php +++ b/src/SDK/SdkAutoloader.php @@ -10,6 +10,7 @@ use OpenTelemetry\SDK\Common\Configuration\Configuration; use OpenTelemetry\SDK\Common\Configuration\Variables; use OpenTelemetry\SDK\Common\Util\ShutdownHandler; +use OpenTelemetry\SDK\Logs\EventLoggerProviderFactory; use OpenTelemetry\SDK\Logs\LoggerProviderFactory; use OpenTelemetry\SDK\Metrics\MeterProviderFactory; use OpenTelemetry\SDK\Propagation\PropagatorFactory; @@ -48,6 +49,7 @@ public static function autoload(): bool ->build(); $loggerProvider = (new LoggerProviderFactory())->create($emitMetrics ? $meterProvider : null, $resource); + $eventLoggerProvider = (new EventLoggerProviderFactory())->create($loggerProvider); ShutdownHandler::register($tracerProvider->shutdown(...)); ShutdownHandler::register($meterProvider->shutdown(...)); @@ -57,6 +59,7 @@ public static function autoload(): bool ->withTracerProvider($tracerProvider) ->withMeterProvider($meterProvider) ->withLoggerProvider($loggerProvider) + ->withEventLoggerProvider($eventLoggerProvider) ->withPropagator($propagator) ; }); diff --git a/src/SDK/SdkBuilder.php b/src/SDK/SdkBuilder.php index 22664b417..9056091d0 100644 --- a/src/SDK/SdkBuilder.php +++ b/src/SDK/SdkBuilder.php @@ -5,6 +5,8 @@ namespace OpenTelemetry\SDK; use OpenTelemetry\API\Instrumentation\Configurator; +use OpenTelemetry\API\Logs\EventLoggerProviderInterface; +use OpenTelemetry\API\Logs\NoopEventLoggerProvider; use OpenTelemetry\Context\Context; use OpenTelemetry\Context\Propagation\NoopTextMapPropagator; use OpenTelemetry\Context\Propagation\TextMapPropagatorInterface; @@ -22,6 +24,7 @@ class SdkBuilder private ?TracerProviderInterface $tracerProvider = null; private ?MeterProviderInterface $meterProvider = null; private ?LoggerProviderInterface $loggerProvider = null; + private ?EventLoggerProviderInterface $eventLoggerProvider = null; private ?TextMapPropagatorInterface $propagator = null; private bool $autoShutdown = false; @@ -56,6 +59,13 @@ public function setLoggerProvider(LoggerProviderInterface $loggerProvider): self return $this; } + public function setEventLoggerProvider(EventLoggerProviderInterface $eventLoggerProvider): self + { + $this->eventLoggerProvider = $eventLoggerProvider; + + return $this; + } + public function setPropagator(TextMapPropagatorInterface $propagator): self { $this->propagator = $propagator; @@ -68,6 +78,7 @@ public function build(): Sdk $tracerProvider = $this->tracerProvider ?? new NoopTracerProvider(); $meterProvider = $this->meterProvider ?? new NoopMeterProvider(); $loggerProvider = $this->loggerProvider ?? new NoopLoggerProvider(); + $eventLoggerProvider = $this->eventLoggerProvider ?? new NoopEventLoggerProvider($loggerProvider); if ($this->autoShutdown) { // rector rule disabled in config, because ShutdownHandler::register() does not keep a strong reference to $this ShutdownHandler::register($tracerProvider->shutdown(...)); @@ -79,6 +90,7 @@ public function build(): Sdk $tracerProvider, $meterProvider, $loggerProvider, + $eventLoggerProvider, $this->propagator ?? NoopTextMapPropagator::getInstance(), ); } @@ -91,6 +103,7 @@ public function buildAndRegisterGlobal(): ScopeInterface ->withTracerProvider($sdk->getTracerProvider()) ->withMeterProvider($sdk->getMeterProvider()) ->withLoggerProvider($sdk->getLoggerProvider()) + ->withEventLoggerProvider($sdk->getEventLoggerProvider()) ->storeInContext(); return Context::storage()->attach($context); diff --git a/tests/Unit/API/Logs/EventLoggerTest.php b/tests/Unit/API/Logs/EventLoggerTest.php deleted file mode 100644 index f06625fc2..000000000 --- a/tests/Unit/API/Logs/EventLoggerTest.php +++ /dev/null @@ -1,28 +0,0 @@ -createMock(LoggerInterface::class); - $domain = 'some.domain'; - $logRecord = $this->createMock(LogRecord::class); - $eventLogger = new EventLogger($logger, $domain); - $logRecord->expects($this->once())->method('setAttributes'); - $logger->expects($this->once())->method('emit')->with($this->equalTo($logRecord)); - - $eventLogger->logEvent('some.event', $logRecord); - } -} diff --git a/tests/Unit/SDK/Logs/EventLoggerProviderFactoryTest.php b/tests/Unit/SDK/Logs/EventLoggerProviderFactoryTest.php new file mode 100644 index 000000000..dc7ae94bb --- /dev/null +++ b/tests/Unit/SDK/Logs/EventLoggerProviderFactoryTest.php @@ -0,0 +1,53 @@ +restoreEnvironmentVariables(); + } + + /** + * @dataProvider createProvider + * @psalm-suppress ArgumentTypeCoercion + */ + public function test_create(string $disabled, string $expected): void + { + $this->setEnvironmentVariable(Variables::OTEL_SDK_DISABLED, $disabled); + $loggerProvider = $this->createMock(LoggerProviderInterface::class); + $factory = new EventLoggerProviderFactory(); + $eventLoggerProvider = $factory->create($loggerProvider); + $this->assertInstanceOf($expected, $eventLoggerProvider); + } + + public static function createProvider(): array + { + return [ + 'sdk disabled' => [ + 'true', + NoopEventLoggerProvider::class, + ], + 'sdk enabled' => [ + 'false', + EventLoggerProvider::class, + ], + ]; + } +} diff --git a/tests/Unit/SDK/Logs/EventLoggerProviderTest.php b/tests/Unit/SDK/Logs/EventLoggerProviderTest.php new file mode 100644 index 000000000..a63b7e368 --- /dev/null +++ b/tests/Unit/SDK/Logs/EventLoggerProviderTest.php @@ -0,0 +1,26 @@ +createMock(LoggerProviderInterface::class); + $logger = $this->createMock(LoggerInterface::class); + $loggerProvider->expects($this->once())->method('getLogger')->willReturn($logger); + $eventLoggerProvider = new EventLoggerProvider($loggerProvider); + + $eventLoggerProvider->getEventLogger('event.logger', '1.0', 'https://example.org/schema', ['foo' => 'foo']); + } +} diff --git a/tests/Unit/SDK/Logs/EventLoggerTest.php b/tests/Unit/SDK/Logs/EventLoggerTest.php new file mode 100644 index 000000000..6e238041b --- /dev/null +++ b/tests/Unit/SDK/Logs/EventLoggerTest.php @@ -0,0 +1,41 @@ +createMock(LoggerProviderInterface::class); + $logger = $this->createMock(LoggerInterface::class); + $logger->expects($this->once())->method('emit')->with($this->callback(function (LogRecord $logRecord) { + $expected = (new LogRecord('some.payload')) + ->setSeverityNumber(Severity::ERROR) + ->setTimestamp(123456) + ->setAttributes([ + 'event.name' => 'my.event', + 'bar' => 'bar', + ]); + $this->assertEquals($expected, $logRecord); + + return true; + })); + $loggerProvider->expects($this->once())->method('getLogger')->willReturn($logger); + $eventLoggerProvider = new EventLoggerProvider($loggerProvider); + $eventLogger = $eventLoggerProvider->getEventLogger('event.logger', '1.0', 'https://example.org/schema', ['foo' => 'foo']); + + $eventLogger->emit('my.event', 'some.payload', 123456, severityNumber: Severity::ERROR, attributes: ['bar' => 'bar']); + } +} diff --git a/tests/Unit/SDK/SdkAutoloaderTest.php b/tests/Unit/SDK/SdkAutoloaderTest.php index e053cc0f5..e3e4df742 100644 --- a/tests/Unit/SDK/SdkAutoloaderTest.php +++ b/tests/Unit/SDK/SdkAutoloaderTest.php @@ -7,6 +7,7 @@ use AssertWell\PHPUnitGlobalState\EnvironmentVariables; use OpenTelemetry\API\Globals; use OpenTelemetry\API\LoggerHolder; +use OpenTelemetry\API\Logs\NoopEventLoggerProvider; use OpenTelemetry\API\Logs\NoopLoggerProvider; use OpenTelemetry\API\Metrics\Noop\NoopMeterProvider; use OpenTelemetry\API\Trace\NoopTracerProvider; @@ -64,6 +65,7 @@ public function test_noop_if_disabled(): void $this->assertInstanceOf(NoopMeterProvider::class, Globals::meterProvider()); $this->assertInstanceOf(NoopTracerProvider::class, Globals::tracerProvider()); $this->assertInstanceOf(NoopLoggerProvider::class, Globals::loggerProvider()); + $this->assertInstanceOf(NoopEventLoggerProvider::class, Globals::eventLoggerProvider()); $this->assertInstanceOf(NoopTextMapPropagator::class, Globals::propagator(), 'propagator not initialized by disabled autoloader'); } diff --git a/tests/Unit/SDK/SdkTest.php b/tests/Unit/SDK/SdkTest.php index 4eff6943f..be35ab3bb 100644 --- a/tests/Unit/SDK/SdkTest.php +++ b/tests/Unit/SDK/SdkTest.php @@ -5,6 +5,7 @@ namespace OpenTelemetry\Tests\Unit\SDK; use AssertWell\PHPUnitGlobalState\EnvironmentVariables; +use OpenTelemetry\API\Logs\EventLoggerProviderInterface; use OpenTelemetry\Context\Propagation\TextMapPropagatorInterface; use OpenTelemetry\SDK\Common\Configuration\Variables; use OpenTelemetry\SDK\Logs\LoggerProviderInterface; @@ -82,10 +83,12 @@ public function test_getters(): void $meterProvider = $this->createMock(MeterProviderInterface::class); $tracerProvider = $this->createMock(TracerProviderInterface::class); $loggerProvider = $this->createMock(LoggerProviderInterface::class); - $sdk = new Sdk($tracerProvider, $meterProvider, $loggerProvider, $propagator); + $eventLoggerProvider = $this->createMock(EventLoggerProviderInterface::class); + $sdk = new Sdk($tracerProvider, $meterProvider, $loggerProvider, $eventLoggerProvider, $propagator); $this->assertSame($propagator, $sdk->getPropagator()); $this->assertSame($meterProvider, $sdk->getMeterProvider()); $this->assertSame($tracerProvider, $sdk->getTracerProvider()); $this->assertSame($loggerProvider, $sdk->getLoggerProvider()); + $this->assertSame($eventLoggerProvider, $sdk->getEventLoggerProvider()); } } diff --git a/tests/coverage/html/.gitkeep b/tests/coverage/html/.gitkeep deleted file mode 100644 index e69de29bb..000000000 From 4b9faaccf0d1a0a79e26c94e303d80723524ecc1 Mon Sep 17 00:00:00 2001 From: Brett McBride Date: Sat, 27 Apr 2024 14:53:54 +1000 Subject: [PATCH 02/12] convert severity to a backed enum --- examples/logs/features/event-logger.php | 20 ---------- examples/logs/getting_started.php | 8 +--- src/API/Logs/EventLoggerInterface.php | 2 +- src/API/Logs/LogRecord.php | 4 +- src/API/Logs/NoopEventLogger.php | 2 +- src/API/Logs/Severity.php | 50 ++++++++++++------------- src/SDK/Logs/EventLogger.php | 2 +- tests/Unit/API/Logs/LogRecordTest.php | 6 ++- 8 files changed, 36 insertions(+), 58 deletions(-) delete mode 100644 examples/logs/features/event-logger.php diff --git a/examples/logs/features/event-logger.php b/examples/logs/features/event-logger.php deleted file mode 100644 index f822ae555..000000000 --- a/examples/logs/features/event-logger.php +++ /dev/null @@ -1,20 +0,0 @@ -create((new LoggerProviderFactory())->create()); -$eventLogger = $provider->getEventLogger('my-event-logger', '1.0', 'https://example.com/events'); - -$payload = ['foo' => 'bar', 'baz' => 'bat', 'msg' => 'hello world']; -$eventLogger->emit(name: 'my-event', payload: $payload, severityNumber: Severity::DEBUG); diff --git a/examples/logs/getting_started.php b/examples/logs/getting_started.php index df8af426c..6d73e91ab 100644 --- a/examples/logs/getting_started.php +++ b/examples/logs/getting_started.php @@ -6,7 +6,6 @@ use OpenTelemetry\API\Logs\Severity; use OpenTelemetry\SDK\Common\Attribute\Attributes; use OpenTelemetry\SDK\Common\Instrumentation\InstrumentationScopeFactory; -use OpenTelemetry\SDK\Logs\EventLogger; use OpenTelemetry\SDK\Logs\EventLoggerProvider; use OpenTelemetry\SDK\Logs\Exporter\ConsoleExporterFactory; use OpenTelemetry\SDK\Logs\LoggerProvider; @@ -38,15 +37,12 @@ echo 'Trace id: ' . $span->getContext()->getTraceId() . PHP_EOL; echo 'Span id: ' . $span->getContext()->getSpanId() . PHP_EOL; -//get a logger, and emit a log record from an EventLogger. The active context (trace id + span id) will be +//get an event logger, and emit an event. The active context (trace id + span id) will be //attached to the log record $eventLogger = $eventLoggerProvider->getEventLogger('demo', '1.0', 'http://schema.url', ['foo' => 'bar']); $payload = ['foo' => 'bar', 'baz' => 'bat', 'msg' => 'hello world']; -$record = (new LogRecord(['foo' => 'bar', 'baz' => 'bat', 'msg' => 'hello world'])) - ->setSeverityText('INFO') - ->setSeverityNumber(9); -$eventLogger->emit(name: 'foo', payload: $record, severityNumber: Severity::INFO); +$eventLogger->emit(name: 'foo', payload: $payload, severityNumber: Severity::INFO); //end span $span->end(); diff --git a/src/API/Logs/EventLoggerInterface.php b/src/API/Logs/EventLoggerInterface.php index 45aa59971..f10abefaa 100644 --- a/src/API/Logs/EventLoggerInterface.php +++ b/src/API/Logs/EventLoggerInterface.php @@ -16,7 +16,7 @@ public function emit( mixed $payload = null, ?int $timestamp = null, ?ContextInterface $context = null, - ?int $severityNumber = null, + Severity|int|null $severityNumber = null, ?array $attributes = [], ): void; diff --git a/src/API/Logs/LogRecord.php b/src/API/Logs/LogRecord.php index 755344e74..4551d3870 100644 --- a/src/API/Logs/LogRecord.php +++ b/src/API/Logs/LogRecord.php @@ -42,9 +42,9 @@ public function setContext(?ContextInterface $context = null): self /** * @see https://opentelemetry.io/docs/reference/specification/logs/data-model/#field-severitynumber */ - public function setSeverityNumber(int $severityNumber): self + public function setSeverityNumber(Severity|int $severityNumber): self { - $this->severityNumber = $severityNumber; + $this->severityNumber = ($severityNumber instanceof Severity) ? $severityNumber->value : $severityNumber; return $this; } diff --git a/src/API/Logs/NoopEventLogger.php b/src/API/Logs/NoopEventLogger.php index 12413ebf4..77af00da9 100644 --- a/src/API/Logs/NoopEventLogger.php +++ b/src/API/Logs/NoopEventLogger.php @@ -23,7 +23,7 @@ public function logEvent(string $eventName, LogRecord $logRecord): void { } - public function emit(string $name, mixed $payload = null, ?int $timestamp = null, ?ContextInterface $context = null, ?int $severityNumber = null, ?array $attributes = []): void + public function emit(string $name, mixed $payload = null, ?int $timestamp = null, ?ContextInterface $context = null, Severity|int|null $severityNumber = null, ?array $attributes = []): void { } } diff --git a/src/API/Logs/Severity.php b/src/API/Logs/Severity.php index 5f1bf972b..3d608d112 100644 --- a/src/API/Logs/Severity.php +++ b/src/API/Logs/Severity.php @@ -4,30 +4,30 @@ namespace OpenTelemetry\API\Logs; -class Severity +enum Severity: int { - public const TRACE = 1; - public const TRACE2 = 2; - public const TRACE3 = 3; - public const TRACE4 = 4; - public const DEBUG = 5; - public const DEBUG2 = 6; - public const DEBUG3 = 7; - public const DEBUG4 = 8; - public const INFO = 9; - public const INFO2 = 10; - public const INFO3 = 11; - public const INFO4 = 12; - public const WARN = 13; - public const WARN2 = 14; - public const WARN3 = 15; - public const WARN4 = 16; - public const ERROR = 17; - public const ERROR2 = 18; - public const ERROR3 = 19; - public const ERROR4 = 20; - public const FATAL = 21; - public const FATAL2 = 22; - public const FATAL3 = 23; - public const FATAL4 = 24; + case TRACE = 1; + case TRACE2 = 2; + case TRACE3 = 3; + case TRACE4 = 4; + case DEBUG = 5; + case DEBUG2 = 6; + case DEBUG3 = 7; + case DEBUG4 = 8; + case INFO = 9; + case INFO2 = 10; + case INFO3 = 11; + case INFO4 = 12; + case WARN = 13; + case WARN2 = 14; + case WARN3 = 15; + case WARN4 = 16; + case ERROR = 17; + case ERROR2 = 18; + case ERROR3 = 19; + case ERROR4 = 20; + case FATAL = 21; + case FATAL2 = 22; + case FATAL3 = 23; + case FATAL4 = 24; } diff --git a/src/SDK/Logs/EventLogger.php b/src/SDK/Logs/EventLogger.php index ded3b36ec..89ea626c4 100644 --- a/src/SDK/Logs/EventLogger.php +++ b/src/SDK/Logs/EventLogger.php @@ -26,7 +26,7 @@ public function emit( mixed $payload = null, ?int $timestamp = null, ?ContextInterface $context = null, - ?int $severityNumber = null, + Severity|int|null $severityNumber = null, ?array $attributes = [], ): void { $logRecord = new LogRecord(); diff --git a/tests/Unit/API/Logs/LogRecordTest.php b/tests/Unit/API/Logs/LogRecordTest.php index 949898b30..525cbbda5 100644 --- a/tests/Unit/API/Logs/LogRecordTest.php +++ b/tests/Unit/API/Logs/LogRecordTest.php @@ -5,6 +5,7 @@ namespace OpenTelemetry\Tests\Unit\API\Logs; use OpenTelemetry\API\Logs\LogRecord; +use OpenTelemetry\API\Logs\Severity; use OpenTelemetry\Context\Context; use PHPUnit\Framework\TestCase; @@ -16,7 +17,7 @@ class LogRecordTest extends TestCase /** * @dataProvider settersProvider */ - public function test_setters(string $method, string $propertyName, $value): void + public function test_setters(string $method, string $propertyName, mixed $value, mixed $expected = null): void { $record = new LogRecord(); $record->{$method}($value); @@ -24,7 +25,7 @@ public function test_setters(string $method, string $propertyName, $value): void $reflection = new \ReflectionClass($record); $property = $reflection->getProperty($propertyName); $property->setAccessible(true); - $this->assertSame($value, $property->getValue($record)); + $this->assertSame($expected ?? $value, $property->getValue($record)); } public static function settersProvider(): array @@ -33,6 +34,7 @@ public static function settersProvider(): array ['setBody', 'body', 'foo'], ['setAttributes', 'attributes', ['foo' => 'bar']], ['setSeverityNumber', 'severityNumber', 5], + ['setSeverityNumber', 'severityNumber', Severity::ERROR, Severity::ERROR->value], ['setSeverityText', 'severityText', 'info'], ['setObservedTimestamp', 'observedTimestamp', 999], ['setTimestamp', 'timestamp', 888], From fa034b278c31b65c66c72317374fbc3e3521a332 Mon Sep 17 00:00:00 2001 From: Brett McBride Date: Sat, 27 Apr 2024 14:56:44 +1000 Subject: [PATCH 03/12] lint --- examples/logs/getting_started.php | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/logs/getting_started.php b/examples/logs/getting_started.php index 6d73e91ab..b929cfaa0 100644 --- a/examples/logs/getting_started.php +++ b/examples/logs/getting_started.php @@ -2,7 +2,6 @@ declare(strict_types=1); -use OpenTelemetry\API\Logs\LogRecord; use OpenTelemetry\API\Logs\Severity; use OpenTelemetry\SDK\Common\Attribute\Attributes; use OpenTelemetry\SDK\Common\Instrumentation\InstrumentationScopeFactory; From ee1b3601cef75879c78f60400c759a3bf0597592 Mon Sep 17 00:00:00 2001 From: Brett McBride Date: Sun, 28 Apr 2024 09:25:45 +1000 Subject: [PATCH 04/12] remove instead of deprecating logEvent, mark Logger constructor as internal --- examples/autoload_sdk.php | 3 +-- src/API/Logs/EventLoggerInterface.php | 5 ----- src/API/Logs/EventLoggerProviderInterface.php | 2 -- src/SDK/Logs/EventLogger.php | 11 ----------- src/SDK/Logs/Logger.php | 3 +++ 5 files changed, 4 insertions(+), 20 deletions(-) diff --git a/examples/autoload_sdk.php b/examples/autoload_sdk.php index 671b07190..c46d44005 100644 --- a/examples/autoload_sdk.php +++ b/examples/autoload_sdk.php @@ -4,7 +4,6 @@ namespace OpenTelemetry\Example; -use OpenTelemetry\API\Logs\LogRecord; use OpenTelemetry\SDK\Logs\EventLogger; putenv('OTEL_PHP_AUTOLOAD_ENABLED=true'); @@ -26,6 +25,6 @@ $instrumentation->meter()->createCounter('cnt')->add(1); $eventLogger = new EventLogger($instrumentation->logger()); -$eventLogger->logEvent('foo', new LogRecord('hello, otel')); +$eventLogger->emit('foo', 'hello, otel'); echo 'Finished!' . PHP_EOL; diff --git a/src/API/Logs/EventLoggerInterface.php b/src/API/Logs/EventLoggerInterface.php index f10abefaa..4103740b7 100644 --- a/src/API/Logs/EventLoggerInterface.php +++ b/src/API/Logs/EventLoggerInterface.php @@ -19,9 +19,4 @@ public function emit( Severity|int|null $severityNumber = null, ?array $attributes = [], ): void; - - /** - * @deprecated Use `emit` - */ - public function logEvent(string $eventName, LogRecord $logRecord): void; } diff --git a/src/API/Logs/EventLoggerProviderInterface.php b/src/API/Logs/EventLoggerProviderInterface.php index e321a7f8e..957a19654 100644 --- a/src/API/Logs/EventLoggerProviderInterface.php +++ b/src/API/Logs/EventLoggerProviderInterface.php @@ -9,8 +9,6 @@ */ interface EventLoggerProviderInterface { - public function __construct(LoggerProviderInterface $loggerProvider); - public function getEventLogger( string $name, ?string $version = null, diff --git a/src/SDK/Logs/EventLogger.php b/src/SDK/Logs/EventLogger.php index 89ea626c4..94812a0c7 100644 --- a/src/SDK/Logs/EventLogger.php +++ b/src/SDK/Logs/EventLogger.php @@ -39,15 +39,4 @@ public function emit( $this->logger->emit($logRecord); } - - /** - * @deprecated Use `EventLogger::emit` - */ - public function logEvent(string $eventName, LogRecord $logRecord): void - { - $logRecord->setAttributes([ - 'event.name' => $eventName, - ]); - $this->logger->emit($logRecord); - } } diff --git a/src/SDK/Logs/Logger.php b/src/SDK/Logs/Logger.php index 98af671b9..3d4282f80 100644 --- a/src/SDK/Logs/Logger.php +++ b/src/SDK/Logs/Logger.php @@ -16,6 +16,9 @@ */ class Logger implements LoggerInterface { + /** + * @internal + */ public function __construct( private readonly LoggerSharedState $loggerSharedState, private readonly InstrumentationScopeInterface $scope, From 710822907bbc41d1ddcb2c19aa78222f59bde3aa Mon Sep 17 00:00:00 2001 From: Brett McBride Date: Sun, 28 Apr 2024 21:25:29 +1000 Subject: [PATCH 05/12] make severity an enum only --- examples/logs/logger_builder.php | 3 ++- src/API/Logs/EventLoggerInterface.php | 2 +- src/API/Logs/LogRecord.php | 4 ++-- src/API/Logs/Map/Psr3.php | 24 ++++++++++--------- src/SDK/Logs/EventLogger.php | 4 ++-- tests/Unit/API/Logs/LogRecordTest.php | 1 - tests/Unit/API/Logs/Map/Psr3Test.php | 7 +++++- tests/Unit/SDK/Logs/ReadableLogRecordTest.php | 3 ++- 8 files changed, 28 insertions(+), 20 deletions(-) diff --git a/examples/logs/logger_builder.php b/examples/logs/logger_builder.php index 0c368e35e..0750a786c 100644 --- a/examples/logs/logger_builder.php +++ b/examples/logs/logger_builder.php @@ -3,6 +3,7 @@ declare(strict_types=1); use OpenTelemetry\API\Logs\LogRecord; +use OpenTelemetry\API\Logs\Severity; use OpenTelemetry\SDK\Common\Attribute\Attributes; use OpenTelemetry\SDK\Logs\Exporter\ConsoleExporterFactory; use OpenTelemetry\SDK\Logs\LoggerProvider; @@ -24,7 +25,7 @@ $record = (new LogRecord(['foo' => 'bar', 'baz' => 'bat', 'msg' => 'hello world'])) ->setSeverityText('INFO') - ->setSeverityNumber(9); + ->setSeverityNumber(Severity::INFO); /** * Note that Loggers should only be used directly by a log appender. diff --git a/src/API/Logs/EventLoggerInterface.php b/src/API/Logs/EventLoggerInterface.php index 4103740b7..0a07d64e3 100644 --- a/src/API/Logs/EventLoggerInterface.php +++ b/src/API/Logs/EventLoggerInterface.php @@ -16,7 +16,7 @@ public function emit( mixed $payload = null, ?int $timestamp = null, ?ContextInterface $context = null, - Severity|int|null $severityNumber = null, + ?Severity $severityNumber = null, ?array $attributes = [], ): void; } diff --git a/src/API/Logs/LogRecord.php b/src/API/Logs/LogRecord.php index 4551d3870..b1c070644 100644 --- a/src/API/Logs/LogRecord.php +++ b/src/API/Logs/LogRecord.php @@ -42,9 +42,9 @@ public function setContext(?ContextInterface $context = null): self /** * @see https://opentelemetry.io/docs/reference/specification/logs/data-model/#field-severitynumber */ - public function setSeverityNumber(Severity|int $severityNumber): self + public function setSeverityNumber(Severity $severityNumber): self { - $this->severityNumber = ($severityNumber instanceof Severity) ? $severityNumber->value : $severityNumber; + $this->severityNumber = $severityNumber->value; return $this; } diff --git a/src/API/Logs/Map/Psr3.php b/src/API/Logs/Map/Psr3.php index 63a00e7b9..aa2037386 100644 --- a/src/API/Logs/Map/Psr3.php +++ b/src/API/Logs/Map/Psr3.php @@ -4,28 +4,30 @@ namespace OpenTelemetry\API\Logs\Map; +use InvalidArgumentException; +use OpenTelemetry\API\Logs\Severity; use Psr\Log\LogLevel; class Psr3 { /** - * Maps PSR-3 severity level (string) to the appropriate opentelemetry severity number + * Maps PSR-3 severity level (string) to the appropriate opentelemetry severity * * @see https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/logs/data-model-appendix.md#appendix-b-severitynumber-example-mappings * @see https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/logs/data-model.md#field-severitynumber */ - public static function severityNumber(string $level): int + public static function severityNumber(string $level): Severity { return match (strtolower($level)) { - LogLevel::DEBUG => 5, - LogLevel::INFO => 9, - LogLevel::NOTICE => 10, - LogLevel::WARNING => 13, - LogLevel::ERROR => 17, - LogLevel::CRITICAL => 18, - LogLevel::ALERT => 19, - LogLevel::EMERGENCY => 21, - default => 0, + LogLevel::DEBUG => Severity::DEBUG, + LogLevel::INFO => Severity::INFO, + LogLevel::NOTICE => Severity::INFO2, + LogLevel::WARNING => Severity::WARN, + LogLevel::ERROR => Severity::ERROR, + LogLevel::CRITICAL => Severity::ERROR2, + LogLevel::ALERT => Severity::ERROR3, + LogLevel::EMERGENCY => Severity::FATAL, + default => throw new InvalidArgumentException('Unknown severity: ' . $level), }; } } diff --git a/src/SDK/Logs/EventLogger.php b/src/SDK/Logs/EventLogger.php index 94812a0c7..6e5c334a0 100644 --- a/src/SDK/Logs/EventLogger.php +++ b/src/SDK/Logs/EventLogger.php @@ -26,7 +26,7 @@ public function emit( mixed $payload = null, ?int $timestamp = null, ?ContextInterface $context = null, - Severity|int|null $severityNumber = null, + ?Severity $severityNumber = null, ?array $attributes = [], ): void { $logRecord = new LogRecord(); @@ -35,7 +35,7 @@ public function emit( $payload && $logRecord->setBody($payload); $logRecord->setTimestamp($timestamp ?? (int) (microtime(true)*LogRecord::NANOS_PER_SECOND)); $context && $logRecord->setContext($context); - $logRecord->setSeverityNumber($severityNumber ?? Severity::INFO); + $severityNumber && $logRecord->setSeverityNumber($severityNumber); $this->logger->emit($logRecord); } diff --git a/tests/Unit/API/Logs/LogRecordTest.php b/tests/Unit/API/Logs/LogRecordTest.php index 525cbbda5..f9d27dddf 100644 --- a/tests/Unit/API/Logs/LogRecordTest.php +++ b/tests/Unit/API/Logs/LogRecordTest.php @@ -33,7 +33,6 @@ public static function settersProvider(): array return [ ['setBody', 'body', 'foo'], ['setAttributes', 'attributes', ['foo' => 'bar']], - ['setSeverityNumber', 'severityNumber', 5], ['setSeverityNumber', 'severityNumber', Severity::ERROR, Severity::ERROR->value], ['setSeverityText', 'severityText', 'info'], ['setObservedTimestamp', 'observedTimestamp', 999], diff --git a/tests/Unit/API/Logs/Map/Psr3Test.php b/tests/Unit/API/Logs/Map/Psr3Test.php index bdef1235c..e4c539808 100644 --- a/tests/Unit/API/Logs/Map/Psr3Test.php +++ b/tests/Unit/API/Logs/Map/Psr3Test.php @@ -32,7 +32,12 @@ public static function levelProvider(): array [LogLevel::NOTICE], [LogLevel::INFO], [LogLevel::DEBUG], - ['unknown'], ]; } + + public function test_unknown_value_error(): void + { + $this->expectException(\InvalidArgumentException::class); + Psr3::severityNumber('unknown'); + } } diff --git a/tests/Unit/SDK/Logs/ReadableLogRecordTest.php b/tests/Unit/SDK/Logs/ReadableLogRecordTest.php index 1c946278c..da7b4b8ce 100644 --- a/tests/Unit/SDK/Logs/ReadableLogRecordTest.php +++ b/tests/Unit/SDK/Logs/ReadableLogRecordTest.php @@ -5,6 +5,7 @@ namespace OpenTelemetry\Tests\Unit\SDK\Logs; use OpenTelemetry\API\Logs\LogRecord; +use OpenTelemetry\API\Logs\Severity; use OpenTelemetry\Context\ContextInterface; use OpenTelemetry\SDK\Common\Attribute\AttributesFactory; use OpenTelemetry\SDK\Common\Instrumentation\InstrumentationScopeInterface; @@ -39,7 +40,7 @@ public function setUp(): void public function test_getters(): void { $logRecord = (new LogRecord('body')) - ->setSeverityNumber(5) + ->setSeverityNumber(Severity::DEBUG) ->setSeverityText('info') ->setTimestamp(11) ->setObservedTimestamp(22) From b7c1dddbe14c953109264b8c630d97a768fdc4a5 Mon Sep 17 00:00:00 2001 From: Brett McBride Date: Mon, 29 Apr 2024 10:04:33 +1000 Subject: [PATCH 06/12] event attributes to iterable --- src/API/Instrumentation/Configurator.php | 2 +- src/API/Logs/EventLoggerInterface.php | 2 +- src/API/Logs/NoopEventLogger.php | 9 +-------- src/API/Logs/NoopEventLoggerProvider.php | 7 +------ src/SDK/Logs/EventLogger.php | 8 ++++---- src/SDK/SdkBuilder.php | 2 +- 6 files changed, 9 insertions(+), 21 deletions(-) diff --git a/src/API/Instrumentation/Configurator.php b/src/API/Instrumentation/Configurator.php index 638393a7e..d8912ec2d 100644 --- a/src/API/Instrumentation/Configurator.php +++ b/src/API/Instrumentation/Configurator.php @@ -54,7 +54,7 @@ public static function createNoop(): Configurator ->withMeterProvider(new NoopMeterProvider()) ->withPropagator(new NoopTextMapPropagator()) ->withLoggerProvider(NoopLoggerProvider::getInstance()) - ->withEventLoggerProvider(new NoopEventLoggerProvider(NoopLoggerProvider::getInstance())) + ->withEventLoggerProvider(new NoopEventLoggerProvider()) ; } diff --git a/src/API/Logs/EventLoggerInterface.php b/src/API/Logs/EventLoggerInterface.php index 0a07d64e3..037a8db8f 100644 --- a/src/API/Logs/EventLoggerInterface.php +++ b/src/API/Logs/EventLoggerInterface.php @@ -17,6 +17,6 @@ public function emit( ?int $timestamp = null, ?ContextInterface $context = null, ?Severity $severityNumber = null, - ?array $attributes = [], + iterable $attributes = [], ): void; } diff --git a/src/API/Logs/NoopEventLogger.php b/src/API/Logs/NoopEventLogger.php index 77af00da9..73c1459e2 100644 --- a/src/API/Logs/NoopEventLogger.php +++ b/src/API/Logs/NoopEventLogger.php @@ -16,14 +16,7 @@ public static function instance(): self return $instance; } - /** - * @inheritDoc - */ - public function logEvent(string $eventName, LogRecord $logRecord): void - { - } - - public function emit(string $name, mixed $payload = null, ?int $timestamp = null, ?ContextInterface $context = null, Severity|int|null $severityNumber = null, ?array $attributes = []): void + public function emit(string $name, mixed $payload = null, ?int $timestamp = null, ?ContextInterface $context = null, Severity|int|null $severityNumber = null, iterable $attributes = []): void { } } diff --git a/src/API/Logs/NoopEventLoggerProvider.php b/src/API/Logs/NoopEventLoggerProvider.php index e6ecdc572..09ae22564 100644 --- a/src/API/Logs/NoopEventLoggerProvider.php +++ b/src/API/Logs/NoopEventLoggerProvider.php @@ -10,7 +10,7 @@ public static function getInstance(): self { static $instance; - return $instance ??= new self(NoopLoggerProvider::getInstance()); + return $instance ??= new self(); } public function getEventLogger( @@ -21,9 +21,4 @@ public function getEventLogger( ): EventLoggerInterface { return NoopEventLogger::instance(); } - - // @phpstan-ignore-next-line - public function __construct(private readonly LoggerProviderInterface $loggerProvider) - { - } } diff --git a/src/SDK/Logs/EventLogger.php b/src/SDK/Logs/EventLogger.php index 6e5c334a0..8ad1e9446 100644 --- a/src/SDK/Logs/EventLogger.php +++ b/src/SDK/Logs/EventLogger.php @@ -27,15 +27,15 @@ public function emit( ?int $timestamp = null, ?ContextInterface $context = null, ?Severity $severityNumber = null, - ?array $attributes = [], + iterable $attributes = [], ): void { $logRecord = new LogRecord(); - $attributes += ['event.name' => $name]; + $logRecord->setAttribute('event.name', $name); $logRecord->setAttributes($attributes); - $payload && $logRecord->setBody($payload); + $logRecord->setBody($payload); $logRecord->setTimestamp($timestamp ?? (int) (microtime(true)*LogRecord::NANOS_PER_SECOND)); $context && $logRecord->setContext($context); - $severityNumber && $logRecord->setSeverityNumber($severityNumber); + $logRecord->setSeverityNumber($severityNumber ?? Severity::INFO); $this->logger->emit($logRecord); } diff --git a/src/SDK/SdkBuilder.php b/src/SDK/SdkBuilder.php index 9056091d0..403713e0b 100644 --- a/src/SDK/SdkBuilder.php +++ b/src/SDK/SdkBuilder.php @@ -78,7 +78,7 @@ public function build(): Sdk $tracerProvider = $this->tracerProvider ?? new NoopTracerProvider(); $meterProvider = $this->meterProvider ?? new NoopMeterProvider(); $loggerProvider = $this->loggerProvider ?? new NoopLoggerProvider(); - $eventLoggerProvider = $this->eventLoggerProvider ?? new NoopEventLoggerProvider($loggerProvider); + $eventLoggerProvider = $this->eventLoggerProvider ?? new NoopEventLoggerProvider(); if ($this->autoShutdown) { // rector rule disabled in config, because ShutdownHandler::register() does not keep a strong reference to $this ShutdownHandler::register($tracerProvider->shutdown(...)); From 49724d39d0ef98c9fcae247a65aefaba297adb1f Mon Sep 17 00:00:00 2001 From: Brett McBride Date: Mon, 29 Apr 2024 10:51:41 +1000 Subject: [PATCH 07/12] inject ClockInterface, add CachedInstrumentation, update examples --- examples/autoload_sdk.php | 6 +----- examples/logs/exporters/otlp_http.php | 6 +++--- examples/logs/features/batch_exporting.php | 8 ++++---- src/API/Instrumentation/CachedInstrumentation.php | 11 +++++++++++ src/SDK/Logs/EventLogger.php | 5 +++-- src/SDK/Logs/EventLoggerProvider.php | 6 +++++- 6 files changed, 27 insertions(+), 15 deletions(-) diff --git a/examples/autoload_sdk.php b/examples/autoload_sdk.php index c46d44005..9043bca29 100644 --- a/examples/autoload_sdk.php +++ b/examples/autoload_sdk.php @@ -4,8 +4,6 @@ namespace OpenTelemetry\Example; -use OpenTelemetry\SDK\Logs\EventLogger; - putenv('OTEL_PHP_AUTOLOAD_ENABLED=true'); putenv('OTEL_TRACES_EXPORTER=otlp'); putenv('OTEL_METRICS_EXPORTER=otlp'); @@ -23,8 +21,6 @@ $instrumentation->tracer()->spanBuilder('root')->startSpan()->end(); $instrumentation->meter()->createCounter('cnt')->add(1); - -$eventLogger = new EventLogger($instrumentation->logger()); -$eventLogger->emit('foo', 'hello, otel'); +$instrumentation->eventLogger()->emit('foo', 'hello, otel'); echo 'Finished!' . PHP_EOL; diff --git a/examples/logs/exporters/otlp_http.php b/examples/logs/exporters/otlp_http.php index 59f3709a1..e575ce233 100644 --- a/examples/logs/exporters/otlp_http.php +++ b/examples/logs/exporters/otlp_http.php @@ -9,7 +9,7 @@ use OpenTelemetry\Contrib\Otlp\LogsExporter; use OpenTelemetry\Contrib\Otlp\OtlpHttpTransportFactory; use OpenTelemetry\SDK\Common\Instrumentation\InstrumentationScopeFactory; -use OpenTelemetry\SDK\Logs\EventLogger; +use OpenTelemetry\SDK\Logs\EventLoggerProvider; use OpenTelemetry\SDK\Logs\LoggerProvider; use OpenTelemetry\SDK\Logs\LogRecordLimitsBuilder; use OpenTelemetry\SDK\Logs\Processor\SimpleLogRecordProcessor; @@ -27,8 +27,8 @@ (new LogRecordLimitsBuilder())->build()->getAttributeFactory() ) ); -$logger = $loggerProvider->getLogger('demo', '1.0', 'https://opentelemetry.io/schemas/1.7.1', ['foo' => 'bar']); -$eventLogger = new EventLogger($logger); +$eventLoggerProvider = new EventLoggerProvider($loggerProvider); +$eventLogger = $eventLoggerProvider->getEventLogger('demo', '1.0', 'https://opentelemetry.io/schemas/1.7.1', ['foo' => 'bar']); $eventLogger->emit( name: 'foo', diff --git a/examples/logs/features/batch_exporting.php b/examples/logs/features/batch_exporting.php index 032628d56..46a6c30e6 100644 --- a/examples/logs/features/batch_exporting.php +++ b/examples/logs/features/batch_exporting.php @@ -9,6 +9,7 @@ use OpenTelemetry\SDK\Common\Attribute\Attributes; use OpenTelemetry\SDK\Common\Instrumentation\InstrumentationScopeFactory; use OpenTelemetry\SDK\Logs\EventLogger; +use OpenTelemetry\SDK\Logs\EventLoggerProvider; use OpenTelemetry\SDK\Logs\Exporter\ConsoleExporterFactory; use OpenTelemetry\SDK\Logs\LoggerProvider; use OpenTelemetry\SDK\Logs\Processor\BatchLogRecordProcessor; @@ -22,11 +23,10 @@ ), new InstrumentationScopeFactory(Attributes::factory()) ); +$eventLoggerProvider = new EventLoggerProvider($loggerProvider); //get a logger, and emit a log record from an EventLogger. -$loggerOne = $loggerProvider->getLogger('demo', '1.0'); -$loggerTwo = $loggerProvider->getLogger('demo', '2.0'); -$eventLoggerOne = new EventLogger($loggerOne); -$eventLoggerTwo = new EventLogger($loggerTwo); +$eventLoggerOne = $eventLoggerProvider->getEventLogger('demo', '1.0'); +$eventLoggerTwo = $eventLoggerProvider->getEventLogger('demo', '2.0'); $payload = ['foo' => 'bar', 'baz' => 'bat', 'msg' => 'hello world']; diff --git a/src/API/Instrumentation/CachedInstrumentation.php b/src/API/Instrumentation/CachedInstrumentation.php index deb0f58f2..20749c0c5 100644 --- a/src/API/Instrumentation/CachedInstrumentation.php +++ b/src/API/Instrumentation/CachedInstrumentation.php @@ -5,6 +5,8 @@ namespace OpenTelemetry\API\Instrumentation; use OpenTelemetry\API\Globals; +use OpenTelemetry\API\Logs\EventLoggerInterface; +use OpenTelemetry\API\Logs\EventLoggerProviderInterface; use OpenTelemetry\API\Logs\LoggerInterface; use OpenTelemetry\API\Logs\LoggerProviderInterface; use OpenTelemetry\API\Metrics\MeterInterface; @@ -29,6 +31,8 @@ final class CachedInstrumentation private WeakMap $meters; /** @var WeakMap */ private WeakMap $loggers; + /** @var WeakMap */ + private WeakMap $eventLoggers; /** * @psalm-suppress PropertyTypeCoercion @@ -42,6 +46,7 @@ public function __construct( $this->tracers = new \WeakMap(); $this->meters = new \WeakMap(); $this->loggers = new \WeakMap(); + $this->eventLoggers = new \WeakMap(); } public function tracer(): TracerInterface @@ -63,4 +68,10 @@ public function logger(): LoggerInterface return $this->loggers[$loggerProvider] ??= $loggerProvider->getLogger($this->name, $this->version, $this->schemaUrl, $this->attributes); } + public function eventLogger(): EventLoggerInterface + { + $eventLoggerProvider = Globals::eventLoggerProvider(); + + return $this->eventLoggers[$eventLoggerProvider] ??= $eventLoggerProvider->getEventLogger($this->name, $this->version, $this->schemaUrl, $this->attributes); + } } diff --git a/src/SDK/Logs/EventLogger.php b/src/SDK/Logs/EventLogger.php index 8ad1e9446..39311c29a 100644 --- a/src/SDK/Logs/EventLogger.php +++ b/src/SDK/Logs/EventLogger.php @@ -4,7 +4,7 @@ namespace OpenTelemetry\SDK\Logs; -use function microtime; +use OpenTelemetry\API\Common\Time\ClockInterface; use OpenTelemetry\API\Logs\EventLoggerInterface; use OpenTelemetry\API\Logs\LoggerInterface; use OpenTelemetry\API\Logs\LogRecord; @@ -18,6 +18,7 @@ class EventLogger implements EventLoggerInterface */ public function __construct( private readonly LoggerInterface $logger, + private readonly ClockInterface $clock, ) { } @@ -33,7 +34,7 @@ public function emit( $logRecord->setAttribute('event.name', $name); $logRecord->setAttributes($attributes); $logRecord->setBody($payload); - $logRecord->setTimestamp($timestamp ?? (int) (microtime(true)*LogRecord::NANOS_PER_SECOND)); + $logRecord->setTimestamp($timestamp ?? $this->clock->now()); $context && $logRecord->setContext($context); $logRecord->setSeverityNumber($severityNumber ?? Severity::INFO); diff --git a/src/SDK/Logs/EventLoggerProvider.php b/src/SDK/Logs/EventLoggerProvider.php index f330adc9d..53233a53c 100644 --- a/src/SDK/Logs/EventLoggerProvider.php +++ b/src/SDK/Logs/EventLoggerProvider.php @@ -4,6 +4,7 @@ namespace OpenTelemetry\SDK\Logs; +use OpenTelemetry\API\Common\Time\Clock; use OpenTelemetry\API\Logs\EventLoggerInterface; use OpenTelemetry\API\Logs\EventLoggerProviderInterface; use OpenTelemetry\API\Logs\LoggerProviderInterface; @@ -16,6 +17,9 @@ public function __construct(private readonly LoggerProviderInterface $loggerProv public function getEventLogger(string $name, ?string $version = null, ?string $schemaUrl = null, iterable $attributes = []): EventLoggerInterface { - return new EventLogger($this->loggerProvider->getLogger($name, $version, $schemaUrl, $attributes)); + return new EventLogger( + $this->loggerProvider->getLogger($name, $version, $schemaUrl, $attributes), + Clock::getDefault(), + ); } } From 829afad934f1723596cb7e1f705eb6d1552045ca Mon Sep 17 00:00:00 2001 From: Brett McBride Date: Mon, 29 Apr 2024 11:55:01 +1000 Subject: [PATCH 08/12] set correct defaults for events --- src/API/Logs/EventLoggerInterface.php | 2 +- src/SDK/Logs/EventLogger.php | 11 ++-- tests/Unit/SDK/Logs/EventLoggerTest.php | 76 ++++++++++++++++++++++--- 3 files changed, 77 insertions(+), 12 deletions(-) diff --git a/src/API/Logs/EventLoggerInterface.php b/src/API/Logs/EventLoggerInterface.php index 037a8db8f..d2c80a93b 100644 --- a/src/API/Logs/EventLoggerInterface.php +++ b/src/API/Logs/EventLoggerInterface.php @@ -17,6 +17,6 @@ public function emit( ?int $timestamp = null, ?ContextInterface $context = null, ?Severity $severityNumber = null, - iterable $attributes = [], + array $attributes = [], ): void; } diff --git a/src/SDK/Logs/EventLogger.php b/src/SDK/Logs/EventLogger.php index 39311c29a..3490a6578 100644 --- a/src/SDK/Logs/EventLogger.php +++ b/src/SDK/Logs/EventLogger.php @@ -9,6 +9,7 @@ use OpenTelemetry\API\Logs\LoggerInterface; use OpenTelemetry\API\Logs\LogRecord; use OpenTelemetry\API\Logs\Severity; +use OpenTelemetry\Context\Context; use OpenTelemetry\Context\ContextInterface; class EventLogger implements EventLoggerInterface @@ -22,20 +23,22 @@ public function __construct( ) { } + /** + * @see https://github.com/open-telemetry/opentelemetry-specification/blob/v1.32.0/specification/logs/event-sdk.md#emit-event + */ public function emit( string $name, mixed $payload = null, ?int $timestamp = null, ?ContextInterface $context = null, ?Severity $severityNumber = null, - iterable $attributes = [], + array $attributes = [], ): void { $logRecord = new LogRecord(); - $logRecord->setAttribute('event.name', $name); - $logRecord->setAttributes($attributes); + $logRecord->setAttributes(['event.name' => $name] + $attributes); $logRecord->setBody($payload); $logRecord->setTimestamp($timestamp ?? $this->clock->now()); - $context && $logRecord->setContext($context); + $logRecord->setContext($context ?? Context::getCurrent()); $logRecord->setSeverityNumber($severityNumber ?? Severity::INFO); $this->logger->emit($logRecord); diff --git a/tests/Unit/SDK/Logs/EventLoggerTest.php b/tests/Unit/SDK/Logs/EventLoggerTest.php index 6e238041b..ea9dbac77 100644 --- a/tests/Unit/SDK/Logs/EventLoggerTest.php +++ b/tests/Unit/SDK/Logs/EventLoggerTest.php @@ -2,13 +2,17 @@ declare(strict_types=1); -namespace Unit\SDK\Logs; +namespace OpenTelemetry\Tests\Unit\SDK\Logs; +use OpenTelemetry\API\Common\Time\Clock; +use OpenTelemetry\API\Common\Time\TestClock; use OpenTelemetry\API\Logs\LoggerInterface; use OpenTelemetry\API\Logs\LoggerProviderInterface; use OpenTelemetry\API\Logs\LogRecord; use OpenTelemetry\API\Logs\Severity; +use OpenTelemetry\Context\Context; use OpenTelemetry\SDK\Logs\EventLoggerProvider; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; /** @@ -16,14 +20,32 @@ */ class EventLoggerTest extends TestCase { - public function test_emit(): void + private LoggerInterface&MockObject $logger; + private EventLoggerProvider $eventLoggerProvider; + private TestClock $clock; + + public function setUp(): void { + $this->clock = new TestClock(); + Clock::setDefault($this->clock); + $this->logger = $this->createMock(LoggerInterface::class); $loggerProvider = $this->createMock(LoggerProviderInterface::class); - $logger = $this->createMock(LoggerInterface::class); - $logger->expects($this->once())->method('emit')->with($this->callback(function (LogRecord $logRecord) { + $loggerProvider->method('getLogger')->willReturn($this->logger); + $this->eventLoggerProvider = new EventLoggerProvider($loggerProvider); + } + + public function tearDown(): void + { + Clock::reset(); + } + + public function test_emit(): void + { + $this->logger->expects($this->once())->method('emit')->with($this->callback(function (LogRecord $logRecord) { $expected = (new LogRecord('some.payload')) ->setSeverityNumber(Severity::ERROR) ->setTimestamp(123456) + ->setContext(Context::getCurrent()) ->setAttributes([ 'event.name' => 'my.event', 'bar' => 'bar', @@ -32,10 +54,50 @@ public function test_emit(): void return true; })); - $loggerProvider->expects($this->once())->method('getLogger')->willReturn($logger); - $eventLoggerProvider = new EventLoggerProvider($loggerProvider); - $eventLogger = $eventLoggerProvider->getEventLogger('event.logger', '1.0', 'https://example.org/schema', ['foo' => 'foo']); + $eventLogger = $this->eventLoggerProvider->getEventLogger('event.logger', '1.0', 'https://example.org/schema', ['foo' => 'foo']); $eventLogger->emit('my.event', 'some.payload', 123456, severityNumber: Severity::ERROR, attributes: ['bar' => 'bar']); } + + public function test_default_values(): void + { + $this->logger->expects($this->once())->method('emit')->with($this->callback(function (LogRecord $logRecord) { + $expected = (new LogRecord()) + ->setSeverityNumber(Severity::INFO) + ->setTimestamp($this->clock->now()) + ->setContext(Context::getCurrent()) + ->setAttributes([ + 'event.name' => 'my.event', + ]); + $this->assertEquals($expected, $logRecord); + + return true; + })); + + $eventLogger = $this->eventLoggerProvider->getEventLogger('event.logger'); + $eventLogger->emit('my.event'); + } + + /** + * "The user provided Attributes MUST not take over the event.name attribute" + * @see https://github.com/open-telemetry/opentelemetry-specification/blob/v1.32.0/specification/logs/event-sdk.md#emit-event + */ + public function test_event_name_attribute_is_ignored(): void + { + $this->logger->expects($this->once())->method('emit')->with($this->callback(function (LogRecord $logRecord) { + $expected = (new LogRecord()) + ->setSeverityNumber(Severity::INFO) + ->setTimestamp($this->clock->now()) + ->setContext(Context::getCurrent()) + ->setAttributes([ + 'event.name' => 'my.event', + ]); + $this->assertEquals($expected, $logRecord); + + return true; + })); + + $eventLogger = $this->eventLoggerProvider->getEventLogger('event.logger'); + $eventLogger->emit('my.event', attributes: ['event.name' => 'not.my.event']); + } } From 9b20ddb9bab792a6fa15f1f38d7c2d527a4a9a08 Mon Sep 17 00:00:00 2001 From: Brett McBride Date: Mon, 29 Apr 2024 13:00:54 +1000 Subject: [PATCH 09/12] test coverage --- .../Unit/API/Instrumentation/InstrumentationTest.php | 12 ++++++++++++ tests/Unit/SDK/SdkBuilderTest.php | 6 ++++++ 2 files changed, 18 insertions(+) diff --git a/tests/Unit/API/Instrumentation/InstrumentationTest.php b/tests/Unit/API/Instrumentation/InstrumentationTest.php index ce96727b5..90e61f310 100644 --- a/tests/Unit/API/Instrumentation/InstrumentationTest.php +++ b/tests/Unit/API/Instrumentation/InstrumentationTest.php @@ -7,8 +7,11 @@ use OpenTelemetry\API\Globals; use OpenTelemetry\API\Instrumentation\CachedInstrumentation; use OpenTelemetry\API\Instrumentation\Configurator; +use OpenTelemetry\API\Logs\EventLoggerInterface; +use OpenTelemetry\API\Logs\EventLoggerProviderInterface; use OpenTelemetry\API\Logs\LoggerInterface; use OpenTelemetry\API\Logs\LoggerProviderInterface; +use OpenTelemetry\API\Logs\NoopEventLoggerProvider; use OpenTelemetry\API\Logs\NoopLoggerProvider; use OpenTelemetry\API\Metrics\MeterInterface; use OpenTelemetry\API\Metrics\MeterProviderInterface; @@ -41,6 +44,7 @@ public function test_globals_not_configured_returns_noop_instances(): void $this->assertInstanceOf(NoopMeterProvider::class, Globals::meterProvider()); $this->assertInstanceOf(NoopTextMapPropagator::class, Globals::propagator()); $this->assertInstanceOf(NoopLoggerProvider::class, Globals::loggerProvider()); + $this->assertInstanceOf(NoopEventLoggerProvider::class, Globals::eventLoggerProvider()); } public function test_globals_returns_configured_instances(): void @@ -49,12 +53,14 @@ public function test_globals_returns_configured_instances(): void $meterProvider = $this->createMock(MeterProviderInterface::class); $propagator = $this->createMock(TextMapPropagatorInterface::class); $loggerProvider = $this->createMock(LoggerProviderInterface::class); + $eventLoggerProvider = $this->createMock(EventLoggerProviderInterface::class); $scope = Configurator::create() ->withTracerProvider($tracerProvider) ->withMeterProvider($meterProvider) ->withPropagator($propagator) ->withLoggerProvider($loggerProvider) + ->withEventLoggerProvider($eventLoggerProvider) ->activate(); try { @@ -62,6 +68,7 @@ public function test_globals_returns_configured_instances(): void $this->assertSame($meterProvider, Globals::meterProvider()); $this->assertSame($propagator, Globals::propagator()); $this->assertSame($loggerProvider, Globals::loggerProvider()); + $this->assertSame($eventLoggerProvider, Globals::eventLoggerProvider()); } finally { $scope->detach(); } @@ -88,12 +95,16 @@ public function test_instrumentation_returns_configured_instances(): void $logger = $this->createMock(LoggerInterface::class); $loggerProvider = $this->createMock(LoggerProviderInterface::class); $loggerProvider->method('getLogger')->willReturn($logger); + $eventLogger = $this->createMock(EventLoggerInterface::class); + $eventLoggerProvider = $this->createMock(EventLoggerProviderInterface::class); + $eventLoggerProvider->method('getEventLogger')->willReturn($eventLogger); $propagator = $this->createMock(TextMapPropagatorInterface::class); $scope = Configurator::create() ->withTracerProvider($tracerProvider) ->withMeterProvider($meterProvider) ->withLoggerProvider($loggerProvider) + ->withEventLoggerProvider($eventLoggerProvider) ->withPropagator($propagator) ->activate(); @@ -101,6 +112,7 @@ public function test_instrumentation_returns_configured_instances(): void $this->assertSame($tracer, $instrumentation->tracer()); $this->assertSame($meter, $instrumentation->meter()); $this->assertSame($logger, $instrumentation->logger()); + $this->assertSame($eventLogger, $instrumentation->eventLogger()); } finally { $scope->detach(); } diff --git a/tests/Unit/SDK/SdkBuilderTest.php b/tests/Unit/SDK/SdkBuilderTest.php index 0d05cd123..48baabaae 100644 --- a/tests/Unit/SDK/SdkBuilderTest.php +++ b/tests/Unit/SDK/SdkBuilderTest.php @@ -5,6 +5,7 @@ namespace OpenTelemetry\Tests\Unit\SDK; use OpenTelemetry\API\Globals; +use OpenTelemetry\API\Logs\EventLoggerProviderInterface; use OpenTelemetry\Context\Propagation\TextMapPropagatorInterface; use OpenTelemetry\SDK\Logs\LoggerProviderInterface; use OpenTelemetry\SDK\Metrics\MeterProviderInterface; @@ -21,6 +22,7 @@ class SdkBuilderTest extends TestCase private TracerProviderInterface $tracerProvider; private MeterProviderInterface $meterProvider; private LoggerProviderInterface $loggerProvider; + private EventLoggerProviderInterface $eventLoggerProvider; private SdkBuilder $builder; public function setUp(): void @@ -29,9 +31,11 @@ public function setUp(): void $this->tracerProvider = $this->createMock(TracerProviderInterface::class); $this->meterProvider = $this->createMock(MeterProviderInterface::class); $this->loggerProvider = $this->createMock(LoggerProviderInterface::class); + $this->eventLoggerProvider = $this->createMock(EventLoggerProviderInterface::class); $this->builder = (new SdkBuilder()) ->setMeterProvider($this->meterProvider) ->setLoggerProvider($this->loggerProvider) + ->setEventLoggerProvider($this->eventLoggerProvider) ->setPropagator($this->propagator) ->setTracerProvider($this->tracerProvider) ->setAutoShutdown(true); @@ -44,6 +48,7 @@ public function test_build(): void $this->assertSame($this->propagator, $sdk->getPropagator()); $this->assertSame($this->tracerProvider, $sdk->getTracerProvider()); $this->assertSame($this->loggerProvider, $sdk->getLoggerProvider()); + $this->assertSame($this->eventLoggerProvider, $sdk->getEventLoggerProvider()); } public function test_build_and_register_global(): void @@ -53,6 +58,7 @@ public function test_build_and_register_global(): void $this->assertSame($this->propagator, Globals::propagator()); $this->assertSame($this->tracerProvider, Globals::tracerProvider()); $this->assertSame($this->loggerProvider, Globals::loggerProvider()); + $this->assertSame($this->eventLoggerProvider, Globals::eventLoggerProvider()); $scope->detach(); } } From fdff96150029352a70aa9c577f500969e3c04f1a Mon Sep 17 00:00:00 2001 From: Brett McBride Date: Tue, 30 Apr 2024 10:04:06 +1000 Subject: [PATCH 10/12] Revert "make severity an enum only" This reverts commit 710822907bbc41d1ddcb2c19aa78222f59bde3aa. Also, move PSR-3 mapping into the Severity enum. --- examples/logs/logger_builder.php | 3 +- src/API/Logs/EventLoggerInterface.php | 2 +- src/API/Logs/LogRecord.php | 4 +- src/API/Logs/Map/Psr3.php | 17 +------ src/API/Logs/Severity.php | 24 ++++++++++ src/SDK/Logs/EventLogger.php | 2 +- tests/Unit/API/Logs/LogRecordTest.php | 1 + tests/Unit/API/Logs/Map/Psr3Test.php | 6 --- tests/Unit/API/Logs/SeverityTest.php | 44 +++++++++++++++++++ tests/Unit/SDK/Logs/ReadableLogRecordTest.php | 3 +- 10 files changed, 77 insertions(+), 29 deletions(-) create mode 100644 tests/Unit/API/Logs/SeverityTest.php diff --git a/examples/logs/logger_builder.php b/examples/logs/logger_builder.php index 0750a786c..0c368e35e 100644 --- a/examples/logs/logger_builder.php +++ b/examples/logs/logger_builder.php @@ -3,7 +3,6 @@ declare(strict_types=1); use OpenTelemetry\API\Logs\LogRecord; -use OpenTelemetry\API\Logs\Severity; use OpenTelemetry\SDK\Common\Attribute\Attributes; use OpenTelemetry\SDK\Logs\Exporter\ConsoleExporterFactory; use OpenTelemetry\SDK\Logs\LoggerProvider; @@ -25,7 +24,7 @@ $record = (new LogRecord(['foo' => 'bar', 'baz' => 'bat', 'msg' => 'hello world'])) ->setSeverityText('INFO') - ->setSeverityNumber(Severity::INFO); + ->setSeverityNumber(9); /** * Note that Loggers should only be used directly by a log appender. diff --git a/src/API/Logs/EventLoggerInterface.php b/src/API/Logs/EventLoggerInterface.php index d2c80a93b..72470faff 100644 --- a/src/API/Logs/EventLoggerInterface.php +++ b/src/API/Logs/EventLoggerInterface.php @@ -16,7 +16,7 @@ public function emit( mixed $payload = null, ?int $timestamp = null, ?ContextInterface $context = null, - ?Severity $severityNumber = null, + Severity|int|null $severityNumber = null, array $attributes = [], ): void; } diff --git a/src/API/Logs/LogRecord.php b/src/API/Logs/LogRecord.php index b1c070644..4551d3870 100644 --- a/src/API/Logs/LogRecord.php +++ b/src/API/Logs/LogRecord.php @@ -42,9 +42,9 @@ public function setContext(?ContextInterface $context = null): self /** * @see https://opentelemetry.io/docs/reference/specification/logs/data-model/#field-severitynumber */ - public function setSeverityNumber(Severity $severityNumber): self + public function setSeverityNumber(Severity|int $severityNumber): self { - $this->severityNumber = $severityNumber->value; + $this->severityNumber = ($severityNumber instanceof Severity) ? $severityNumber->value : $severityNumber; return $this; } diff --git a/src/API/Logs/Map/Psr3.php b/src/API/Logs/Map/Psr3.php index aa2037386..c2e21c973 100644 --- a/src/API/Logs/Map/Psr3.php +++ b/src/API/Logs/Map/Psr3.php @@ -4,30 +4,17 @@ namespace OpenTelemetry\API\Logs\Map; -use InvalidArgumentException; use OpenTelemetry\API\Logs\Severity; -use Psr\Log\LogLevel; class Psr3 { /** * Maps PSR-3 severity level (string) to the appropriate opentelemetry severity * - * @see https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/logs/data-model-appendix.md#appendix-b-severitynumber-example-mappings - * @see https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/logs/data-model.md#field-severitynumber + * @deprecated Use Severity::fromPsr3 */ public static function severityNumber(string $level): Severity { - return match (strtolower($level)) { - LogLevel::DEBUG => Severity::DEBUG, - LogLevel::INFO => Severity::INFO, - LogLevel::NOTICE => Severity::INFO2, - LogLevel::WARNING => Severity::WARN, - LogLevel::ERROR => Severity::ERROR, - LogLevel::CRITICAL => Severity::ERROR2, - LogLevel::ALERT => Severity::ERROR3, - LogLevel::EMERGENCY => Severity::FATAL, - default => throw new InvalidArgumentException('Unknown severity: ' . $level), - }; + return Severity::fromPsr3($level); } } diff --git a/src/API/Logs/Severity.php b/src/API/Logs/Severity.php index 3d608d112..06c50b917 100644 --- a/src/API/Logs/Severity.php +++ b/src/API/Logs/Severity.php @@ -4,6 +4,9 @@ namespace OpenTelemetry\API\Logs; +use Psr\Log\LogLevel; +use ValueError; + enum Severity: int { case TRACE = 1; @@ -30,4 +33,25 @@ enum Severity: int case FATAL2 = 22; case FATAL3 = 23; case FATAL4 = 24; + + /** + * Maps PSR-3 severity level (string) to the appropriate opentelemetry severity + * + * @see https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/logs/data-model-appendix.md#appendix-b-severitynumber-example-mappings + * @see https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/logs/data-model.md#field-severitynumber + */ + public static function fromPsr3(string $level): self + { + return match (strtolower($level)) { + LogLevel::DEBUG => Severity::DEBUG, + LogLevel::INFO => Severity::INFO, + LogLevel::NOTICE => Severity::INFO2, + LogLevel::WARNING => Severity::WARN, + LogLevel::ERROR => Severity::ERROR, + LogLevel::CRITICAL => Severity::ERROR2, + LogLevel::ALERT => Severity::ERROR3, + LogLevel::EMERGENCY => Severity::FATAL, + default => throw new ValueError('Unknown severity: ' . $level), + }; + } } diff --git a/src/SDK/Logs/EventLogger.php b/src/SDK/Logs/EventLogger.php index 3490a6578..e7c4551a9 100644 --- a/src/SDK/Logs/EventLogger.php +++ b/src/SDK/Logs/EventLogger.php @@ -31,7 +31,7 @@ public function emit( mixed $payload = null, ?int $timestamp = null, ?ContextInterface $context = null, - ?Severity $severityNumber = null, + Severity|int|null $severityNumber = null, array $attributes = [], ): void { $logRecord = new LogRecord(); diff --git a/tests/Unit/API/Logs/LogRecordTest.php b/tests/Unit/API/Logs/LogRecordTest.php index f9d27dddf..525cbbda5 100644 --- a/tests/Unit/API/Logs/LogRecordTest.php +++ b/tests/Unit/API/Logs/LogRecordTest.php @@ -33,6 +33,7 @@ public static function settersProvider(): array return [ ['setBody', 'body', 'foo'], ['setAttributes', 'attributes', ['foo' => 'bar']], + ['setSeverityNumber', 'severityNumber', 5], ['setSeverityNumber', 'severityNumber', Severity::ERROR, Severity::ERROR->value], ['setSeverityText', 'severityText', 'info'], ['setObservedTimestamp', 'observedTimestamp', 999], diff --git a/tests/Unit/API/Logs/Map/Psr3Test.php b/tests/Unit/API/Logs/Map/Psr3Test.php index e4c539808..38b1320a6 100644 --- a/tests/Unit/API/Logs/Map/Psr3Test.php +++ b/tests/Unit/API/Logs/Map/Psr3Test.php @@ -34,10 +34,4 @@ public static function levelProvider(): array [LogLevel::DEBUG], ]; } - - public function test_unknown_value_error(): void - { - $this->expectException(\InvalidArgumentException::class); - Psr3::severityNumber('unknown'); - } } diff --git a/tests/Unit/API/Logs/SeverityTest.php b/tests/Unit/API/Logs/SeverityTest.php new file mode 100644 index 000000000..9cd048d53 --- /dev/null +++ b/tests/Unit/API/Logs/SeverityTest.php @@ -0,0 +1,44 @@ +expectException(ValueError::class); + Severity::fromPsr3('unknown'); + } + + /** + * @dataProvider levelProvider + */ + public function test_severity_number(string $level): void + { + $this->assertNotNull(Severity::fromPsr3($level)); + } + + public static function levelProvider(): array + { + return [ + [LogLevel::EMERGENCY], + [LogLevel::ALERT], + [LogLevel::CRITICAL], + [LogLevel::ERROR], + [LogLevel::WARNING], + [LogLevel::NOTICE], + [LogLevel::INFO], + [LogLevel::DEBUG], + ]; + } +} diff --git a/tests/Unit/SDK/Logs/ReadableLogRecordTest.php b/tests/Unit/SDK/Logs/ReadableLogRecordTest.php index da7b4b8ce..1c946278c 100644 --- a/tests/Unit/SDK/Logs/ReadableLogRecordTest.php +++ b/tests/Unit/SDK/Logs/ReadableLogRecordTest.php @@ -5,7 +5,6 @@ namespace OpenTelemetry\Tests\Unit\SDK\Logs; use OpenTelemetry\API\Logs\LogRecord; -use OpenTelemetry\API\Logs\Severity; use OpenTelemetry\Context\ContextInterface; use OpenTelemetry\SDK\Common\Attribute\AttributesFactory; use OpenTelemetry\SDK\Common\Instrumentation\InstrumentationScopeInterface; @@ -40,7 +39,7 @@ public function setUp(): void public function test_getters(): void { $logRecord = (new LogRecord('body')) - ->setSeverityNumber(Severity::DEBUG) + ->setSeverityNumber(5) ->setSeverityText('info') ->setTimestamp(11) ->setObservedTimestamp(22) From d3cd1a80990f12b1e2367aee4eb8d8072291abb0 Mon Sep 17 00:00:00 2001 From: Brett McBride Date: Wed, 1 May 2024 23:15:18 +1000 Subject: [PATCH 11/12] event attributes to iterable --- src/API/Logs/EventLoggerInterface.php | 2 +- src/SDK/Logs/EventLogger.php | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/API/Logs/EventLoggerInterface.php b/src/API/Logs/EventLoggerInterface.php index 72470faff..07a20c3ce 100644 --- a/src/API/Logs/EventLoggerInterface.php +++ b/src/API/Logs/EventLoggerInterface.php @@ -17,6 +17,6 @@ public function emit( ?int $timestamp = null, ?ContextInterface $context = null, Severity|int|null $severityNumber = null, - array $attributes = [], + iterable $attributes = [], ): void; } diff --git a/src/SDK/Logs/EventLogger.php b/src/SDK/Logs/EventLogger.php index e7c4551a9..c59c51fb9 100644 --- a/src/SDK/Logs/EventLogger.php +++ b/src/SDK/Logs/EventLogger.php @@ -32,10 +32,12 @@ public function emit( ?int $timestamp = null, ?ContextInterface $context = null, Severity|int|null $severityNumber = null, - array $attributes = [], + iterable $attributes = [], ): void { $logRecord = new LogRecord(); - $logRecord->setAttributes(['event.name' => $name] + $attributes); + $logRecord->setAttribute('event.name', $name); + $logRecord->setAttributes($attributes); + $logRecord->setAttribute('event.name', $name); $logRecord->setBody($payload); $logRecord->setTimestamp($timestamp ?? $this->clock->now()); $logRecord->setContext($context ?? Context::getCurrent()); From c04ce0b574902d54676b0fbafdcac4952aabfe98 Mon Sep 17 00:00:00 2001 From: Brett McBride Date: Thu, 2 May 2024 08:50:29 +1000 Subject: [PATCH 12/12] apply review feedback --- examples/logs/exporters/otlp_grpc.php | 2 +- src/API/Logs/EventLoggerInterface.php | 2 +- src/SDK/Logs/EventLogger.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/logs/exporters/otlp_grpc.php b/examples/logs/exporters/otlp_grpc.php index bc2c4e868..26d787b14 100644 --- a/examples/logs/exporters/otlp_grpc.php +++ b/examples/logs/exporters/otlp_grpc.php @@ -39,7 +39,7 @@ ); $eventLogger->emit( - 'foo', + 'bar', 'otel is great' ); diff --git a/src/API/Logs/EventLoggerInterface.php b/src/API/Logs/EventLoggerInterface.php index 07a20c3ce..73d19808e 100644 --- a/src/API/Logs/EventLoggerInterface.php +++ b/src/API/Logs/EventLoggerInterface.php @@ -16,7 +16,7 @@ public function emit( mixed $payload = null, ?int $timestamp = null, ?ContextInterface $context = null, - Severity|int|null $severityNumber = null, + Severity $severityNumber = null, iterable $attributes = [], ): void; } diff --git a/src/SDK/Logs/EventLogger.php b/src/SDK/Logs/EventLogger.php index c59c51fb9..c4f0fb62d 100644 --- a/src/SDK/Logs/EventLogger.php +++ b/src/SDK/Logs/EventLogger.php @@ -31,7 +31,7 @@ public function emit( mixed $payload = null, ?int $timestamp = null, ?ContextInterface $context = null, - Severity|int|null $severityNumber = null, + Severity $severityNumber = null, iterable $attributes = [], ): void { $logRecord = new LogRecord();