diff --git a/ocr-service-v1/ocr-service-server/src/main/java/com/knecon/fforesight/service/ocr/v1/server/tracing/OpenTelemetryConfig.java b/ocr-service-v1/ocr-service-server/src/main/java/com/knecon/fforesight/service/ocr/v1/server/tracing/OpenTelemetryConfig.java new file mode 100644 index 0000000..c6ea3c5 --- /dev/null +++ b/ocr-service-v1/ocr-service-server/src/main/java/com/knecon/fforesight/service/ocr/v1/server/tracing/OpenTelemetryConfig.java @@ -0,0 +1,55 @@ +package com.knecon.fforesight.service.ocr.v1.server.tracing; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.api.trace.Tracer; +import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter; +import io.opentelemetry.sdk.OpenTelemetrySdk; +import io.opentelemetry.sdk.trace.SdkTracerProvider; +import io.opentelemetry.sdk.trace.export.BatchSpanProcessor; +import io.opentelemetry.sdk.trace.export.SpanExporter; +import io.opentelemetry.sdk.trace.samplers.Sampler; + +@Configuration +public class OpenTelemetryConfig { + + @Value("${management.otlp.tracing.endpoint}") + private String otlpEndpoint; + + @Value("${management.tracing.sampling.probability}") + private double samplingProbability; + + @Value("${management.tracing.enabled}") + private boolean tracingEnabled; + + + @Bean + public OpenTelemetry openTelemetry() { + + if (!tracingEnabled) { + return OpenTelemetry.noop(); + } + + SpanExporter otlpExporter = OtlpGrpcSpanExporter.builder().setEndpoint(otlpEndpoint).build(); + + SpanExporter safeExporter = new SafeSpanExporter(otlpExporter); + + SdkTracerProvider tracerProvider = SdkTracerProvider.builder() + .setSampler(Sampler.traceIdRatioBased(samplingProbability)) + .addSpanProcessor(BatchSpanProcessor.builder(safeExporter).build()) + .build(); + + return OpenTelemetrySdk.builder().setTracerProvider(tracerProvider).build(); + } + + + @Bean + public Tracer tracer(OpenTelemetry openTelemetry) { + + return openTelemetry.getTracer("com.knecon.fforesight.service.ocr.v1.server.Application"); + } + +} diff --git a/ocr-service-v1/ocr-service-server/src/main/java/com/knecon/fforesight/service/ocr/v1/server/tracing/SafeSpanExporter.java b/ocr-service-v1/ocr-service-server/src/main/java/com/knecon/fforesight/service/ocr/v1/server/tracing/SafeSpanExporter.java new file mode 100644 index 0000000..a5da21a --- /dev/null +++ b/ocr-service-v1/ocr-service-server/src/main/java/com/knecon/fforesight/service/ocr/v1/server/tracing/SafeSpanExporter.java @@ -0,0 +1,59 @@ +package com.knecon.fforesight.service.ocr.v1.server.tracing; + +import java.net.UnknownHostException; +import java.util.Collection; +import java.util.logging.Level; +import java.util.logging.Logger; + +import io.opentelemetry.sdk.common.CompletableResultCode; +import io.opentelemetry.sdk.trace.data.SpanData; +import io.opentelemetry.sdk.trace.export.SpanExporter; + +public class SafeSpanExporter implements SpanExporter { + + private final SpanExporter delegate; + private static final Logger logger = Logger.getLogger(SafeSpanExporter.class.getName()); + + + public SafeSpanExporter(SpanExporter delegate) { + + this.delegate = delegate; + } + + + @Override + public CompletableResultCode export(Collection spans) { + + try { + return delegate.export(spans); + } catch (Exception e) { + if (isDnsResolutionError(e)) { + logger.log(Level.WARNING, "DNS resolution error, skipping tracing export.", e); + return CompletableResultCode.ofSuccess(); + } else { + return CompletableResultCode.ofFailure(); + } + } + } + + + private boolean isDnsResolutionError(Exception e) { + + return e.getCause() instanceof UnknownHostException; + } + + + @Override + public CompletableResultCode flush() { + + return delegate.flush(); + } + + + @Override + public CompletableResultCode shutdown() { + + return delegate.shutdown(); + } + +} diff --git a/ocr-service-v1/ocr-service-server/src/main/resources/application.yml b/ocr-service-v1/ocr-service-server/src/main/resources/application.yml index 33ff53e..f00ab0c 100644 --- a/ocr-service-v1/ocr-service-server/src/main/resources/application.yml +++ b/ocr-service-v1/ocr-service-server/src/main/resources/application.yml @@ -60,3 +60,8 @@ pdftron.license: ${PDFTRON_LICENSE} ocrService: sendStatusUpdates: true + +logging: + level: + okhttp3: DEBUG + okhttp3.internal.http: DEBUG \ No newline at end of file