diff --git a/build.gradle b/build.gradle index a2361b2e..a74c4948 100644 --- a/build.gradle +++ b/build.gradle @@ -253,7 +253,7 @@ abstract class ProtobufAlignmentRule implements ComponentMetadataRule { void execute(ComponentMetadataContext ctx) { ctx.details.with { if (id.group.startsWith("com.google.protobuf")) { - belongsTo("icom.google.protobuf:protobuf-virtual-platform:${id.version}") + belongsTo("com.google.protobuf:protobuf-virtual-platform:${id.version}") } } } diff --git a/gcp/logback-logstash-encoder-gcp/src/main/java/no/entur/logging/cloud/gcp/logback/logstash/StackdriverLogstashEncoder.java b/gcp/logback-logstash-encoder-gcp/src/main/java/no/entur/logging/cloud/gcp/logback/logstash/StackdriverLogstashEncoder.java index 6f48139c..cd701706 100644 --- a/gcp/logback-logstash-encoder-gcp/src/main/java/no/entur/logging/cloud/gcp/logback/logstash/StackdriverLogstashEncoder.java +++ b/gcp/logback-logstash-encoder-gcp/src/main/java/no/entur/logging/cloud/gcp/logback/logstash/StackdriverLogstashEncoder.java @@ -7,6 +7,7 @@ import net.logstash.logback.composite.loggingevent.LogLevelJsonProvider; import net.logstash.logback.composite.loggingevent.LogLevelValueJsonProvider; import net.logstash.logback.composite.loggingevent.LoggingEventJsonProviders; +import net.logstash.logback.composite.loggingevent.MdcJsonProvider; import net.logstash.logback.composite.loggingevent.MessageJsonProvider; import net.logstash.logback.composite.loggingevent.StackTraceJsonProvider; import net.logstash.logback.composite.loggingevent.TagsJsonProvider; @@ -34,6 +35,8 @@ protected AbstractCompositeJsonFormatter createFormatter() { LoggingEventJsonProviders loggingEventJsonProviders = formatter.getProviders(); List> providers = new ArrayList<>(loggingEventJsonProviders.getProviders()); + boolean openTelemetry = detectOpenTelemetry(); // TODO check if open telemetry is on class path + for (JsonProvider jsonProvider : providers) { if(jsonProvider instanceof MessageJsonProvider) { loggingEventJsonProviders.removeProvider(jsonProvider); @@ -49,6 +52,11 @@ protected AbstractCompositeJsonFormatter createFormatter() { // stackdriver supports the equivalent functionality as the log level value directly in queries // see https://cloud.google.com/logging/docs/view/advanced-filters loggingEventJsonProviders.removeProvider(jsonProvider); + } else if(jsonProvider instanceof MdcJsonProvider p) { + if(openTelemetry) { + loggingEventJsonProviders.removeProvider(jsonProvider); + loggingEventJsonProviders.addProvider(new StackdriverOpenTelemetryTraceMdcJsonProvider()); + } } } @@ -57,5 +65,14 @@ protected AbstractCompositeJsonFormatter createFormatter() { return formatter; } - + + private boolean detectOpenTelemetry() { + try { + Class.forName("io.opentelemetry.api.OpenTelemetry"); + return true; + } catch (Exception e) { + return false; + } + } + } diff --git a/gcp/logback-logstash-encoder-gcp/src/main/java/no/entur/logging/cloud/gcp/logback/logstash/StackdriverOpenTelemetryTraceMdcJsonProvider.java b/gcp/logback-logstash-encoder-gcp/src/main/java/no/entur/logging/cloud/gcp/logback/logstash/StackdriverOpenTelemetryTraceMdcJsonProvider.java new file mode 100644 index 00000000..514fb0bd --- /dev/null +++ b/gcp/logback-logstash-encoder-gcp/src/main/java/no/entur/logging/cloud/gcp/logback/logstash/StackdriverOpenTelemetryTraceMdcJsonProvider.java @@ -0,0 +1,54 @@ +package no.entur.logging.cloud.gcp.logback.logstash; + +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.spi.DeferredProcessingAware; +import com.fasterxml.jackson.core.JsonGenerator; +import net.logstash.logback.composite.AbstractFieldJsonProvider; +import net.logstash.logback.composite.AbstractJsonProvider; +import net.logstash.logback.composite.FieldNamesAware; +import net.logstash.logback.fieldnames.LogstashFieldNames; + +import java.io.IOException; +import java.util.Map; + +/** + * + * A simpler MDC provider. Renames MDC field name traceId to trace + * + */ + +public class StackdriverOpenTelemetryTraceMdcJsonProvider extends AbstractJsonProvider { + + @Override + public void writeTo(JsonGenerator generator, ILoggingEvent event) throws IOException { + Map mdcProperties = event.getMDCPropertyMap(); + if (mdcProperties != null && !mdcProperties.isEmpty()) { + if(mdcProperties.containsKey("traceId")) { + for (Map.Entry entry : mdcProperties.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + if(key == null || value == null) { + continue; + } + + if(key.equals("traceId")) { + generator.writeStringField("trace", value); + continue; + } + + generator.writeStringField(key, value); + } + } else { + for (Map.Entry entry : mdcProperties.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + if(key == null || value == null) { + continue; + } + generator.writeStringField(key, value); + } + } + } + } + +}