From 76d4982e1eefc599c069615f5f1b1d8b59e8bca5 Mon Sep 17 00:00:00 2001 From: conghuhu <56248584+conghuhu@users.noreply.github.com> Date: Tue, 16 May 2023 19:52:50 +0800 Subject: [PATCH] feat: add dubbo-spring-boot-tracing-otel-otlp-starter (#12299) * feat: dubbo-spring-boot-tracing-otel-otlp-starter * style * chore: add otel-otlp-exporter to pom * feat: add headers cfg in otlp * fix: add license --------- Co-authored-by: Albumen Kevin Co-authored-by: songxiaosheng --- .artifacts | 1 + .../dubbo/config/nested/ExporterConfig.java | 70 ++++++++++++++++++- dubbo-distribution/dubbo-bom/pom.xml | 5 ++ .../autoconfigure/pom.xml | 15 ++-- .../autoconfigure/ObservabilityUtils.java | 1 + .../exporter/otlp/OtlpAutoConfiguration.java | 64 +++++++++++++++++ .../main/resources/META-INF/spring.factories | 3 +- ...ot.autoconfigure.AutoConfiguration.imports | 3 +- .../pom.xml | 49 +++++++++++++ .../pom.xml | 1 + dubbo-test/dubbo-dependencies-all/pom.xml | 5 ++ 11 files changed, 208 insertions(+), 9 deletions(-) create mode 100644 dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/otlp/OtlpAutoConfiguration.java create mode 100644 dubbo-spring-boot/dubbo-spring-boot-observability-starters/dubbo-spring-boot-tracing-otel-otlp-starter/pom.xml diff --git a/.artifacts b/.artifacts index e2302b5b1b..8a62716f73 100644 --- a/.artifacts +++ b/.artifacts @@ -106,6 +106,7 @@ dubbo-spring-boot-observability-starters dubbo-spring-boot-observability-autoconfigure dubbo-spring-boot-tracing-brave-zipkin-starter dubbo-spring-boot-tracing-otel-zipkin-starter +dubbo-spring-boot-tracing-otel-otlp-starter dubbo-spring-boot-observability-starter dubbo-spring-boot-starter dubbo-spring-security diff --git a/dubbo-common/src/main/java/org/apache/dubbo/config/nested/ExporterConfig.java b/dubbo-common/src/main/java/org/apache/dubbo/config/nested/ExporterConfig.java index 076daa9287..3b621572d0 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/config/nested/ExporterConfig.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/config/nested/ExporterConfig.java @@ -17,16 +17,21 @@ package org.apache.dubbo.config.nested; -import org.apache.dubbo.config.support.Nested; - import java.io.Serializable; import java.time.Duration; +import java.util.HashMap; +import java.util.Map; + +import org.apache.dubbo.config.support.Nested; public class ExporterConfig implements Serializable { @Nested private ZipkinConfig zipkinConfig; + @Nested + private OtlpConfig otlpConfig; + public ZipkinConfig getZipkinConfig() { return zipkinConfig; } @@ -35,6 +40,14 @@ public class ExporterConfig implements Serializable { this.zipkinConfig = zipkinConfig; } + public OtlpConfig getOtlpConfig() { + return otlpConfig; + } + + public void setOtlpConfig(OtlpConfig otlpConfig) { + this.otlpConfig = otlpConfig; + } + public static class ZipkinConfig implements Serializable { /** @@ -76,4 +89,57 @@ public class ExporterConfig implements Serializable { this.readTimeout = readTimeout; } } + + public static class OtlpConfig implements Serializable { + + /** + * URL to the Otlp API. + */ + private String endpoint; + + /** + * The maximum time to wait for the collector to process an exported batch of spans. + */ + private Duration timeout = Duration.ofSeconds(10); + + /** + * The method used to compress payloads. If unset, compression is disabled. Currently + * supported compression methods include "gzip" and "none". + */ + private String compressionMethod = "none"; + + private Map headers = new HashMap<>(); + + public String getEndpoint() { + return endpoint; + } + + public void setEndpoint(String endpoint) { + this.endpoint = endpoint; + } + + public Duration getTimeout() { + return timeout; + } + + public void setTimeout(Duration timeout) { + this.timeout = timeout; + } + + public String getCompressionMethod() { + return compressionMethod; + } + + public void setCompressionMethod(String compressionMethod) { + this.compressionMethod = compressionMethod; + } + + public Map getHeaders() { + return headers; + } + + public void setHeaders(Map headers) { + this.headers = headers; + } + } } diff --git a/dubbo-distribution/dubbo-bom/pom.xml b/dubbo-distribution/dubbo-bom/pom.xml index 030c5da628..2e6deddfac 100644 --- a/dubbo-distribution/dubbo-bom/pom.xml +++ b/dubbo-distribution/dubbo-bom/pom.xml @@ -517,6 +517,11 @@ dubbo-spring-boot-tracing-otel-zipkin-starter ${project.version} + + org.apache.dubbo + dubbo-spring-boot-tracing-otel-otlp-starter + ${project.version} + org.apache.dubbo dubbo-spring-boot-tracing-brave-zipkin-starter diff --git a/dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/pom.xml b/dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/pom.xml index 1f6e2f01b1..b9e1369556 100644 --- a/dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/pom.xml +++ b/dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/pom.xml @@ -101,6 +101,11 @@ opentelemetry-exporter-zipkin true + + io.opentelemetry + opentelemetry-exporter-otlp + true + io.zipkin.reporter2 zipkin-reporter-brave @@ -115,17 +120,17 @@ - - org.apache.dubbo - dubbo-spring-boot-starter - ${project.version} - org.apache.dubbo dubbo-common ${project.version} true + + org.apache.dubbo + dubbo-spring-boot-starter + ${project.version} + org.apache.dubbo dubbo-qos diff --git a/dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/ObservabilityUtils.java b/dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/ObservabilityUtils.java index 2d5b7e5284..0c774d700a 100644 --- a/dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/ObservabilityUtils.java +++ b/dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/ObservabilityUtils.java @@ -38,4 +38,5 @@ public class ObservabilityUtils { public static final String DUBBO_TRACING_ZIPKIN_CONFIG_PREFIX = DUBBO_TRACING_PREFIX + PROPERTY_NAME_SEPARATOR + "tracing-exporter.zipkin-config"; + public static final String DUBBO_TRACING_OTLP_CONFIG_PREFIX = DUBBO_TRACING_PREFIX + PROPERTY_NAME_SEPARATOR + "tracing-exporter.otlp-config"; } diff --git a/dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/otlp/OtlpAutoConfiguration.java b/dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/otlp/OtlpAutoConfiguration.java new file mode 100644 index 0000000000..f26a851f37 --- /dev/null +++ b/dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/otlp/OtlpAutoConfiguration.java @@ -0,0 +1,64 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.dubbo.spring.boot.observability.autoconfigure.exporter.otlp; + +import org.apache.dubbo.config.nested.ExporterConfig.OtlpConfig; +import org.apache.dubbo.spring.boot.autoconfigure.DubboConfigurationProperties; +import org.apache.dubbo.spring.boot.observability.autoconfigure.annotation.ConditionalOnDubboTracingEnable; + +import io.micrometer.tracing.otel.bridge.OtelTracer; +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter; +import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporterBuilder; +import io.opentelemetry.sdk.trace.SdkTracerProvider; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; + +import java.util.Map; + +import static org.apache.dubbo.spring.boot.observability.autoconfigure.ObservabilityUtils.DUBBO_TRACING_OTLP_CONFIG_PREFIX; + +/** + * @since 3.2.2 + */ +@AutoConfiguration +@ConditionalOnClass({OtelTracer.class, SdkTracerProvider.class, OpenTelemetry.class, OtlpGrpcSpanExporter.class}) +@ConditionalOnDubboTracingEnable +@EnableConfigurationProperties(DubboConfigurationProperties.class) +public class OtlpAutoConfiguration { + + @Bean + @ConditionalOnProperty(prefix = DUBBO_TRACING_OTLP_CONFIG_PREFIX, name = "endpoint") + @ConditionalOnMissingBean(value = OtlpGrpcSpanExporter.class, + type = "io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporter") + OtlpGrpcSpanExporter otlpGrpcSpanExporter(DubboConfigurationProperties properties) { + OtlpConfig cfg = properties.getTracing().getTracingExporter().getOtlpConfig(); + OtlpGrpcSpanExporterBuilder builder = OtlpGrpcSpanExporter.builder() + .setEndpoint(cfg.getEndpoint()) + .setTimeout(cfg.getTimeout()) + .setCompression(cfg.getCompressionMethod()); + for (Map.Entry entry : cfg.getHeaders().entrySet()) { + builder.addHeader(entry.getKey(), entry.getValue()); + } + return builder.build(); + } +} diff --git a/dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/resources/META-INF/spring.factories b/dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/resources/META-INF/spring.factories index a42de46c09..3f492d62fd 100644 --- a/dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/resources/META-INF/spring.factories +++ b/dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/resources/META-INF/spring.factories @@ -3,5 +3,6 @@ org.apache.dubbo.spring.boot.observability.autoconfigure.otel.OpenTelemetryAutoC org.apache.dubbo.spring.boot.observability.autoconfigure.DubboMicrometerTracingAutoConfiguration,\ org.apache.dubbo.spring.boot.observability.autoconfigure.DubboObservationAutoConfiguration,\ org.apache.dubbo.spring.boot.observability.autoconfigure.brave.BraveAutoConfiguration,\ -org.apache.dubbo.spring.boot.observability.autoconfigure.exporter.zipkin.ZipkinAutoConfiguration +org.apache.dubbo.spring.boot.observability.autoconfigure.exporter.zipkin.ZipkinAutoConfiguration,\ +org.apache.dubbo.spring.boot.observability.autoconfigure.exporter.otlp.OtlpAutoConfiguration diff --git a/dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index a9e7d12337..7020e6b033 100644 --- a/dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -2,4 +2,5 @@ org.apache.dubbo.spring.boot.observability.autoconfigure.otel.OpenTelemetryAutoC org.apache.dubbo.spring.boot.observability.autoconfigure.DubboMicrometerTracingAutoConfiguration org.apache.dubbo.spring.boot.observability.autoconfigure.DubboObservationAutoConfiguration org.apache.dubbo.spring.boot.observability.autoconfigure.brave.BraveAutoConfiguration -org.apache.dubbo.spring.boot.observability.autoconfigure.exporter.zipkin.ZipkinAutoConfiguration \ No newline at end of file +org.apache.dubbo.spring.boot.observability.autoconfigure.exporter.zipkin.ZipkinAutoConfiguration +org.apache.dubbo.spring.boot.observability.autoconfigure.exporter.otlp.OtlpAutoConfiguration \ No newline at end of file diff --git a/dubbo-spring-boot/dubbo-spring-boot-observability-starters/dubbo-spring-boot-tracing-otel-otlp-starter/pom.xml b/dubbo-spring-boot/dubbo-spring-boot-observability-starters/dubbo-spring-boot-tracing-otel-otlp-starter/pom.xml new file mode 100644 index 0000000000..57af321b3e --- /dev/null +++ b/dubbo-spring-boot/dubbo-spring-boot-observability-starters/dubbo-spring-boot-tracing-otel-otlp-starter/pom.xml @@ -0,0 +1,49 @@ + + + + 4.0.0 + + dubbo-spring-boot-observability-starters + org.apache.dubbo + ${revision} + ../pom.xml + + + dubbo-spring-boot-tracing-otel-otlp-starter + jar + Apache Dubbo Spring Boot Tracing Otel OTLP Starter + + + + org.apache.dubbo + dubbo-spring-boot-observability-autoconfigure + ${project.version} + + + io.micrometer + micrometer-tracing-bridge-otel + + + io.opentelemetry + opentelemetry-exporter-otlp + + + + \ No newline at end of file diff --git a/dubbo-spring-boot/dubbo-spring-boot-observability-starters/pom.xml b/dubbo-spring-boot/dubbo-spring-boot-observability-starters/pom.xml index 37049a6511..01d7d6fa21 100644 --- a/dubbo-spring-boot/dubbo-spring-boot-observability-starters/pom.xml +++ b/dubbo-spring-boot/dubbo-spring-boot-observability-starters/pom.xml @@ -34,6 +34,7 @@ dubbo-spring-boot-tracing-otel-zipkin-starter dubbo-spring-boot-tracing-brave-zipkin-starter dubbo-spring-boot-observability-starter + dubbo-spring-boot-tracing-otel-otlp-starter diff --git a/dubbo-test/dubbo-dependencies-all/pom.xml b/dubbo-test/dubbo-dependencies-all/pom.xml index d98a49f720..3a8f9177e1 100644 --- a/dubbo-test/dubbo-dependencies-all/pom.xml +++ b/dubbo-test/dubbo-dependencies-all/pom.xml @@ -404,6 +404,11 @@ dubbo-spring-boot-tracing-otel-zipkin-starter ${project.version} + + org.apache.dubbo + dubbo-spring-boot-tracing-otel-otlp-starter + ${project.version} + org.apache.dubbo dubbo-spring-boot-tracing-brave-zipkin-starter