I am using spring boot 2.7.3 to add observability through open telemetry ( manual instrumentation ).
Things I have done so far.
Added these dependencies in pom.xml
io.opentelemetry.instrumentation
opentelemetry-logback-appender-1.0
1.31.0-alpha
io.opentelemetry
opentelemetry-sdk
1.31.0
io.opentelemetry.instrumentation
opentelemetry-instrumentation-api-semconv
1.31.0-alpha
io.opentelemetry
opentelemetry-exporter-otlp-common
1.31.0
These are existing dependencies
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-brave</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-exporter-otlp</artifactId>
<version>1.23.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-sleuth-otel-autoconfigure -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-otel-autoconfigure</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-sdk-metrics</artifactId>
<version>1.22.0</version>
</dependency>
<!-- Micrometer Core -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-core</artifactId>
</dependency>
<!-- Micrometer Prometheus Registry -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
<!-- Spring Boot Actuator for exposing metrics -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
are these are the configuration beans
@Bean
public Tracer tracer(OpenTelemetry openTelemetry) {
return openTelemetry.getTracer("service-name");
}
@Bean
OpenTelemetry openTelemetry(SdkLoggerProvider sdkLoggerProvider, SdkTracerProvider sdkTracerProvider, ContextPropagators contextPropagators) {
OpenTelemetrySdk openTelemetrySdk = OpenTelemetrySdk.builder()
.setLoggerProvider(sdkLoggerProvider)
.setTracerProvider(sdkTracerProvider)
.setPropagators(contextPropagators)
.build();
OpenTelemetryAppender.install(openTelemetrySdk);
return openTelemetrySdk;
}
@Bean
SdkLoggerProvider otelSdkLoggerProvider(Environment environment, ObjectProvider logRecordProcessors) {
String applicationName = environment.getProperty("spring.application.name", "application");
Resource springResource = Resource.create(Attributes.of(ResourceAttributes.SERVICE_NAME, applicationName));
SdkLoggerProviderBuilder builder = SdkLoggerProvider.builder()
.setResource(Resource.getDefault().merge(springResource));
logRecordProcessors.orderedStream().forEach(builder::addLogRecordProcessor);
return builder.build();
}
@Bean
LogRecordProcessor otelLogRecordProcessor() {
return BatchLogRecordProcessor
.builder(
OtlpGrpcLogRecordExporter.builder()
.setEndpoint("http://localhost:4317")
.build())
.build();
}
so Now opentelemetry-logback-appender-1.0
ask me to bump my
<dependency>
<groupId>io.opentelemetry.instrumentation</groupId>
<artifactId>opentelemetry-instrumentation-api-semconv</artifactId>
<version>{version}</version>
</dependency>
version >= 1.29.0 but when I update, then spring-cloud-sleuth-otel-autoconfigure shows incompatibility with 1.29.0-alpha and ask to demote it to 1.22.0-alpha.
This is causing circular dependency for me, what should be the best practive to use spring cloud sleuth with Open Telemetry.
Note: I am trying to add Loki integration with my service following this blog
https://medium.com/@ahmadalammar/comprehensive-observability-in-spring-boot-using-opentelemetry-prometheus-grafana-tempo-and-e08842ae96be
This is my docker-compose file to give a hint what I am trying to achieve
version: "4.32"
services:
collector:
image: otel/opentelemetry-collector:0.72.0
command: [ "--config=/etc/otel-config.yml" ]
volumes:
- ./otel-collector/otel-config.yml:/etc/otel-config.yml
ports:
- "4317:4317" # OTLP gRPC endpoint
- "55681:55681" # OTLP HTTP endpoint
- "8889:8889" # Prometheus exporter metrics
depends_on:
- jaeger-service
prometheus:
container_name: prometheus
image: prom/prometheus
command:
- --config.file=/etc/prometheus/prometheus.yml
- --enable-feature=exemplar-storage
- --web.enable-remote-write-receiver
volumes:
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
restart: always
ports:
- '9090:9090'
depends_on:
- collector
jaeger-service:
image: jaegertracing/all-in-one:latest
container_name: jaeger_service_container
ports:
- "5775:5775"
- "5778:5778"
- "14250:14250" # gRPC endpoint for OTLP
- "14268:14268" # HTTP endpoint for OTLP
- "16686:16686" # Jaeger UI
- "14250:14250" # Jaeger gRPC endpoint
environment:
- COLLECTOR_OTLP_ENABLED=true
grafana:
container_name: grafana
image: grafana/grafana
volumes:
- ./grafana/grafana.yml:/etc/grafana/provisioning/datasources/datasources.yml
restart: always
ports:
- "3000:3000"
depends_on:
- prometheus
- jaeger-service
```