implement events v1.32 (#1291)

* 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

* convert severity to a backed enum

* lint

* remove instead of deprecating logEvent, mark Logger constructor as internal

* make severity an enum only

* event attributes to iterable

* inject ClockInterface, add CachedInstrumentation, update examples

* set correct defaults for events

* test coverage

* Revert "make severity an enum only"

This reverts commit 710822907b.
Also, move PSR-3 mapping into the Severity enum.

* event attributes to iterable

* apply review feedback
This commit is contained in:
Brett McBride 2024-05-06 08:35:19 +10:00 committed by GitHub
parent 8031c78512
commit 500f6ee1bd
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
41 changed files with 619 additions and 143 deletions

View File

@ -4,9 +4,6 @@ declare(strict_types=1);
namespace OpenTelemetry\Example;
use OpenTelemetry\API\Logs\EventLogger;
use OpenTelemetry\API\Logs\LogRecord;
putenv('OTEL_PHP_AUTOLOAD_ENABLED=true');
putenv('OTEL_TRACES_EXPORTER=otlp');
putenv('OTEL_METRICS_EXPORTER=otlp');
@ -24,8 +21,6 @@ $instrumentation = new \OpenTelemetry\API\Instrumentation\CachedInstrumentation(
$instrumentation->tracer()->spanBuilder('root')->startSpan()->end();
$instrumentation->meter()->createCounter('cnt')->add(1);
$eventLogger = new EventLogger($instrumentation->logger(), 'my-domain');
$eventLogger->logEvent('foo', new LogRecord('hello, otel'));
$instrumentation->eventLogger()->emit('foo', 'hello, otel');
echo 'Finished!' . PHP_EOL;

View File

@ -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 @@ $sdk = $config
$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;

View File

@ -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 @@ $sdk = $config
$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;

View File

@ -5,14 +5,13 @@ declare(strict_types=1);
namespace OpenTelemetry\Example;
use OpenTelemetry\API\Common\Time\Clock;
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\Logs\EventLoggerProvider;
use OpenTelemetry\SDK\Logs\LoggerProvider;
use OpenTelemetry\SDK\Logs\LogRecordLimitsBuilder;
use OpenTelemetry\SDK\Logs\Processor\BatchLogRecordProcessor;
@ -30,19 +29,18 @@ $loggerProvider = new LoggerProvider(
(new LogRecordLimitsBuilder())->build()->getAttributeFactory()
)
);
$logger = $loggerProvider->getLogger('demo', '1.0', 'http://schema.url', ['foo' => 'bar']);
$eventLogger = new EventLogger($logger, 'my-domain');
$eventLoggerProvider = new EventLoggerProvider($loggerProvider);
$eventLogger = $eventLoggerProvider->getEventLogger('demo', '1.0', 'http://schema.url', ['foo' => 'bar']);
$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(
'foo',
new LogRecord('otel is great')
$eventLogger->emit(
'bar',
'otel is great'
);
$loggerProvider->shutdown();

View File

@ -4,12 +4,12 @@ declare(strict_types=1);
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\EventLoggerProvider;
use OpenTelemetry\SDK\Logs\LoggerProvider;
use OpenTelemetry\SDK\Logs\LogRecordLimitsBuilder;
use OpenTelemetry\SDK\Logs\Processor\SimpleLogRecordProcessor;
@ -27,12 +27,12 @@ $loggerProvider = new LoggerProvider(
(new LogRecordLimitsBuilder())->build()->getAttributeFactory()
)
);
$logger = $loggerProvider->getLogger('demo', '1.0', 'https://opentelemetry.io/schemas/1.7.1', ['foo' => 'bar']);
$eventLogger = new EventLogger($logger, 'my-domain');
$eventLoggerProvider = new EventLoggerProvider($loggerProvider);
$eventLogger = $eventLoggerProvider->getEventLogger('demo', '1.0', 'https://opentelemetry.io/schemas/1.7.1', ['foo' => 'bar']);
$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,
);

View File

@ -5,10 +5,11 @@ declare(strict_types=1);
namespace OpenTelemetry\Example;
use OpenTelemetry\API\Common\Time\Clock;
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\BatchLogRecordProcessor;
@ -22,19 +23,16 @@ $loggerProvider = new LoggerProvider(
),
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, 'my-domain');
$eventLoggerTwo = new EventLogger($loggerTwo, 'my-domain');
$eventLoggerOne = $eventLoggerProvider->getEventLogger('demo', '1.0');
$eventLoggerTwo = $eventLoggerProvider->getEventLogger('demo', '2.0');
$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();

View File

@ -2,10 +2,10 @@
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\EventLoggerProvider;
use OpenTelemetry\SDK\Logs\Exporter\ConsoleExporterFactory;
use OpenTelemetry\SDK\Logs\LoggerProvider;
use OpenTelemetry\SDK\Logs\Processor\SimpleLogRecordProcessor;
@ -26,6 +26,7 @@ $loggerProvider = new LoggerProvider(
),
new InstrumentationScopeFactory(Attributes::factory())
);
$eventLoggerProvider = new EventLoggerProvider($loggerProvider);
$tracerProvider = new TracerProvider();
$tracer = $tracerProvider->getTracer('demo-tracer');
@ -35,16 +36,12 @@ $scope = $span->activate();
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
$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: $payload, severityNumber: Severity::INFO);
//end span
$span->end();

View File

@ -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 @@ $loggerProvider = LoggerProvider::builder()
->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();

View File

@ -9,6 +9,7 @@ use Closure;
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 @@ final class Globals
private readonly TracerProviderInterface $tracerProvider,
private readonly MeterProviderInterface $meterProvider,
private readonly LoggerProviderInterface $loggerProvider,
private readonly EventLoggerProviderInterface $eventLoggerProvider,
private readonly TextMapPropagatorInterface $propagator,
) {
}
@ -55,6 +57,11 @@ final class Globals
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 @@ final class Globals
$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);
}
/**

View File

@ -5,6 +5,8 @@ declare(strict_types=1);
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<LoggerProviderInterface, LoggerInterface> */
private WeakMap $loggers;
/** @var WeakMap<EventLoggerProviderInterface, EventLoggerInterface> */
private WeakMap $eventLoggers;
/**
* @psalm-suppress PropertyTypeCoercion
@ -42,6 +46,7 @@ final class CachedInstrumentation
$this->tracers = new \WeakMap();
$this->meters = new \WeakMap();
$this->loggers = new \WeakMap();
$this->eventLoggers = new \WeakMap();
}
public function tracer(): TracerInterface
@ -63,4 +68,10 @@ final class CachedInstrumentation
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);
}
}

View File

@ -4,7 +4,9 @@ declare(strict_types=1);
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 @@ final class Configurator implements ImplicitContextKeyedInterface
->withTracerProvider(new NoopTracerProvider())
->withMeterProvider(new NoopMeterProvider())
->withPropagator(new NoopTextMapPropagator())
->withLoggerProvider(new NoopLoggerProvider())
->withLoggerProvider(NoopLoggerProvider::getInstance())
->withEventLoggerProvider(new NoopEventLoggerProvider())
;
}
@ -75,6 +79,9 @@ final class Configurator implements ImplicitContextKeyedInterface
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 @@ final class Configurator implements ImplicitContextKeyedInterface
return $self;
}
public function withEventLoggerProvider(?EventLoggerProviderInterface $eventLoggerProvider): Configurator
{
$self = clone $this;
$self->eventLoggerProvider = $eventLoggerProvider;
return $self;
}
}

View File

@ -4,6 +4,7 @@ declare(strict_types=1);
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 @@ final class ContextKeys
return $instance ??= Context::createKey(LoggerProviderInterface::class);
}
/**
* @return ContextKeyInterface<EventLoggerProviderInterface>
*/
public static function eventLoggerProvider(): ContextKeyInterface
{
static $instance;
return $instance ??= Context::createKey(EventLoggerProviderInterface::class);
}
}

View File

@ -1,23 +0,0 @@
<?php
declare(strict_types=1);
namespace OpenTelemetry\API\Logs;
class EventLogger implements EventLoggerInterface
{
public function __construct(
private readonly LoggerInterface $logger,
private readonly string $domain,
) {
}
public function logEvent(string $eventName, LogRecord $logRecord): void
{
$logRecord->setAttributes([
'event.name' => $eventName,
'event.domain' => $this->domain,
]);
$this->logger->emit($logRecord);
}
}

View File

@ -4,10 +4,19 @@ declare(strict_types=1);
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 logEvent(string $eventName, LogRecord $logRecord): void;
public function emit(
string $name,
mixed $payload = null,
?int $timestamp = null,
?ContextInterface $context = null,
Severity $severityNumber = null,
iterable $attributes = [],
): void;
}

View File

@ -0,0 +1,18 @@
<?php
declare(strict_types=1);
namespace OpenTelemetry\API\Logs;
/**
* @see https://github.com/open-telemetry/opentelemetry-specification/blob/v1.32.0/specification/logs/event-api.md#get-an-eventlogger
*/
interface EventLoggerProviderInterface
{
public function getEventLogger(
string $name,
?string $version = null,
?string $schemaUrl = null,
iterable $attributes = [],
): EventLoggerInterface;
}

View File

@ -42,9 +42,9 @@ class LogRecord
/**
* @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;
}

View File

@ -6,5 +6,9 @@ namespace OpenTelemetry\API\Logs;
interface LoggerInterface
{
/**
* This method should only be used when implementing a `log appender`
* @see https://github.com/open-telemetry/opentelemetry-specification/blob/v1.32.0/specification/logs/bridge-api.md#artifact-naming
*/
public function emit(LogRecord $logRecord): void;
}

View File

@ -4,28 +4,17 @@ declare(strict_types=1);
namespace OpenTelemetry\API\Logs\Map;
use Psr\Log\LogLevel;
use OpenTelemetry\API\Logs\Severity;
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
* @deprecated Use Severity::fromPsr3
*/
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,
};
return Severity::fromPsr3($level);
}
}

View File

@ -0,0 +1,22 @@
<?php
declare(strict_types=1);
namespace OpenTelemetry\API\Logs;
use OpenTelemetry\Context\ContextInterface;
class NoopEventLogger implements EventLoggerInterface
{
public static function instance(): self
{
static $instance;
$instance ??= new self();
return $instance;
}
public function emit(string $name, mixed $payload = null, ?int $timestamp = null, ?ContextInterface $context = null, Severity|int|null $severityNumber = null, iterable $attributes = []): void
{
}
}

View File

@ -0,0 +1,24 @@
<?php
declare(strict_types=1);
namespace OpenTelemetry\API\Logs;
class NoopEventLoggerProvider implements EventLoggerProviderInterface
{
public static function getInstance(): self
{
static $instance;
return $instance ??= new self();
}
public function getEventLogger(
string $name,
?string $version = null,
?string $schemaUrl = null,
iterable $attributes = [],
): EventLoggerInterface {
return NoopEventLogger::instance();
}
}

57
src/API/Logs/Severity.php Normal file
View File

@ -0,0 +1,57 @@
<?php
declare(strict_types=1);
namespace OpenTelemetry\API\Logs;
use Psr\Log\LogLevel;
use ValueError;
enum Severity: int
{
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;
/**
* 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),
};
}
}

View File

@ -14,6 +14,7 @@ use OpenTelemetry\Context\Propagation\NoopTextMapPropagator;
use OpenTelemetry\Context\Propagation\TextMapPropagatorInterface;
use OpenTelemetry\SDK\Common\Attribute\Attributes;
use OpenTelemetry\SDK\Common\Instrumentation\InstrumentationScopeFactory;
use OpenTelemetry\SDK\Logs\EventLoggerProvider;
use OpenTelemetry\SDK\Logs\LoggerProvider;
use OpenTelemetry\SDK\Logs\LogRecordProcessorInterface;
use OpenTelemetry\SDK\Logs\Processor\MultiLogRecordProcessor;
@ -239,12 +240,14 @@ final class OpenTelemetrySdk implements ComponentProvider
instrumentationScopeFactory: new InstrumentationScopeFactory(Attributes::factory()),
resource: $resource,
);
$eventLoggerProvider = new EventLoggerProvider($loggerProvider);
// </editor-fold>
$sdkBuilder->setTracerProvider($tracerProvider);
$sdkBuilder->setMeterProvider($meterProvider);
$sdkBuilder->setLoggerProvider($loggerProvider);
$sdkBuilder->setEventLoggerProvider($eventLoggerProvider);
return $sdkBuilder;
}

View File

@ -0,0 +1,48 @@
<?php
declare(strict_types=1);
namespace OpenTelemetry\SDK\Logs;
use OpenTelemetry\API\Common\Time\ClockInterface;
use OpenTelemetry\API\Logs\EventLoggerInterface;
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
{
/**
* @internal
*/
public function __construct(
private readonly LoggerInterface $logger,
private readonly ClockInterface $clock,
) {
}
/**
* @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 = [],
): void {
$logRecord = new LogRecord();
$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());
$logRecord->setSeverityNumber($severityNumber ?? Severity::INFO);
$this->logger->emit($logRecord);
}
}

View File

@ -0,0 +1,25 @@
<?php
declare(strict_types=1);
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;
class EventLoggerProvider implements EventLoggerProviderInterface
{
public function __construct(private readonly LoggerProviderInterface $loggerProvider)
{
}
public function getEventLogger(string $name, ?string $version = null, ?string $schemaUrl = null, iterable $attributes = []): EventLoggerInterface
{
return new EventLogger(
$this->loggerProvider->getLogger($name, $version, $schemaUrl, $attributes),
Clock::getDefault(),
);
}
}

View File

@ -0,0 +1,21 @@
<?php
declare(strict_types=1);
namespace OpenTelemetry\SDK\Logs;
use OpenTelemetry\API\Logs\EventLoggerProviderInterface;
use OpenTelemetry\API\Logs\NoopEventLoggerProvider;
use OpenTelemetry\SDK\Sdk;
class EventLoggerProviderFactory
{
public function create(\OpenTelemetry\API\Logs\LoggerProviderInterface $loggerProvider): EventLoggerProviderInterface
{
if (Sdk::isDisabled()) {
return NoopEventLoggerProvider::getInstance();
}
return new EventLoggerProvider($loggerProvider);
}
}

View File

@ -16,6 +16,9 @@ use OpenTelemetry\SDK\Common\Instrumentation\InstrumentationScopeInterface;
*/
class Logger implements LoggerInterface
{
/**
* @internal
*/
public function __construct(
private readonly LoggerSharedState $loggerSharedState,
private readonly InstrumentationScopeInterface $scope,

View File

@ -4,6 +4,7 @@ declare(strict_types=1);
namespace OpenTelemetry\SDK;
use OpenTelemetry\API\Logs\EventLoggerProviderInterface;
use OpenTelemetry\API\Metrics\MeterProviderInterface;
use OpenTelemetry\API\Trace\TracerProviderInterface;
use OpenTelemetry\Context\Propagation\TextMapPropagatorInterface;
@ -19,6 +20,7 @@ class Sdk
private readonly TracerProviderInterface $tracerProvider,
private readonly MeterProviderInterface $meterProvider,
private readonly LoggerProviderInterface $loggerProvider,
private readonly EventLoggerProviderInterface $eventLoggerProvider,
private readonly TextMapPropagatorInterface $propagator,
) {
}
@ -58,6 +60,11 @@ class Sdk
return $this->loggerProvider;
}
public function getEventLoggerProvider(): EventLoggerProviderInterface
{
return $this->eventLoggerProvider;
}
public function getPropagator(): TextMapPropagatorInterface
{
return $this->propagator;

View File

@ -10,6 +10,7 @@ use OpenTelemetry\API\Instrumentation\Configurator;
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 @@ class SdkAutoloader
->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 @@ class SdkAutoloader
->withTracerProvider($tracerProvider)
->withMeterProvider($meterProvider)
->withLoggerProvider($loggerProvider)
->withEventLoggerProvider($eventLoggerProvider)
->withPropagator($propagator)
;
});

View File

@ -5,6 +5,8 @@ declare(strict_types=1);
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 @@ class SdkBuilder
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 @@ class SdkBuilder
$tracerProvider = $this->tracerProvider ?? new NoopTracerProvider();
$meterProvider = $this->meterProvider ?? new NoopMeterProvider();
$loggerProvider = $this->loggerProvider ?? new NoopLoggerProvider();
$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(...));
@ -79,6 +90,7 @@ class SdkBuilder
$tracerProvider,
$meterProvider,
$loggerProvider,
$eventLoggerProvider,
$this->propagator ?? NoopTextMapPropagator::getInstance(),
);
}
@ -91,6 +103,7 @@ class SdkBuilder
->withTracerProvider($sdk->getTracerProvider())
->withMeterProvider($sdk->getMeterProvider())
->withLoggerProvider($sdk->getLoggerProvider())
->withEventLoggerProvider($sdk->getEventLoggerProvider())
->storeInContext();
return Context::storage()->attach($context);

View File

@ -7,8 +7,11 @@ namespace OpenTelemetry\Tests\Unit\API\Instrumentation;
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 @@ final class InstrumentationTest extends TestCase
$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 @@ final class InstrumentationTest extends TestCase
$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 @@ final class InstrumentationTest extends TestCase
$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 @@ final class InstrumentationTest extends TestCase
$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 @@ final class InstrumentationTest extends TestCase
$this->assertSame($tracer, $instrumentation->tracer());
$this->assertSame($meter, $instrumentation->meter());
$this->assertSame($logger, $instrumentation->logger());
$this->assertSame($eventLogger, $instrumentation->eventLogger());
} finally {
$scope->detach();
}

View File

@ -1,28 +0,0 @@
<?php
declare(strict_types=1);
namespace OpenTelemetry\Tests\Unit\API\Logs;
use OpenTelemetry\API\Logs\EventLogger;
use OpenTelemetry\API\Logs\LoggerInterface;
use OpenTelemetry\API\Logs\LogRecord;
use PHPUnit\Framework\TestCase;
/**
* @covers \OpenTelemetry\API\Logs\EventLogger
*/
class EventLoggerTest extends TestCase
{
public function test_log_event(): void
{
$logger = $this->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);
}
}

View File

@ -5,6 +5,7 @@ declare(strict_types=1);
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 @@ class LogRecordTest extends TestCase
$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 @@ class LogRecordTest extends TestCase
['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],

View File

@ -32,7 +32,6 @@ class Psr3Test extends TestCase
[LogLevel::NOTICE],
[LogLevel::INFO],
[LogLevel::DEBUG],
['unknown'],
];
}
}

View File

@ -0,0 +1,44 @@
<?php
declare(strict_types=1);
namespace OpenTelemetry\Tests\Unit\API\Logs;
use OpenTelemetry\API\Logs\Severity;
use PHPUnit\Framework\TestCase;
use Psr\Log\LogLevel;
use ValueError;
/**
* @covers \OpenTelemetry\API\Logs\Severity
*/
class SeverityTest extends TestCase
{
public function test_value_error(): void
{
$this->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],
];
}
}

View File

@ -0,0 +1,53 @@
<?php
declare(strict_types=1);
namespace OpenTelemetry\Tests\Unit\SDK\Logs;
use AssertWell\PHPUnitGlobalState\EnvironmentVariables;
use OpenTelemetry\API\Logs\LoggerProviderInterface;
use OpenTelemetry\API\Logs\NoopEventLoggerProvider;
use OpenTelemetry\SDK\Common\Configuration\Variables;
use OpenTelemetry\SDK\Logs\EventLoggerProvider;
use OpenTelemetry\SDK\Logs\EventLoggerProviderFactory;
use PHPUnit\Framework\TestCase;
/**
* @covers \OpenTelemetry\SDK\Logs\EventLoggerProviderFactory
*/
class EventLoggerProviderFactoryTest extends TestCase
{
use EnvironmentVariables;
public function tearDown(): void
{
$this->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,
],
];
}
}

View File

@ -0,0 +1,26 @@
<?php
declare(strict_types=1);
namespace Unit\SDK\Logs;
use OpenTelemetry\API\Logs\LoggerInterface;
use OpenTelemetry\API\Logs\LoggerProviderInterface;
use OpenTelemetry\SDK\Logs\EventLoggerProvider;
use PHPUnit\Framework\TestCase;
/**
* @covers \OpenTelemetry\SDK\Logs\EventLoggerProvider
*/
class EventLoggerProviderTest extends TestCase
{
public function test_emit(): void
{
$loggerProvider = $this->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']);
}
}

View File

@ -0,0 +1,103 @@
<?php
declare(strict_types=1);
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;
/**
* @covers \OpenTelemetry\SDK\Logs\EventLogger
*/
class EventLoggerTest extends TestCase
{
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);
$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',
]);
$this->assertEquals($expected, $logRecord);
return true;
}));
$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']);
}
}

View File

@ -7,6 +7,7 @@ namespace OpenTelemetry\Tests\Unit\SDK;
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 @@ class SdkAutoloaderTest extends TestCase
$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');
}

View File

@ -5,6 +5,7 @@ declare(strict_types=1);
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 @@ class SdkBuilderTest extends TestCase
$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 @@ class SdkBuilderTest extends TestCase
$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 @@ class SdkBuilderTest extends TestCase
$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();
}
}

View File

@ -5,6 +5,7 @@ declare(strict_types=1);
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 @@ class SdkTest extends TestCase
$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());
}
}