diff --git a/pom.xml b/pom.xml index 7dc98193..e8ed8868 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ dev.vality service-parent-pom - 3.1.7 + 3.1.8 org-manager @@ -29,6 +29,7 @@ 1.38-8c9b968 2.32.0 1.685-5c25c2e + 3.0.1 @@ -36,7 +37,6 @@ dev.vality.woody woody-thrift - 2.1.0 dev.vality @@ -169,6 +169,11 @@ 2.0 + + io.opentelemetry + opentelemetry-semconv + 1.29.0-alpha + diff --git a/src/main/java/dev/vality/orgmanager/config/OtelConfig.java b/src/main/java/dev/vality/orgmanager/config/OtelConfig.java new file mode 100644 index 00000000..630c3aa8 --- /dev/null +++ b/src/main/java/dev/vality/orgmanager/config/OtelConfig.java @@ -0,0 +1,70 @@ +package dev.vality.orgmanager.config; + +import dev.vality.orgmanager.config.properties.OtelProperties; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator; +import io.opentelemetry.context.propagation.ContextPropagators; +import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporter; +import io.opentelemetry.sdk.OpenTelemetrySdk; +import io.opentelemetry.sdk.resources.Resource; +import io.opentelemetry.sdk.trace.SdkTracerProvider; +import io.opentelemetry.sdk.trace.export.BatchSpanProcessor; +import io.opentelemetry.sdk.trace.samplers.Sampler; +import io.opentelemetry.semconv.resource.attributes.ResourceAttributes; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.time.Duration; + +@Slf4j +@Configuration +@ConditionalOnProperty(value = "otel.enabled", havingValue = "true", matchIfMissing = true) +@RequiredArgsConstructor +public class OtelConfig { + + private final OtelProperties otelProperties; + + @Value("${spring.application.name}") + private String applicationName; + + @Bean + public OpenTelemetry openTelemetryConfig() { + var resource = Resource.getDefault() + .merge(Resource.create(Attributes.of(ResourceAttributes.SERVICE_NAME, applicationName))); + var sdkTracerProvider = SdkTracerProvider.builder() + .addSpanProcessor(BatchSpanProcessor.builder(OtlpHttpSpanExporter.builder() + .setEndpoint(otelProperties.getResource()) + .setTimeout(Duration.ofMillis(otelProperties.getTimeout())) + .build()) + .build()) + .setSampler(Sampler.alwaysOn()) + .setResource(resource) + .build(); + var openTelemetrySdk = OpenTelemetrySdk.builder() + .setTracerProvider(sdkTracerProvider) + .setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance())) + .build(); + registerGlobalOpenTelemetry(openTelemetrySdk); + return openTelemetrySdk; + } + + private static void registerGlobalOpenTelemetry(OpenTelemetry openTelemetry) { + try { + GlobalOpenTelemetry.set(openTelemetry); + } catch (Throwable ex) { + log.warn("Please initialize the ObservabilitySdk before starting the application", ex); + GlobalOpenTelemetry.resetForTest(); + try { + GlobalOpenTelemetry.set(openTelemetry); + } catch (Throwable ex1) { + log.warn("Unable to set GlobalOpenTelemetry", ex1); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/dev/vality/orgmanager/config/properties/OtelProperties.java b/src/main/java/dev/vality/orgmanager/config/properties/OtelProperties.java new file mode 100644 index 00000000..ff18b2d3 --- /dev/null +++ b/src/main/java/dev/vality/orgmanager/config/properties/OtelProperties.java @@ -0,0 +1,17 @@ +package dev.vality.orgmanager.config.properties; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Getter +@Setter +@Component +@ConfigurationProperties(prefix = "otel") +public class OtelProperties { + + private String resource; + private Long timeout; + +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index c7941c52..a318fdad 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -92,3 +92,8 @@ bouncer: access-check: enabled: false + +otel: + resource: http://localhost:4318/v1/traces + timeout: 60000 + enabled: false