diff --git a/instrumentation/logback/logback-appender-1.0/library/src/main/java/io/opentelemetry/instrumentation/logback/appender/v1_0/internal/LoggingEventMapper.java b/instrumentation/logback/logback-appender-1.0/library/src/main/java/io/opentelemetry/instrumentation/logback/appender/v1_0/internal/LoggingEventMapper.java index c918dd101840..cd04995c897f 100644 --- a/instrumentation/logback/logback-appender-1.0/library/src/main/java/io/opentelemetry/instrumentation/logback/appender/v1_0/internal/LoggingEventMapper.java +++ b/instrumentation/logback/logback-appender-1.0/library/src/main/java/io/opentelemetry/instrumentation/logback/appender/v1_0/internal/LoggingEventMapper.java @@ -70,14 +70,6 @@ public final class LoggingEventMapper { private static final AttributeKey> LOG_BODY_PARAMETERS = AttributeKey.stringArrayKey("log.body.parameters"); - private static final ClassValue valueField = - new ClassValue() { - @Override - protected FieldReader computeValue(Class type) { - return createFieldReader(type); - } - }; - private final boolean captureExperimentalAttributes; private final List captureMdcAttributes; private final boolean captureAllMdcAttributes; @@ -496,7 +488,7 @@ private static void captureLogstashMarker(AttributesBuilder attributes, Marker m private static void captureLogstashMarkerAttributes( AttributesBuilder attributes, Object logstashMarker) { - FieldReader fieldReader = valueField.get(logstashMarker.getClass()); + FieldReader fieldReader = LogstashFieldReaderHolder.valueField.get(logstashMarker.getClass()); if (fieldReader != null) { fieldReader.read(attributes, logstashMarker); } @@ -591,6 +583,8 @@ private static boolean supportsLogstashMarkers() { Class.forName("net.logstash.logback.marker.LogstashMarker"); Class.forName("net.logstash.logback.marker.SingleFieldAppendingMarker"); Class.forName("net.logstash.logback.marker.MapEntriesAppendingMarker"); + // missing in some android versions, used for capturing logstash attributes + Class.forName("java.lang.ClassValue"); } catch (ClassNotFoundException e) { return false; } @@ -602,6 +596,17 @@ private interface FieldReader { void read(AttributesBuilder attributes, Object logstashMarker); } + private static class LogstashFieldReaderHolder { + // keeping this field in a separate class because ClassValue is missing in some android versions + static final ClassValue valueField = + new ClassValue() { + @Override + protected FieldReader computeValue(Class type) { + return createFieldReader(type); + } + }; + } + /** * This class is internal and is hence not for public use. Its APIs are unstable and can change at * any time.