Skip to content

Commit

Permalink
Logging OpenTelemetry extension
Browse files Browse the repository at this point in the history
  • Loading branch information
loicmathieu committed Jan 17, 2024
1 parent 7187ca9 commit fee7c47
Show file tree
Hide file tree
Showing 19 changed files with 498 additions and 0 deletions.
10 changes: 10 additions & 0 deletions bom/application/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6279,6 +6279,16 @@
<version>${project.version}</version>
</dependency>
<!-- End of Relocations, please put new extensions above this list -->
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-logging-opentelemetry</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-logging-opentelemetry-deployment</artifactId>
<version>${project.version}</version>
</dependency>

</dependencies>
</dependencyManagement>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ public enum Feature {
LIQUIBASE,
LIQUIBASE_MONGODB,
LOGGING_GELF,
LOGGING_OPENTELEMETRY,
MAILER,
MICROMETER,
MONGODB_CLIENT,
Expand Down
51 changes: 51 additions & 0 deletions extensions/logging-opentelemetry/deployment/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-logging-opentelemetry-parent</artifactId>
<version>999-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>

<artifactId>quarkus-logging-opentelemetry-deployment</artifactId>
<name>Quarkus - Logging - OpenTelemetry - Deployment</name>

<dependencies>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-arc-deployment</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-opentelemetry-deployment</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-logging-opentelemetry</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-junit5-internal</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-extension-processor</artifactId>
<version>${project.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package io.quarkus.logging.opentelemetry.deployment;

import io.quarkus.deployment.Feature;
import io.quarkus.deployment.annotations.BuildStep;
import io.quarkus.deployment.annotations.ExecutionTime;
import io.quarkus.deployment.annotations.Record;
import io.quarkus.deployment.builditem.FeatureBuildItem;
import io.quarkus.deployment.builditem.LogHandlerBuildItem;
import io.quarkus.logging.opentelemetry.runtime.OpenTelemetryLogConfig;
import io.quarkus.logging.opentelemetry.runtime.OpenTelemetryLogRecorder;

class OpenTelemetryLogHandlerProcessor {

@BuildStep
FeatureBuildItem feature() {
return new FeatureBuildItem(Feature.LOGGING_OPENTELEMETRY);
}

@BuildStep
@Record(ExecutionTime.RUNTIME_INIT)
LogHandlerBuildItem build(OpenTelemetryLogRecorder recorder, OpenTelemetryLogConfig config) {
return new LogHandlerBuildItem(recorder.initializeHandler(config));
}
}
20 changes: 20 additions & 0 deletions extensions/logging-opentelemetry/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-extensions-parent</artifactId>
<version>999-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>

<artifactId>quarkus-logging-opentelemetry-parent</artifactId>
<packaging>pom</packaging>
<name>Quarkus - Logging - OpenTelemetry</name>

<modules>
<module>deployment</module>
<module>runtime</module>
</modules>
</project>
58 changes: 58 additions & 0 deletions extensions/logging-opentelemetry/runtime/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-logging-opentelemetry-parent</artifactId>
<version>999-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>

<artifactId>quarkus-logging-opentelemetry</artifactId>
<name>Quarkus - Logging - OpenTelemetry - Runtime</name>

<dependencies>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-arc</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-opentelemetry</artifactId>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-extension-maven-plugin</artifactId>
<version>${project.version}</version>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>extension-descriptor</goal>
</goals>
<configuration>
<deployment>${project.groupId}:${project.artifactId}-deployment:${project.version}</deployment>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-extension-processor</artifactId>
<version>${project.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package io.quarkus.logging.opentelemetry.runtime;

import io.quarkus.runtime.annotations.ConfigItem;
import io.quarkus.runtime.annotations.ConfigPhase;
import io.quarkus.runtime.annotations.ConfigRoot;

@ConfigRoot(phase = ConfigPhase.RUN_TIME, name = "log.handler.open-telemetry")
public class OpenTelemetryLogConfig {
/**
* Determine whether to enable the OpenTelemetry logging handler
*/
@ConfigItem
public boolean enabled;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package io.quarkus.logging.opentelemetry.runtime;

import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogRecord;

import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.logs.Logger;
import io.opentelemetry.api.logs.Severity;

public class OpenTelemetryLogHandler extends Handler {
private final Logger openTelemetry;

public OpenTelemetryLogHandler(OpenTelemetry openTelemetry) {
this.openTelemetry = openTelemetry.getLogsBridge().get("quarkus-log-appender");
}

@Override
public void publish(LogRecord record) {
openTelemetry.logRecordBuilder()
.setSeverity(mapSeverity(record.getLevel()))
.setSeverityText(record.getLevel().getName())
.setBody(record.getMessage()) // TODO check that we didn't need to format it
.setObservedTimestamp(record.getInstant())
// TODO add attributes
.emit();
}

private Severity mapSeverity(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;
}

@Override
public void flush() {
}

@Override
public void close() throws SecurityException {
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package io.quarkus.logging.opentelemetry.runtime;

import java.util.Optional;
import java.util.logging.Handler;

import io.opentelemetry.api.GlobalOpenTelemetry;
import io.quarkus.runtime.RuntimeValue;
import io.quarkus.runtime.annotations.Recorder;

@Recorder
public class OpenTelemetryLogRecorder {
public RuntimeValue<Optional<Handler>> initializeHandler(final OpenTelemetryLogConfig config) {
if (!config.enabled) {
return new RuntimeValue<>(Optional.empty());
}

OpenTelemetryLogHandler handler = new OpenTelemetryLogHandler(GlobalOpenTelemetry.get());

return new RuntimeValue<>(Optional.of(handler));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
name: Logging Opentelemetry
#description: Do something useful.
metadata:
# keywords:
# - logging-opentelemetry
# guide: ... # To create and publish this guide, see https://github.com/quarkiverse/quarkiverse/wiki#documenting-your-extension
# categories:
# - "miscellaneous"
# status: "preview"
1 change: 1 addition & 0 deletions extensions/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,7 @@
<!-- Logging -->
<module>logging-json</module>
<module>logging-gelf</module>
<module>logging-opentelemetry</module>

<!-- Templating -->
<module>qute</module>
Expand Down
Loading

0 comments on commit fee7c47

Please sign in to comment.