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:
parent
8031c78512
commit
500f6ee1bd
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
);
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
}
|
||||
}
|
||||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
@ -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),
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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(),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
;
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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],
|
||||
|
|
|
|||
|
|
@ -32,7 +32,6 @@ class Psr3Test extends TestCase
|
|||
[LogLevel::NOTICE],
|
||||
[LogLevel::INFO],
|
||||
[LogLevel::DEBUG],
|
||||
['unknown'],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
@ -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,
|
||||
],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
@ -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']);
|
||||
}
|
||||
}
|
||||
|
|
@ -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']);
|
||||
}
|
||||
}
|
||||
|
|
@ -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');
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue