diff --git a/src/API/Logs/LoggerInterface.php b/src/API/Logs/LoggerInterface.php index 4e1bc3931..9ab08e440 100644 --- a/src/API/Logs/LoggerInterface.php +++ b/src/API/Logs/LoggerInterface.php @@ -11,4 +11,11 @@ interface LoggerInterface * @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; + + /** + * Determine if the logger is enabled. Logs bridge API authors SHOULD call this method each time they + * are about to generate a LogRecord, to avoid performing computationally expensive work. + * @experimental + */ + public function enabled(): bool; } diff --git a/src/API/Logs/NoopLogger.php b/src/API/Logs/NoopLogger.php index faacd5e10..9267ca545 100644 --- a/src/API/Logs/NoopLogger.php +++ b/src/API/Logs/NoopLogger.php @@ -30,4 +30,9 @@ public function emit(LogRecord $logRecord): void public function log($level, $message, array $context = []): void { } + + public function enabled(): bool + { + return false; + } } diff --git a/src/API/Metrics/AsynchronousInstrument.php b/src/API/Metrics/AsynchronousInstrument.php index fc552c83f..e25f3d766 100644 --- a/src/API/Metrics/AsynchronousInstrument.php +++ b/src/API/Metrics/AsynchronousInstrument.php @@ -7,6 +7,6 @@ /** * Marker interface for asynchronous instruments. */ -interface AsynchronousInstrument +interface AsynchronousInstrument extends Instrument { } diff --git a/src/API/Metrics/Instrument.php b/src/API/Metrics/Instrument.php new file mode 100644 index 000000000..034da34fb --- /dev/null +++ b/src/API/Metrics/Instrument.php @@ -0,0 +1,14 @@ + new Aggregation\LastValueAggregation(), default => null, }; - // @codeCoverageIgnoreEnd } } diff --git a/src/SDK/Metrics/MetricRegistry/MetricRegistry.php b/src/SDK/Metrics/MetricRegistry/MetricRegistry.php index 55e287be7..63d5c59a7 100644 --- a/src/SDK/Metrics/MetricRegistry/MetricRegistry.php +++ b/src/SDK/Metrics/MetricRegistry/MetricRegistry.php @@ -174,4 +174,9 @@ public function collectAndPush(iterable $streamIds): void } } } + + public function enabled(Instrument $instrument): bool + { + return isset($this->instrumentToStreams[spl_object_id($instrument)]); + } } diff --git a/src/SDK/Metrics/MetricRegistry/MetricWriterInterface.php b/src/SDK/Metrics/MetricRegistry/MetricWriterInterface.php index e5ff7eb5c..0b64dfb40 100644 --- a/src/SDK/Metrics/MetricRegistry/MetricWriterInterface.php +++ b/src/SDK/Metrics/MetricRegistry/MetricWriterInterface.php @@ -17,4 +17,5 @@ public function record(Instrument $instrument, $value, iterable $attributes = [] public function registerCallback(Closure $callback, Instrument $instrument, Instrument ...$instruments): int; public function unregisterCallback(int $callbackId): void; + public function enabled(Instrument $instrument): bool; } diff --git a/src/SDK/Metrics/ObservableInstrumentTrait.php b/src/SDK/Metrics/ObservableInstrumentTrait.php index 6b9ea9be8..af80b906a 100644 --- a/src/SDK/Metrics/ObservableInstrumentTrait.php +++ b/src/SDK/Metrics/ObservableInstrumentTrait.php @@ -59,4 +59,9 @@ public function observe(callable $callback): ObservableCallbackInterface $this->referenceCounter, ); } + + public function enabled(): bool + { + return $this->writer->enabled($this->instrument); + } } diff --git a/src/SDK/Metrics/SynchronousInstrumentTrait.php b/src/SDK/Metrics/SynchronousInstrumentTrait.php index d5ffa7e33..7da31cd3c 100644 --- a/src/SDK/Metrics/SynchronousInstrumentTrait.php +++ b/src/SDK/Metrics/SynchronousInstrumentTrait.php @@ -41,4 +41,9 @@ public function write($amount, iterable $attributes = [], $context = null): void { $this->writer->record($this->instrument, $amount, $attributes, $context); } + + public function enabled(): bool + { + return true; + } } diff --git a/src/SDK/Trace/Tracer.php b/src/SDK/Trace/Tracer.php index 5f9c56920..4115b7ca2 100644 --- a/src/SDK/Trace/Tracer.php +++ b/src/SDK/Trace/Tracer.php @@ -41,4 +41,9 @@ public function getInstrumentationScope(): InstrumentationScopeInterface { return $this->instrumentationScope; } + + public function enabled(): bool + { + return true; + } } diff --git a/tests/Unit/API/Logs/NoopLoggerTest.php b/tests/Unit/API/Logs/NoopLoggerTest.php index ce0e35e6c..4bc1f5263 100644 --- a/tests/Unit/API/Logs/NoopLoggerTest.php +++ b/tests/Unit/API/Logs/NoopLoggerTest.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace OpenTelemetry\Example\Unit\API\Logs; +namespace OpenTelemetry\Tests\Unit\API\Logs; use OpenTelemetry\API\Logs\NoopLogger; use PHPUnit\Framework\Attributes\CoversClass; @@ -15,4 +15,9 @@ public function test_get_instance(): void { $this->assertInstanceOf(NoopLogger::class, NoopLogger::getInstance()); } + + public function test_enabled(): void + { + $this->assertFalse(NoopLogger::getInstance()->enabled()); + } } diff --git a/tests/Unit/API/Trace/NoopTracerTest.php b/tests/Unit/API/Trace/NoopTracerTest.php new file mode 100644 index 000000000..1ee49eb9c --- /dev/null +++ b/tests/Unit/API/Trace/NoopTracerTest.php @@ -0,0 +1,29 @@ +assertSame(NoopTracer::getInstance(), NoopTracer::getInstance()); + } + + public function test_span_builder(): void + { + $this->assertInstanceOf(NoopSpanBuilder::class, NoopTracer::getInstance()->spanBuilder('test')); + } + + public function test_enabled(): void + { + $this->assertFalse(NoopTracer::getInstance()->enabled()); + } +} diff --git a/tests/Unit/SDK/Logs/LoggerTest.php b/tests/Unit/SDK/Logs/LoggerTest.php index 8400f87db..11670055b 100644 --- a/tests/Unit/SDK/Logs/LoggerTest.php +++ b/tests/Unit/SDK/Logs/LoggerTest.php @@ -109,4 +109,10 @@ public function test_logs_dropped_attributes(): void $logger->emit($record); } + + public function test_enabled(): void + { + $logger = new Logger($this->sharedState, $this->scope); + $this->assertTrue($logger->enabled()); + } } diff --git a/tests/Unit/SDK/Metrics/InstrumentTest.php b/tests/Unit/SDK/Metrics/InstrumentTest.php index 362653539..35c966033 100644 --- a/tests/Unit/SDK/Metrics/InstrumentTest.php +++ b/tests/Unit/SDK/Metrics/InstrumentTest.php @@ -20,6 +20,7 @@ use OpenTelemetry\SDK\Metrics\ObservableCallback; use OpenTelemetry\SDK\Metrics\ObservableCallbackDestructor; use OpenTelemetry\SDK\Metrics\ObservableCounter; +use OpenTelemetry\SDK\Metrics\ObservableInstrumentTrait; use OpenTelemetry\SDK\Metrics\ReferenceCounterInterface; use OpenTelemetry\SDK\Metrics\StalenessHandler\NoopStalenessHandler; use OpenTelemetry\SDK\Metrics\Stream\MetricAggregator; @@ -36,6 +37,7 @@ #[CoversClass(UpDownCounter::class)] #[CoversClass(Histogram::class)] #[CoversClass(ObservableCallback::class)] +#[CoversClass(ObservableInstrumentTrait::class)] final class InstrumentTest extends TestCase { @@ -239,4 +241,25 @@ public function test_observable_callback_does_not_acquire_persistent_on_destruct /** @noinspection PhpExpressionResultUnusedInspection */ new ObservableCallback($writer, $referenceCounter, 1, $callbackDestructor, new stdClass()); } + + public function test_synchronous_enabled(): void + { + $w = $this->createMock(MetricWriterInterface::class); + $c = $this->createMock(ReferenceCounterInterface::class); + $i = new Instrument(InstrumentType::UP_DOWN_COUNTER, 'test', null, null); + $counter = new Counter($w, $i, $c); + + $this->assertTrue($counter->enabled()); + } + + public function test_asynchronous_enabled(): void + { + $w = $this->createMock(MetricWriterInterface::class); + $w->method('enabled')->willReturn(true); + $c = $this->createMock(ReferenceCounterInterface::class); + $i = new Instrument(InstrumentType::UP_DOWN_COUNTER, 'test', null, null); + $counter = new ObservableCounter($w, $i, $c, new WeakMap()); + + $this->assertTrue($counter->enabled()); + } } diff --git a/tests/Unit/SDK/Trace/TracerTest.php b/tests/Unit/SDK/Trace/TracerTest.php index 94341733e..7719bc4bd 100644 --- a/tests/Unit/SDK/Trace/TracerTest.php +++ b/tests/Unit/SDK/Trace/TracerTest.php @@ -63,4 +63,9 @@ public function test_returns_noop_span_builder_if_shared_state_is_shutdown(): vo $this->tracerSharedState->method('hasShutdown')->willReturn(true); //@phpstan-ignore-line $this->assertInstanceOf(NoopSpanBuilder::class, $this->tracer->spanBuilder('foo')); } + + public function test_enabled(): void + { + $this->assertTrue($this->tracer->enabled()); + } }