diff --git a/api/pom.xml b/api/pom.xml index 10a0e7e4..51cca542 100644 --- a/api/pom.xml +++ b/api/pom.xml @@ -44,6 +44,10 @@ io.opentelemetry opentelemetry-sdk-metrics + + io.opentelemetry + opentelemetry-sdk-logs + io.opentelemetry.instrumentation opentelemetry-instrumentation-api diff --git a/api/src/main/java/io/smallrye/opentelemetry/api/OpenTelemetryHandler.java b/api/src/main/java/io/smallrye/opentelemetry/api/OpenTelemetryHandler.java new file mode 100644 index 00000000..4caef969 --- /dev/null +++ b/api/src/main/java/io/smallrye/opentelemetry/api/OpenTelemetryHandler.java @@ -0,0 +1,62 @@ +package io.smallrye.opentelemetry.api; + +import java.util.logging.Handler; +import java.util.logging.Level; +import java.util.logging.LogManager; +import java.util.logging.LogRecord; + +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.api.logs.Logger; +import io.opentelemetry.api.logs.Severity; + +public class OpenTelemetryHandler extends Handler { + private final Logger logger; + + public OpenTelemetryHandler(final Logger logger) { + this.logger = logger; + } + + @Override + public void publish(final LogRecord record) { + logger.logRecordBuilder() + .setTimestamp(record.getInstant()) + .setSeverity(toSeverity(record.getLevel())) + .setSeverityText(record.getLevel().getName()) + .setBody(record.getMessage()) + .emit(); + } + + @Override + public void flush() { + + } + + @Override + public void close() throws SecurityException { + + } + + private static Severity toSeverity(final Level level) { + if (Level.SEVERE.equals(level)) { + return Severity.ERROR; + } + if (Level.WARNING.equals(level)) { + return Severity.WARN; + } + if (Level.INFO.equals(level) || Level.CONFIG.equals(level)) { + return Severity.INFO; + } + if (Level.FINE.equals(level)) { + return Severity.DEBUG; + } + if (Level.FINER.equals(level) || Level.FINEST.equals(level) || Level.ALL.equals(level)) { + return Severity.TRACE; + } + return Severity.UNDEFINED_SEVERITY_NUMBER; + } + + public static void install(final OpenTelemetry openTelemetry) { + Logger logger = openTelemetry.getLogsBridge().loggerBuilder(OpenTelemetryConfig.INSTRUMENTATION_NAME).build(); + LogManager.getLogManager().getLogger("").addHandler(new OpenTelemetryHandler(logger)); + } +} diff --git a/implementation/cdi/src/main/java/io/smallrye/opentelemetry/implementation/cdi/OpenTelemetryProducer.java b/implementation/cdi/src/main/java/io/smallrye/opentelemetry/implementation/cdi/OpenTelemetryProducer.java index e59832dc..28e8ac37 100644 --- a/implementation/cdi/src/main/java/io/smallrye/opentelemetry/implementation/cdi/OpenTelemetryProducer.java +++ b/implementation/cdi/src/main/java/io/smallrye/opentelemetry/implementation/cdi/OpenTelemetryProducer.java @@ -34,6 +34,7 @@ import io.opentelemetry.sdk.common.CompletableResultCode; import io.smallrye.opentelemetry.api.OpenTelemetryBuilderGetter; import io.smallrye.opentelemetry.api.OpenTelemetryConfig; +import io.smallrye.opentelemetry.api.OpenTelemetryHandler; @Singleton public class OpenTelemetryProducer { @@ -53,6 +54,8 @@ public OpenTelemetry getOpenTelemetry(final OpenTelemetryConfig config) { closeables.addAll(Threads.registerObservers(openTelemetry)); closeables.addAll(GarbageCollector.registerObservers(openTelemetry)); + OpenTelemetryHandler.install(openTelemetry); + return openTelemetry; } diff --git a/implementation/cdi/src/main/resources/META-INF/microprofile-config.properties b/implementation/cdi/src/main/resources/META-INF/microprofile-config.properties deleted file mode 100644 index 97152c37..00000000 --- a/implementation/cdi/src/main/resources/META-INF/microprofile-config.properties +++ /dev/null @@ -1,2 +0,0 @@ -otel.logs.exporter=none -otel.metric.export.interval=1000 \ No newline at end of file diff --git a/test/src/main/resources/META-INF/microprofile-config.properties b/test/src/main/resources/META-INF/microprofile-config.properties index f1bf4a03..71890426 100644 --- a/test/src/main/resources/META-INF/microprofile-config.properties +++ b/test/src/main/resources/META-INF/microprofile-config.properties @@ -1,4 +1,5 @@ otel.traces.exporter=in-memory otel.metrics.exporter=in-memory +otel.logs.exporter=none otel.bsp.schedule.delay=100 otel.metric.export.interval=100