Please try below solution if it helps. Example
To use OpenTelemetry with App Insights in a Spring Boot application,
- Add the following dependencies to your
pom.xml
file:
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-api</artifactId>
<version>1.10.0</version>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-sdk</artifactId>
<version>1.10.0</version>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-exporter-azuremonitor</artifactId>
<version>1.0.2</version>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-instrumentation-spring-web</artifactId>
<version>1.10.0</version>
</dependency>
- Create a
RestTemplate
bean with a custom interceptor that captures request and response details. You can use theSpringWebTelemetry
class provided by OpenTelemetry to create the interceptor:
@Bean
public RestTemplate restTemplate(OpenTelemetry openTelemetry) {
RestTemplate restTemplate = new RestTemplate();
restTemplate.getInterceptors().add(new RestTemplateInterceptor(openTelemetry));
return restTemplate;
}
private static class RestTemplateInterceptor implements ClientHttpRequestInterceptor {
private final SpringWebTelemetry telemetry;
public RestTemplateInterceptor(OpenTelemetry openTelemetry) {
this.telemetry = SpringWebTelemetry.create(openTelemetry);
}
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
Span span = this.telemetry.startSpan(request, request.getURI().toString(), request.getHeaders());
try (Scope ignored = span.makeCurrent()) {
ClientHttpResponse response = execution.execute(request, body);
this.telemetry.onResponse(span, response);
return response;
} catch (Exception e) {
this.telemetry.endExceptionally(span, e);
throw e;
} finally {
this.telemetry.end(span);
}
}
}
- Create an
OpenTelemetry
bean with anAzureMonitorSpanExporter
that sends data to App Insights:
@Bean
public OpenTelemetry openTelemetry() {
AzureMonitorExporter exporter = new AzureMonitorExporterBuilder()
.connectionString(System.getenv("APPINSIGHTS_CONNECTION_STRING"))
.buildExporter();
BatchSpanProcessor spanProcessor = BatchSpanProcessor.builder(exporter)
.setMaxExportBatchSize(1024)
.setMaxQueueSize(1024 * 1024)
.build();
TracerSdkProvider tracerProvider = TracerSdkProvider.builder()
.addSpanProcessor(spanProcessor)
.build();
return OpenTelemetrySdk.builder()
.setTracerProvider(tracerProvider)
.buildAndRegisterGlobal();
}
- Set the
APPINSIGHTS_CONNECTION_STRING
environment variable to the connection string for your App Insights instance. You can find this connection string in the Azure portal by going to your App Insights resource and selecting "Export" from the menu.
With these changes, your Spring Boot application should now send telemetry data to App Insights, including request and response details captured by the custom interceptor.