From 5799cbbd44ab5945a44d93b93e3629fcf4f48580 Mon Sep 17 00:00:00 2001 From: andrew shan <45474304+andrewshan@users.noreply.github.com> Date: Wed, 12 Jun 2024 14:32:39 +0800 Subject: [PATCH] feat: add trace report support --- .../common/metadata/MetadataContext.java | 4 +- spring-cloud-tencent-dependencies/pom.xml | 2 +- .../lossless-nacos-callee-service/pom.xml | 2 +- spring-cloud-tencent-plugin-starters/pom.xml | 1 + .../pom.xml | 2 +- .../spring-cloud-tencent-trace-plugin/pom.xml | 24 ++++++ .../plugin/trace/SpanAttributesProvider.java | 28 +++++++ .../trace/TraceMetadataEnhancedPlugin.java | 81 +++++++++++++++++++ .../plugin/PluginOrderConstant.java | 6 ++ 9 files changed, 145 insertions(+), 5 deletions(-) create mode 100644 spring-cloud-tencent-plugin-starters/spring-cloud-tencent-trace-plugin/pom.xml create mode 100644 spring-cloud-tencent-plugin-starters/spring-cloud-tencent-trace-plugin/src/main/java/com/tencent/cloud/plugin/trace/SpanAttributesProvider.java create mode 100644 spring-cloud-tencent-plugin-starters/spring-cloud-tencent-trace-plugin/src/main/java/com/tencent/cloud/plugin/trace/TraceMetadataEnhancedPlugin.java diff --git a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/metadata/MetadataContext.java b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/metadata/MetadataContext.java index 11b667c1a..f398d3147 100644 --- a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/metadata/MetadataContext.java +++ b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/metadata/MetadataContext.java @@ -258,7 +258,7 @@ public class MetadataContext extends com.tencent.polaris.metadata.core.manager.M case FRAGMENT_RAW_TRANSHEADERS: return getMapMetadataAsMap(MetadataType.CUSTOM, FRAGMENT_RAW_TRANSHEADERS, TransitiveType.NONE, false); case FRAGMENT_RAW_TRANSHEADERS_KV: - return getMapMetadataAsMap(MetadataType.CUSTOM, FRAGMENT_RAW_TRANSHEADERS_KV, TransitiveType.PASS_THROUGH, false); + return getMapMetadataAsMap(MetadataType.CUSTOM, FRAGMENT_RAW_TRANSHEADERS_KV, TransitiveType.NONE, false); default: return getMapMetadataAsMap(MetadataType.CUSTOM, fragment, TransitiveType.NONE, false); } @@ -293,7 +293,7 @@ public class MetadataContext extends com.tencent.polaris.metadata.core.manager.M putMapMetadataAsMap(MetadataType.CUSTOM, FRAGMENT_RAW_TRANSHEADERS, TransitiveType.NONE, false, context); break; case FRAGMENT_RAW_TRANSHEADERS_KV: - putMapMetadataAsMap(MetadataType.CUSTOM, FRAGMENT_RAW_TRANSHEADERS_KV, TransitiveType.PASS_THROUGH, false, context); + putMapMetadataAsMap(MetadataType.CUSTOM, FRAGMENT_RAW_TRANSHEADERS_KV, TransitiveType.NONE, false, context); break; default: putMapMetadataAsMap(MetadataType.CUSTOM, fragment, TransitiveType.NONE, false, context); diff --git a/spring-cloud-tencent-dependencies/pom.xml b/spring-cloud-tencent-dependencies/pom.xml index be06d2970..17ff3caf0 100644 --- a/spring-cloud-tencent-dependencies/pom.xml +++ b/spring-cloud-tencent-dependencies/pom.xml @@ -74,7 +74,7 @@ 1.14.0-2022.0.5-SNAPSHOT - 1.15.7-SNAPSHOT + 1.16.0-SNAPSHOT 32.0.1-jre diff --git a/spring-cloud-tencent-examples/lossless-example/lossless-nacos-callee-service/pom.xml b/spring-cloud-tencent-examples/lossless-example/lossless-nacos-callee-service/pom.xml index 2be4b3bc1..52c29f727 100644 --- a/spring-cloud-tencent-examples/lossless-example/lossless-nacos-callee-service/pom.xml +++ b/spring-cloud-tencent-examples/lossless-example/lossless-nacos-callee-service/pom.xml @@ -15,7 +15,7 @@ com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery - 2023.0.0.0-RC1 + 2022.0.0.0 diff --git a/spring-cloud-tencent-plugin-starters/pom.xml b/spring-cloud-tencent-plugin-starters/pom.xml index 5debf6360..92c26fce9 100644 --- a/spring-cloud-tencent-plugin-starters/pom.xml +++ b/spring-cloud-tencent-plugin-starters/pom.xml @@ -20,6 +20,7 @@ spring-cloud-starter-tencent-discovery-adapter-plugin spring-cloud-tencent-lossless-plugin spring-cloud-starter-tencent-threadlocal-plugin + spring-cloud-tencent-trace-plugin diff --git a/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-discovery-adapter-plugin/pom.xml b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-discovery-adapter-plugin/pom.xml index 0053a3ee6..650dc5bd2 100644 --- a/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-discovery-adapter-plugin/pom.xml +++ b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-discovery-adapter-plugin/pom.xml @@ -29,7 +29,7 @@ com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery - 2023.0.0.0-RC1 + 2022.0.0.0 true diff --git a/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-trace-plugin/pom.xml b/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-trace-plugin/pom.xml new file mode 100644 index 000000000..5a400090d --- /dev/null +++ b/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-trace-plugin/pom.xml @@ -0,0 +1,24 @@ + + + spring-cloud-tencent-plugin-starters + com.tencent.cloud + ${revision} + ../pom.xml + + 4.0.0 + spring-cloud-tencent-trace-plugin + Spring Cloud Tencent Trace Plugin + + + + + com.tencent.cloud + spring-cloud-tencent-rpc-enhancement + + + com.tencent.polaris + trace-otel + + + diff --git a/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-trace-plugin/src/main/java/com/tencent/cloud/plugin/trace/SpanAttributesProvider.java b/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-trace-plugin/src/main/java/com/tencent/cloud/plugin/trace/SpanAttributesProvider.java new file mode 100644 index 000000000..ed7b2d459 --- /dev/null +++ b/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-trace-plugin/src/main/java/com/tencent/cloud/plugin/trace/SpanAttributesProvider.java @@ -0,0 +1,28 @@ +/* + * Tencent is pleased to support the open source community by making Spring Cloud Tencent available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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 com.tencent.cloud.plugin.trace; + +import java.util.Map; + +import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginContext; + +public interface SpanAttributesProvider { + + Map getConsumerSpanAttributes(EnhancedPluginContext context); +} diff --git a/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-trace-plugin/src/main/java/com/tencent/cloud/plugin/trace/TraceMetadataEnhancedPlugin.java b/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-trace-plugin/src/main/java/com/tencent/cloud/plugin/trace/TraceMetadataEnhancedPlugin.java new file mode 100644 index 000000000..04442e846 --- /dev/null +++ b/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-trace-plugin/src/main/java/com/tencent/cloud/plugin/trace/TraceMetadataEnhancedPlugin.java @@ -0,0 +1,81 @@ +/* + * Tencent is pleased to support the open source community by making Spring Cloud Tencent available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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 com.tencent.cloud.plugin.trace; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import com.tencent.cloud.common.metadata.MetadataContext; +import com.tencent.cloud.common.metadata.MetadataContextHolder; +import com.tencent.cloud.polaris.context.PolarisSDKContextManager; +import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPlugin; +import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginContext; +import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType; +import com.tencent.cloud.rpc.enhancement.plugin.PluginOrderConstant; +import com.tencent.polaris.api.utils.CollectionUtils; +import com.tencent.polaris.assembly.api.AssemblyAPI; +import com.tencent.polaris.assembly.api.pojo.TraceAttributes; + +public class TraceMetadataEnhancedPlugin implements EnhancedPlugin { + + private final PolarisSDKContextManager polarisSDKContextManager; + + private SpanAttributesProvider spanAttributesProvider; + + public TraceMetadataEnhancedPlugin(PolarisSDKContextManager polarisSDKContextManager) { + this.polarisSDKContextManager = polarisSDKContextManager; + } + + public void setSpanAttributesProvider(SpanAttributesProvider spanAttributesProvider) { + this.spanAttributesProvider = spanAttributesProvider; + } + + @Override + public EnhancedPluginType getType() { + return EnhancedPluginType.Client.PRE; + } + + @Override + public void run(EnhancedPluginContext context) throws Throwable { + AssemblyAPI assemblyAPI = polarisSDKContextManager.getAssemblyAPI(); + Map attributes = new HashMap<>(); + if (null != spanAttributesProvider) { + Map additionalAttributes = spanAttributesProvider.getConsumerSpanAttributes(context); + if (CollectionUtils.isNotEmpty(additionalAttributes)) { + attributes.putAll(additionalAttributes); + } + } + MetadataContext metadataContext = MetadataContextHolder.get(); + Map transitiveCustomAttributes = metadataContext.getFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE); + if (CollectionUtils.isNotEmpty(transitiveCustomAttributes)) { + attributes.putAll(transitiveCustomAttributes); + } + TraceAttributes traceAttributes = new TraceAttributes(); + traceAttributes.setAttributes(attributes); + traceAttributes.setAttributeLocation(TraceAttributes.AttributeLocation.SPAN); + assemblyAPI.updateTraceAttributes(traceAttributes); + } + + @Override + public int getOrder() { + return PluginOrderConstant.ClientPluginOrder.CONSUMER_TRACE_METADATA_PLUGIN_ORDER; + } + +} diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/PluginOrderConstant.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/PluginOrderConstant.java index eff88f13a..3959fbdfa 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/PluginOrderConstant.java +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/PluginOrderConstant.java @@ -58,5 +58,11 @@ public class PluginOrderConstant { * {@link com.tencent.cloud.metadata.core.EncodeTransferMedataRestTemplateEnhancedPlugin}. */ public static final int CONSUMER_TRANSFER_METADATA_PLUGIN_ORDER = Ordered.HIGHEST_PRECEDENCE + 10; + + /** + * order for + * {@link com.tencent.cloud.plugin.trace.TraceMetadataEnhancedPlugin} + */ + public static final int CONSUMER_TRACE_METADATA_PLUGIN_ORDER = CONSUMER_TRANSFER_METADATA_PLUGIN_ORDER - 1; } }