3

Using Spring Boot 3.4.2, I want to configure logs export in opentelemetry format with Spring Actuator configuration. Example properties:

management.otlp.logging.export.enabled=true
management.otlp.logging.endpoint=http://localhost:4318/v1/logs
management.otlp.logging.headers.apikey=apikey
management.otlp.logging.transport=http
management.otlp.logging.compression=gzip

Tried adding maven dependencies:

<dependency>    
    <groupId>io.opentelemetry.instrumentation</groupId>   
    <artifactId>opentelemetry-spring-boot-starter</artifactId>
    <version>2.12.0</version>
</dependency>

<dependency>    
    <groupId>io.opentelemetry</groupId>    
    <artifactId>opentelemetry-exporter-otlp</artifactId> 
    <version>${opentelemetry.version}</version>
</dependency>

<dependency>    
    <groupId>io.opentelemetry.instrumentation</groupId>   
    <artifactId>opentelemetry-logback-appender-1.0</artifactId>    
    <version>1.28.0-alpha</version>
</dependency>

logback.xml example:

<configuration scan="true" scanPeriod="30 seconds">

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{"yyyy-MM-dd'T'HH:mm:ss.SSSXXX", UTC} [%thread] %-5level %logger{36} - %msg %replace(%replace(%ex){'[\r\n]+', ''}){'[\t]+', '&#10;&#9;'}%nopex%n</pattern>
        </encoder>
    </appender>

    <appender name="otel" class="io.opentelemetry.instrumentation.logback.appender.v1_0.OpenTelemetryAppender">
        <captureExperimentalAttributes>true</captureExperimentalAttributes>
        <captureKeyValuePairAttributes>true</captureKeyValuePairAttributes>
    </appender>

    <root level="INFO">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="otel" />
    </root>
</configuration>

But noting worked or configuration is not set into OtlpHttpLogRecordExporter. What else needs to be configured or what I'm doing wrong?

1

2 Answers 2

0

Apparently the only thing that I found missing in your example after hours of searching is :

you need to configure the OpenTelemetryAppender and invoke the "install" method with the OpenTelemetry bean which would have been auto-configured by SpringBoot.

For that I coded a BeanPostProcessor :

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.instrumentation.logback.appender.v1_0.OpenTelemetryAppender;

public class OpenTelemetryAppenderBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof OpenTelemetry openTelemetry) {
            OpenTelemetryAppender.install(openTelemetry);
        }
        return bean;
    }
}

And I use it in some class that is annoted with @Configuration :

@Bean
static OpenTelemetryAppenderBeanPostProcessor openTelemetryBeanPostProcessor() {
    return new OpenTelemetryAppenderBeanPostProcessor();
}

After that I'm able to see the logs coming into LOKI

Hope this helps

Edit : I found this documentation after answering : https://docs.spring.io/spring-boot/reference/actuator/loggers.html#actuator.loggers.opentelemetry
It shows an example of how to call the "install" method, it's different from mine.

Sign up to request clarification or add additional context in comments.

Comments

0

have you tried defining this bean:

@Component
@RequiredArgsConstructor
public class OpenTelemetryAppenderInitializer implements InitializingBean {

  private final OpenTelemetry openTelemetry;

  @Override
  public void afterPropertiesSet() {
   OpenTelemetryAppender.install(this.openTelemetry);
  }

}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.