diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogRecordBuilder.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogRecordBuilder.java index 7f51ad9f4b2..d2a566af4ac 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogRecordBuilder.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogRecordBuilder.java @@ -140,6 +140,11 @@ public void emit() { if (loggerSharedState.hasBeenShutdown()) { return; } + + if (logger.canEmit()) { + loggerSharedState.getLoggerInstrumentation().emitLog(); + } + Context context = this.context == null ? Context.current() : this.context; if (!logger.isEnabled(severity, context)) { return; @@ -149,7 +154,6 @@ public void emit() { ? this.loggerSharedState.getClock().now() : this.observedTimestampEpochNanos; - loggerSharedState.getLoggerInstrumentation().emitLog(); loggerSharedState .getLogRecordProcessor() .onEmit(context, createLogRecord(context, observedTimestampEpochNanos)); diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogger.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogger.java index 20c74169d80..be9e083ac3d 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogger.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogger.java @@ -80,6 +80,11 @@ public boolean isEnabled(Severity severity, Context context) { return true; } + /** Returns whether this logger can ever emit any log records. */ + boolean canEmit() { + return loggerEnabled; + } + @Override public LogRecordBuilder logRecordBuilder() { if (loggerEnabled) { diff --git a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/SdkLoggerProviderMetricsTest.java b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/SdkLoggerProviderMetricsTest.java index f7a07acab84..e505e67e959 100644 --- a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/SdkLoggerProviderMetricsTest.java +++ b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/SdkLoggerProviderMetricsTest.java @@ -16,6 +16,7 @@ import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.logs.Logger; import io.opentelemetry.api.logs.LoggerProvider; +import io.opentelemetry.api.logs.Severity; import io.opentelemetry.api.metrics.MeterProvider; import io.opentelemetry.internal.testing.slf4j.SuppressLogger; import io.opentelemetry.sdk.common.CompletableResultCode; @@ -24,6 +25,7 @@ import io.opentelemetry.sdk.logs.export.BatchLogRecordProcessorBuilder; import io.opentelemetry.sdk.logs.export.LogRecordExporter; import io.opentelemetry.sdk.logs.export.SimpleLogRecordProcessor; +import io.opentelemetry.sdk.logs.internal.LoggerConfig; import io.opentelemetry.sdk.metrics.SdkMeterProvider; import io.opentelemetry.sdk.testing.exporter.InMemoryLogRecordExporter; import io.opentelemetry.sdk.testing.exporter.InMemoryMetricReader; @@ -314,4 +316,60 @@ void simpleExportError() { .hasLongSumSatisfying( s -> s.hasPointsSatisfying(p -> p.hasValue(1).hasAttributes()))); } + + @Test + void filteringLogger() { + InMemoryMetricReader metricReader = InMemoryMetricReader.create(); + MeterProvider meterProvider = + SdkMeterProvider.builder().registerMetricReader(metricReader).build(); + + InMemoryLogRecordExporter exporter = InMemoryLogRecordExporter.create(); + LoggerProvider loggerProvider = + SdkLoggerProvider.builder() + .addLoggerConfiguratorCondition( + scope -> scope.getName().equals("warnAbove"), + LoggerConfig.builder().setMinimumSeverity(Severity.WARN).build()) + .addLoggerConfiguratorCondition( + scope -> scope.getName().equals("disabled"), LoggerConfig.disabled()) + .addLogRecordProcessor( + SimpleLogRecordProcessor.builder(exporter) + .setMeterProvider(() -> meterProvider) + .build()) + .setMeterProvider(() -> meterProvider) + .build(); + + Logger defaultLogger = loggerProvider.get("test"); // 2 created, 2 emitted + defaultLogger.logRecordBuilder().setSeverity(Severity.WARN).emit(); + defaultLogger.logRecordBuilder().setSeverity(Severity.INFO).emit(); + + Logger warnAbove = loggerProvider.get("warnAbove"); // 2 created, 1 emitted + warnAbove.logRecordBuilder().setSeverity(Severity.WARN).emit(); + warnAbove.logRecordBuilder().setSeverity(Severity.INFO).emit(); + + Logger disabled = loggerProvider.get("disabled"); // 0 created, 0 emitted + disabled.logRecordBuilder().setSeverity(Severity.WARN).emit(); + disabled.logRecordBuilder().setSeverity(Severity.INFO).emit(); + + assertThat(metricReader.collectAllMetrics()) + .satisfiesExactlyInAnyOrder( + m -> + assertThat(m) + .hasName("otel.sdk.log.created") + .hasLongSumSatisfying( + s -> s.hasPointsSatisfying(p -> p.hasValue(4).hasAttributes())), + m -> + assertThat(m) + .hasName("otel.sdk.processor.log.processed") + .hasLongSumSatisfying( + s -> + s.hasPointsSatisfying( + p -> + p.hasValue(3) + .hasAttributes( + Attributes.of( + OTEL_COMPONENT_NAME, + "simple_log_processor/0", + OTEL_COMPONENT_TYPE, + "simple_log_processor"))))); + } }