Support older log4j2 versions in the javaagent (#5979)

This commit is contained in:
Trask Stalnaker 2022-05-05 12:40:54 -07:00 committed by GitHub
parent 2a7700351d
commit 246364d2fc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 26 additions and 28 deletions

View File

@ -6,7 +6,7 @@ muzzle {
pass { pass {
group.set("org.apache.logging.log4j") group.set("org.apache.logging.log4j")
module.set("log4j-core") module.set("log4j-core")
versions.set("[2.11.0,)") versions.set("[2.0,)")
assertInverse.set(true) assertInverse.set(true)
} }
} }

View File

@ -30,7 +30,7 @@ public final class Log4jHelper {
LogBuilder builder = LogBuilder builder =
AgentLogEmitterProvider.get().logEmitterBuilder(instrumentationName).build().logBuilder(); AgentLogEmitterProvider.get().logEmitterBuilder(instrumentationName).build().logBuilder();
Map<String, String> contextData = ThreadContext.getImmutableContext(); Map<String, String> contextData = ThreadContext.getImmutableContext();
mapper.mapLogEvent(builder, message, level, throwable, null, contextData); mapper.mapLogEvent(builder, message, level, throwable, contextData);
builder.emit(); builder.emit();
} }

View File

@ -13,6 +13,7 @@ import io.opentelemetry.instrumentation.log4j.appender.v2_17.internal.LogEventMa
import io.opentelemetry.instrumentation.sdk.appender.internal.DelegatingLogEmitterProvider; import io.opentelemetry.instrumentation.sdk.appender.internal.DelegatingLogEmitterProvider;
import io.opentelemetry.sdk.logs.SdkLogEmitterProvider; import io.opentelemetry.sdk.logs.SdkLogEmitterProvider;
import java.io.Serializable; import java.io.Serializable;
import java.util.concurrent.TimeUnit;
import java.util.function.BiConsumer; import java.util.function.BiConsumer;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import org.apache.logging.log4j.core.Appender; import org.apache.logging.log4j.core.Appender;
@ -24,6 +25,7 @@ import org.apache.logging.log4j.core.appender.AbstractAppender;
import org.apache.logging.log4j.core.config.Property; import org.apache.logging.log4j.core.config.Property;
import org.apache.logging.log4j.core.config.plugins.Plugin; import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory; import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
import org.apache.logging.log4j.core.time.Instant;
import org.apache.logging.log4j.util.ReadOnlyStringMap; import org.apache.logging.log4j.util.ReadOnlyStringMap;
@Plugin( @Plugin(
@ -74,12 +76,15 @@ public class OpenTelemetryAppender extends AbstractAppender {
logEmitterProviderHolder.get().logEmitterBuilder(instrumentationName).build().logBuilder(); logEmitterProviderHolder.get().logEmitterBuilder(instrumentationName).build().logBuilder();
ReadOnlyStringMap contextData = event.getContextData(); ReadOnlyStringMap contextData = event.getContextData();
mapper.mapLogEvent( mapper.mapLogEvent(
builder, builder, event.getMessage(), event.getLevel(), event.getThrown(), contextData);
event.getMessage(),
event.getLevel(), Instant timestamp = event.getInstant();
event.getThrown(), if (timestamp != null) {
event.getInstant(), builder.setEpoch(
contextData); TimeUnit.MILLISECONDS.toNanos(timestamp.getEpochMillisecond())
+ timestamp.getNanoOfMillisecond(),
TimeUnit.NANOSECONDS);
}
builder.emit(); builder.emit();
} }

View File

@ -19,11 +19,9 @@ import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.io.StringWriter; import java.io.StringWriter;
import java.util.List; import java.util.List;
import java.util.concurrent.TimeUnit;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import org.apache.logging.log4j.Level; import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.LogEvent; import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.time.Instant;
import org.apache.logging.log4j.message.MapMessage; import org.apache.logging.log4j.message.MapMessage;
import org.apache.logging.log4j.message.Message; import org.apache.logging.log4j.message.Message;
@ -96,7 +94,6 @@ public final class LogEventMapper<T> {
Message message, Message message,
Level level, Level level,
@Nullable Throwable throwable, @Nullable Throwable throwable,
@Nullable Instant timestamp,
T contextData) { T contextData) {
AttributesBuilder attributes = Attributes.builder(); AttributesBuilder attributes = Attributes.builder();
@ -123,13 +120,6 @@ public final class LogEventMapper<T> {
builder.setAttributes(attributes.build()); builder.setAttributes(attributes.build());
builder.setContext(Context.current()); builder.setContext(Context.current());
if (timestamp != null) {
builder.setEpoch(
TimeUnit.MILLISECONDS.toNanos(timestamp.getEpochMillisecond())
+ timestamp.getNanoOfMillisecond(),
TimeUnit.NANOSECONDS);
}
} }
// visible for testing // visible for testing
@ -155,7 +145,10 @@ public final class LogEventMapper<T> {
} }
if (captureMapMessageAttributes) { if (captureMapMessageAttributes) {
mapMessage.forEach( // TODO (trask) this could be optimized in 2.9 and later by calling MapMessage.forEach()
mapMessage
.getData()
.forEach(
(key, value) -> { (key, value) -> {
if (value != null if (value != null
&& (!checkSpecialMapMessageAttribute && (!checkSpecialMapMessageAttribute