From 0bddb0f3d07ab06a02f7167ca23a4b8265c10ec0 Mon Sep 17 00:00:00 2001 From: Jack Berg Date: Mon, 29 Dec 2025 11:07:03 -0600 Subject: [PATCH 1/2] Add support for new logger config minimum_severity and trace_based properties --- .../fileconfig/LoggerProviderFactory.java | 75 ++++++++++++++++++- .../fileconfig/LoggerProviderFactoryTest.java | 48 +++++++++++- 2 files changed, 119 insertions(+), 4 deletions(-) diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LoggerProviderFactory.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LoggerProviderFactory.java index 98b06f4700e..e1c15f06e7b 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LoggerProviderFactory.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LoggerProviderFactory.java @@ -7,17 +7,20 @@ import static io.opentelemetry.sdk.extension.incubator.fileconfig.FileConfigUtil.requireNonNull; +import io.opentelemetry.api.logs.Severity; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalLoggerConfigModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalLoggerConfiguratorModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalLoggerMatcherAndConfigModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LogRecordProcessorModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LoggerProviderModel; +import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel.SeverityNumber; import io.opentelemetry.sdk.internal.ScopeConfigurator; import io.opentelemetry.sdk.internal.ScopeConfiguratorBuilder; import io.opentelemetry.sdk.logs.LogLimits; import io.opentelemetry.sdk.logs.SdkLoggerProvider; import io.opentelemetry.sdk.logs.SdkLoggerProviderBuilder; import io.opentelemetry.sdk.logs.internal.LoggerConfig; +import io.opentelemetry.sdk.logs.internal.LoggerConfigBuilder; import io.opentelemetry.sdk.logs.internal.SdkLoggerProviderUtil; import java.util.List; @@ -97,10 +100,78 @@ private static class LoggerConfigFactory @Override public LoggerConfig create( ExperimentalLoggerConfigModel model, DeclarativeConfigContext context) { + LoggerConfigBuilder configBuilder = LoggerConfig.builder(); if (model.getDisabled() != null && model.getDisabled()) { - return LoggerConfig.disabled(); + configBuilder.setEnabled(false); } - return LoggerConfig.defaultConfig(); + if (model.getTraceBased() != null && model.getTraceBased()) { + configBuilder.setTraceBased(true); + } + if (model.getMinimumSeverity() != null) { + configBuilder.setMinimumSeverity( + SeverityNumberFactory.INSTANCE.create(model.getMinimumSeverity(), context)); + } + return configBuilder.build(); + } + } + + // Visible for testing + static class SeverityNumberFactory implements Factory { + static final SeverityNumberFactory INSTANCE = new SeverityNumberFactory(); + + @Override + public Severity create(SeverityNumber model, DeclarativeConfigContext context) { + switch (model) { + case TRACE: + return Severity.TRACE; + case TRACE_2: + return Severity.TRACE2; + case TRACE_3: + return Severity.TRACE3; + case TRACE_4: + return Severity.TRACE4; + case DEBUG: + return Severity.DEBUG; + case DEBUG_2: + return Severity.DEBUG2; + case DEBUG_3: + return Severity.DEBUG3; + case DEBUG_4: + return Severity.DEBUG4; + case INFO: + return Severity.INFO; + case INFO_2: + return Severity.INFO2; + case INFO_3: + return Severity.INFO3; + case INFO_4: + return Severity.INFO4; + case WARN: + return Severity.WARN; + case WARN_2: + return Severity.WARN2; + case WARN_3: + return Severity.WARN3; + case WARN_4: + return Severity.WARN4; + case ERROR: + return Severity.ERROR; + case ERROR_2: + return Severity.ERROR2; + case ERROR_3: + return Severity.ERROR3; + case ERROR_4: + return Severity.ERROR4; + case FATAL: + return Severity.FATAL; + case FATAL_2: + return Severity.FATAL2; + case FATAL_3: + return Severity.FATAL3; + case FATAL_4: + return Severity.FATAL4; + } + throw new IllegalArgumentException("Unrecognized severity number: " + model); } } } diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LoggerProviderFactoryTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LoggerProviderFactoryTest.java index 65761fd5c9c..b1a0f39c31a 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LoggerProviderFactoryTest.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LoggerProviderFactoryTest.java @@ -8,6 +8,7 @@ import static io.opentelemetry.sdk.logs.internal.SdkLoggerProviderUtil.setLoggerConfigurator; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; +import io.opentelemetry.api.logs.Severity; import io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporter; import io.opentelemetry.internal.testing.CleanupExtension; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; @@ -20,6 +21,7 @@ import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LogRecordLimitsModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LogRecordProcessorModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LoggerProviderModel; +import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel.SeverityNumber; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OtlpHttpExporterModel; import io.opentelemetry.sdk.internal.ScopeConfigurator; import io.opentelemetry.sdk.internal.ScopeConfiguratorBuilder; @@ -92,13 +94,20 @@ private static Stream createArguments() { .withName("foo") .withConfig( new ExperimentalLoggerConfigModel() - .withDisabled(false)))))), + .withDisabled(false) + .withTraceBased(true) + .withMinimumSeverity(SeverityNumber.INFO)))))), setLoggerConfigurator( SdkLoggerProvider.builder(), ScopeConfigurator.builder() .setDefault(LoggerConfig.disabled()) .addCondition( - ScopeConfiguratorBuilder.nameMatchesGlob("foo"), LoggerConfig.enabled()) + ScopeConfiguratorBuilder.nameMatchesGlob("foo"), + LoggerConfig.builder() + .setEnabled(true) + .setTraceBased(true) + .setMinimumSeverity(Severity.INFO) + .build()) .build()) .setLogLimits( () -> @@ -112,4 +121,39 @@ private static Stream createArguments() { .build()) .build())); } + + @ParameterizedTest + @MethodSource("severityNumberArguments") + void severityNumber(SeverityNumber model, Severity expectedSeverity) { + assertThat(LoggerProviderFactory.SeverityNumberFactory.INSTANCE.create(model, context)) + .isEqualTo(expectedSeverity); + } + + private static Stream severityNumberArguments() { + return Stream.of( + Arguments.of(SeverityNumber.TRACE, Severity.TRACE), + Arguments.of(SeverityNumber.TRACE_2, Severity.TRACE2), + Arguments.of(SeverityNumber.TRACE_3, Severity.TRACE3), + Arguments.of(SeverityNumber.TRACE_4, Severity.TRACE4), + Arguments.of(SeverityNumber.DEBUG, Severity.DEBUG), + Arguments.of(SeverityNumber.DEBUG_2, Severity.DEBUG2), + Arguments.of(SeverityNumber.DEBUG_3, Severity.DEBUG3), + Arguments.of(SeverityNumber.DEBUG_4, Severity.DEBUG4), + Arguments.of(SeverityNumber.INFO, Severity.INFO), + Arguments.of(SeverityNumber.INFO_2, Severity.INFO2), + Arguments.of(SeverityNumber.INFO_3, Severity.INFO3), + Arguments.of(SeverityNumber.INFO_4, Severity.INFO4), + Arguments.of(SeverityNumber.WARN, Severity.WARN), + Arguments.of(SeverityNumber.WARN_2, Severity.WARN2), + Arguments.of(SeverityNumber.WARN_3, Severity.WARN3), + Arguments.of(SeverityNumber.WARN_4, Severity.WARN4), + Arguments.of(SeverityNumber.ERROR, Severity.ERROR), + Arguments.of(SeverityNumber.ERROR_2, Severity.ERROR2), + Arguments.of(SeverityNumber.ERROR_3, Severity.ERROR3), + Arguments.of(SeverityNumber.ERROR_4, Severity.ERROR4), + Arguments.of(SeverityNumber.FATAL, Severity.FATAL), + Arguments.of(SeverityNumber.FATAL_2, Severity.FATAL2), + Arguments.of(SeverityNumber.FATAL_3, Severity.FATAL3), + Arguments.of(SeverityNumber.FATAL_4, Severity.FATAL4)); + } } From f4133dd5ed15915a866b3b294f31620239f90055 Mon Sep 17 00:00:00 2001 From: Jack Berg Date: Mon, 29 Dec 2025 11:58:50 -0600 Subject: [PATCH 2/2] PR feedback --- .../fileconfig/LoggerProviderFactory.java | 110 +++++++++--------- .../fileconfig/LoggerProviderFactoryTest.java | 3 +- 2 files changed, 53 insertions(+), 60 deletions(-) diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LoggerProviderFactory.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LoggerProviderFactory.java index e1c15f06e7b..67133aa1125 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LoggerProviderFactory.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LoggerProviderFactory.java @@ -108,70 +108,64 @@ public LoggerConfig create( configBuilder.setTraceBased(true); } if (model.getMinimumSeverity() != null) { - configBuilder.setMinimumSeverity( - SeverityNumberFactory.INSTANCE.create(model.getMinimumSeverity(), context)); + configBuilder.setMinimumSeverity(severityNumberToSeverity(model.getMinimumSeverity())); } return configBuilder.build(); } } // Visible for testing - static class SeverityNumberFactory implements Factory { - static final SeverityNumberFactory INSTANCE = new SeverityNumberFactory(); - - @Override - public Severity create(SeverityNumber model, DeclarativeConfigContext context) { - switch (model) { - case TRACE: - return Severity.TRACE; - case TRACE_2: - return Severity.TRACE2; - case TRACE_3: - return Severity.TRACE3; - case TRACE_4: - return Severity.TRACE4; - case DEBUG: - return Severity.DEBUG; - case DEBUG_2: - return Severity.DEBUG2; - case DEBUG_3: - return Severity.DEBUG3; - case DEBUG_4: - return Severity.DEBUG4; - case INFO: - return Severity.INFO; - case INFO_2: - return Severity.INFO2; - case INFO_3: - return Severity.INFO3; - case INFO_4: - return Severity.INFO4; - case WARN: - return Severity.WARN; - case WARN_2: - return Severity.WARN2; - case WARN_3: - return Severity.WARN3; - case WARN_4: - return Severity.WARN4; - case ERROR: - return Severity.ERROR; - case ERROR_2: - return Severity.ERROR2; - case ERROR_3: - return Severity.ERROR3; - case ERROR_4: - return Severity.ERROR4; - case FATAL: - return Severity.FATAL; - case FATAL_2: - return Severity.FATAL2; - case FATAL_3: - return Severity.FATAL3; - case FATAL_4: - return Severity.FATAL4; - } - throw new IllegalArgumentException("Unrecognized severity number: " + model); + static Severity severityNumberToSeverity(SeverityNumber model) { + switch (model) { + case TRACE: + return Severity.TRACE; + case TRACE_2: + return Severity.TRACE2; + case TRACE_3: + return Severity.TRACE3; + case TRACE_4: + return Severity.TRACE4; + case DEBUG: + return Severity.DEBUG; + case DEBUG_2: + return Severity.DEBUG2; + case DEBUG_3: + return Severity.DEBUG3; + case DEBUG_4: + return Severity.DEBUG4; + case INFO: + return Severity.INFO; + case INFO_2: + return Severity.INFO2; + case INFO_3: + return Severity.INFO3; + case INFO_4: + return Severity.INFO4; + case WARN: + return Severity.WARN; + case WARN_2: + return Severity.WARN2; + case WARN_3: + return Severity.WARN3; + case WARN_4: + return Severity.WARN4; + case ERROR: + return Severity.ERROR; + case ERROR_2: + return Severity.ERROR2; + case ERROR_3: + return Severity.ERROR3; + case ERROR_4: + return Severity.ERROR4; + case FATAL: + return Severity.FATAL; + case FATAL_2: + return Severity.FATAL2; + case FATAL_3: + return Severity.FATAL3; + case FATAL_4: + return Severity.FATAL4; } + throw new IllegalArgumentException("Unrecognized severity number: " + model); } } diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LoggerProviderFactoryTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LoggerProviderFactoryTest.java index b1a0f39c31a..8555caa8c91 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LoggerProviderFactoryTest.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/LoggerProviderFactoryTest.java @@ -125,8 +125,7 @@ private static Stream createArguments() { @ParameterizedTest @MethodSource("severityNumberArguments") void severityNumber(SeverityNumber model, Severity expectedSeverity) { - assertThat(LoggerProviderFactory.SeverityNumberFactory.INSTANCE.create(model, context)) - .isEqualTo(expectedSeverity); + assertThat(LoggerProviderFactory.severityNumberToSeverity(model)).isEqualTo(expectedSeverity); } private static Stream severityNumberArguments() {