diff --git a/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-trace-plugin/src/main/java/com/tencent/cloud/plugin/trace/TraceServerFinallyEnhancedPlugin.java b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-trace-plugin/src/main/java/com/tencent/cloud/plugin/trace/TraceServerFinallyEnhancedPlugin.java new file mode 100644 index 000000000..f9d00a3ed --- /dev/null +++ b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-trace-plugin/src/main/java/com/tencent/cloud/plugin/trace/TraceServerFinallyEnhancedPlugin.java @@ -0,0 +1,74 @@ +/* + * Tencent is pleased to support the open source community by making spring-cloud-tencent available. + * + * Copyright (C) 2021 Tencent. 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.HashMap; +import java.util.List; +import java.util.Map; + +import com.tencent.cloud.plugin.trace.attribute.SpanAttributesProvider; +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 TraceServerFinallyEnhancedPlugin implements EnhancedPlugin { + + private final PolarisSDKContextManager polarisSDKContextManager; + + private final List spanAttributesProviderList; + + public TraceServerFinallyEnhancedPlugin(PolarisSDKContextManager polarisSDKContextManager, List spanAttributesProviderList) { + this.polarisSDKContextManager = polarisSDKContextManager; + this.spanAttributesProviderList = spanAttributesProviderList; + } + + @Override + public EnhancedPluginType getType() { + return EnhancedPluginType.Server.FINALLY; + } + + @Override + public void run(EnhancedPluginContext context) throws Throwable { + Map attributes = new HashMap<>(); + if (CollectionUtils.isNotEmpty(spanAttributesProviderList)) { + for (SpanAttributesProvider spanAttributesProvider : spanAttributesProviderList) { + Map additionalAttributes = spanAttributesProvider.getServerFinallySpanAttributes(context); + if (CollectionUtils.isNotEmpty(additionalAttributes)) { + attributes.putAll(additionalAttributes); + } + } + } + + TraceAttributes traceAttributes = new TraceAttributes(); + traceAttributes.setAttributes(attributes); + traceAttributes.setAttributeLocation(TraceAttributes.AttributeLocation.SPAN); + + AssemblyAPI assemblyAPI = polarisSDKContextManager.getAssemblyAPI(); + assemblyAPI.updateTraceAttributes(traceAttributes); + } + + @Override + public int getOrder() { + return PluginOrderConstant.ServerPluginOrder.TRACE_SERVER_PRE_PLUGIN_ORDER; + } +} diff --git a/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-trace-plugin/src/main/java/com/tencent/cloud/plugin/trace/TraceServerPreEnhancedPlugin.java b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-trace-plugin/src/main/java/com/tencent/cloud/plugin/trace/TraceServerPreEnhancedPlugin.java index 529f818f8..5d6e28269 100644 --- a/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-trace-plugin/src/main/java/com/tencent/cloud/plugin/trace/TraceServerPreEnhancedPlugin.java +++ b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-trace-plugin/src/main/java/com/tencent/cloud/plugin/trace/TraceServerPreEnhancedPlugin.java @@ -52,7 +52,7 @@ public class TraceServerPreEnhancedPlugin implements EnhancedPlugin { Map attributes = new HashMap<>(); if (CollectionUtils.isNotEmpty(spanAttributesProviderList)) { for (SpanAttributesProvider spanAttributesProvider : spanAttributesProviderList) { - Map additionalAttributes = spanAttributesProvider.getServerSpanAttributes(context); + Map additionalAttributes = spanAttributesProvider.getServerPreSpanAttributes(context); if (CollectionUtils.isNotEmpty(additionalAttributes)) { attributes.putAll(additionalAttributes); } diff --git a/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-trace-plugin/src/main/java/com/tencent/cloud/plugin/trace/attribute/PolarisSpanAttributesProvider.java b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-trace-plugin/src/main/java/com/tencent/cloud/plugin/trace/attribute/PolarisSpanAttributesProvider.java index d8289145f..4be2eec96 100644 --- a/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-trace-plugin/src/main/java/com/tencent/cloud/plugin/trace/attribute/PolarisSpanAttributesProvider.java +++ b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-trace-plugin/src/main/java/com/tencent/cloud/plugin/trace/attribute/PolarisSpanAttributesProvider.java @@ -41,7 +41,7 @@ import static com.tencent.polaris.plugins.router.lane.LaneRouter.TRAFFIC_STAIN_L */ public class PolarisSpanAttributesProvider implements SpanAttributesProvider { @Override - public Map getServerSpanAttributes(EnhancedPluginContext context) { + public Map getServerPreSpanAttributes(EnhancedPluginContext context) { Map attributes = new HashMap<>(); MetadataContext metadataContext = MetadataContextHolder.get(); Map transitiveCustomAttributes = metadataContext.getFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE); diff --git a/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-trace-plugin/src/main/java/com/tencent/cloud/plugin/trace/attribute/SpanAttributesProvider.java b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-trace-plugin/src/main/java/com/tencent/cloud/plugin/trace/attribute/SpanAttributesProvider.java index 5a09a8d2c..ab4c97b85 100644 --- a/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-trace-plugin/src/main/java/com/tencent/cloud/plugin/trace/attribute/SpanAttributesProvider.java +++ b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-trace-plugin/src/main/java/com/tencent/cloud/plugin/trace/attribute/SpanAttributesProvider.java @@ -29,7 +29,11 @@ public interface SpanAttributesProvider { */ String OT_SCOPE_KEY = "OT_SCOPE_KEY"; - default Map getServerSpanAttributes(EnhancedPluginContext context) { + default Map getServerPreSpanAttributes(EnhancedPluginContext context) { + return new HashMap<>(); + } + + default Map getServerFinallySpanAttributes(EnhancedPluginContext context) { return new HashMap<>(); } diff --git a/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-trace-plugin/src/main/java/com/tencent/cloud/plugin/trace/attribute/tsf/TsfSpanAttributesProvider.java b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-trace-plugin/src/main/java/com/tencent/cloud/plugin/trace/attribute/tsf/TsfSpanAttributesProvider.java index 3615c05b7..e18c85fb5 100644 --- a/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-trace-plugin/src/main/java/com/tencent/cloud/plugin/trace/attribute/tsf/TsfSpanAttributesProvider.java +++ b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-trace-plugin/src/main/java/com/tencent/cloud/plugin/trace/attribute/tsf/TsfSpanAttributesProvider.java @@ -69,4 +69,17 @@ public class TsfSpanAttributesProvider implements SpanAttributesProvider { } return attributes; } + + @Override + public Map getServerFinallySpanAttributes(EnhancedPluginContext context) { + Map attributes = new HashMap<>(); + MetadataObjectValue> extraTraceAttributeObject = MetadataContextHolder.get(). + getMetadataContainer(MetadataType.APPLICATION, true). + getMetadataValue(ContextConstant.Trace.EXTRA_TRACE_ATTRIBUTES); + if (MetadataContextUtils.existMetadataValue(extraTraceAttributeObject)) { + Map extraTraceAttributes = extraTraceAttributeObject.getObjectValue().get(); + attributes.putAll(extraTraceAttributes); + } + return attributes; + } } diff --git a/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-trace-plugin/src/main/java/com/tencent/cloud/plugin/trace/config/TraceEnhancedPluginAutoConfiguration.java b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-trace-plugin/src/main/java/com/tencent/cloud/plugin/trace/config/TraceEnhancedPluginAutoConfiguration.java index b9b5c351d..7991205fd 100644 --- a/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-trace-plugin/src/main/java/com/tencent/cloud/plugin/trace/config/TraceEnhancedPluginAutoConfiguration.java +++ b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-trace-plugin/src/main/java/com/tencent/cloud/plugin/trace/config/TraceEnhancedPluginAutoConfiguration.java @@ -21,6 +21,7 @@ import java.util.List; import com.tencent.cloud.plugin.trace.TraceClientFinallyEnhancedPlugin; import com.tencent.cloud.plugin.trace.TraceClientPreEnhancedPlugin; +import com.tencent.cloud.plugin.trace.TraceServerFinallyEnhancedPlugin; import com.tencent.cloud.plugin.trace.TraceServerPreEnhancedPlugin; import com.tencent.cloud.plugin.trace.attribute.PolarisSpanAttributesProvider; import com.tencent.cloud.plugin.trace.attribute.SpanAttributesProvider; @@ -46,6 +47,12 @@ public class TraceEnhancedPluginAutoConfiguration { return new TraceServerPreEnhancedPlugin(polarisSDKContextManager, spanAttributesProviderList); } + @Bean + public TraceServerFinallyEnhancedPlugin traceServerFinallyEnhancedPlugin( + PolarisSDKContextManager polarisSDKContextManager, @Autowired(required = false) List spanAttributesProviderList) { + return new TraceServerFinallyEnhancedPlugin(polarisSDKContextManager, spanAttributesProviderList); + } + @Bean public TraceClientPreEnhancedPlugin traceClientPreEnhancedPlugin( PolarisSDKContextManager polarisSDKContextManager, @Autowired(required = false) List spanAttributesProviderList) { diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/instrument/filter/EnhancedReactiveFilter.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/instrument/filter/EnhancedReactiveFilter.java index be1fe8073..bc0146737 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/instrument/filter/EnhancedReactiveFilter.java +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/instrument/filter/EnhancedReactiveFilter.java @@ -17,7 +17,10 @@ package com.tencent.cloud.rpc.enhancement.instrument.filter; +import com.tencent.cloud.common.constant.MetadataConstant; import com.tencent.cloud.common.constant.OrderConstant; +import com.tencent.cloud.common.metadata.MetadataContext; +import com.tencent.cloud.common.metadata.MetadataContextHolder; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginContext; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginRunner; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType; @@ -80,6 +83,10 @@ public class EnhancedReactiveFilter implements WebFilter, Ordered { pluginRunner.run(EnhancedPluginType.Server.EXCEPTION, enhancedPluginContext); }) .doFinally(v -> { + if (exchange.getAttributes().containsKey(MetadataConstant.HeaderName.METADATA_CONTEXT)) { + MetadataContextHolder.set((MetadataContext) exchange.getAttributes().get( + MetadataConstant.HeaderName.METADATA_CONTEXT)); + } // Run finally enhanced plugins. pluginRunner.run(EnhancedPluginType.Server.FINALLY, enhancedPluginContext); });