From 321b7d77fe038bcb0dbff2e46cbb45c3c96699d2 Mon Sep 17 00:00:00 2001 From: Haotian Zhang <928016560@qq.com> Date: Mon, 14 Jul 2025 17:33:03 +0800 Subject: [PATCH] fix:fix RestTemplate trace attribute loss bug. --- CHANGELOG.md | 3 +- .../reporter/CircuitBreakerPlugin.java | 8 ++--- .../PolarisSpanAttributesProvider.java | 2 +- .../tsf/TsfSpanAttributesProvider.java | 7 +++-- .../plugin/EnhancedRequestContext.java | 29 +++++++++++++++++-- 5 files changed, 37 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index be2f78baf..6c35b2ebb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,4 +11,5 @@ - [fix: fix loadbalancer metadata type.](https://github.com/Tencent/spring-cloud-tencent/pull/1624) - [feat:support polaris server nearby backup LB.](https://github.com/Tencent/spring-cloud-tencent/pull/1629) - fix:fix ipv6 instance not found bug. -- fix:fix tsf lossless not working bug. \ No newline at end of file +- fix:fix tsf lossless not working bug. +- fix:fix RestTemplate trace attribute loss bug. diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/reporter/CircuitBreakerPlugin.java b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/reporter/CircuitBreakerPlugin.java index 78ca22f46..42072c760 100644 --- a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/reporter/CircuitBreakerPlugin.java +++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/reporter/CircuitBreakerPlugin.java @@ -18,7 +18,6 @@ package com.tencent.cloud.polaris.circuitbreaker.reporter; import com.tencent.cloud.common.constant.ContextConstant; -import com.tencent.cloud.common.metadata.MetadataContext; import com.tencent.cloud.common.metadata.MetadataContextHolder; import com.tencent.cloud.polaris.circuitbreaker.PolarisCircuitBreaker; import com.tencent.cloud.polaris.circuitbreaker.instrument.resttemplate.PolarisCircuitBreakerHttpResponse; @@ -28,7 +27,6 @@ import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedRequestContext; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedResponseContext; import com.tencent.cloud.rpc.enhancement.plugin.reporter.SuccessPolarisReporter; -import com.tencent.polaris.api.utils.StringUtils; import com.tencent.polaris.circuitbreak.client.exception.CallAbortedException; import com.tencent.polaris.metadata.core.MetadataType; import org.slf4j.Logger; @@ -70,9 +68,9 @@ public class CircuitBreakerPlugin implements EnhancedPlugin { EnhancedRequestContext request = context.getRequest(); EnhancedResponseContext response = context.getResponse(); - String host = request.getServiceUrl() != null ? request.getServiceUrl().getHost() : request.getUrl().getHost(); - String path = request.getServiceUrl() != null ? request.getServiceUrl().getPath() : request.getUrl().getPath(); - String governanceNamespace = StringUtils.isNotEmpty(request.getGovernanceNamespace()) ? request.getGovernanceNamespace() : MetadataContext.LOCAL_NAMESPACE; + String host = request.getHost(); + String path = request.getPath(); + String governanceNamespace = request.getGovernanceNamespace(); String httpMethod = request.getHttpMethod().name(); 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 2ef6bbf75..94c767625 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 @@ -84,7 +84,7 @@ public class PolarisSpanAttributesProvider implements SpanAttributesProvider { } attributes.put("http.port", CalleeMetadataContainerGroup.getStaticApplicationMetadataContainer() .getRawMetadataStringValue(MetadataConstants.LOCAL_PORT)); - attributes.put("net.peer.service", context.getTargetServiceInstance().getServiceId()); + attributes.put("net.peer.service", context.getRequest().getHost()); String serviceLane = metadataContext.getMetadataContainer(MetadataType.MESSAGE, false) .getRawMetadataMapValue(MessageMetadataContainer.LABEL_MAP_KEY_HEADER, TRAFFIC_STAIN_LABEL); 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 0032fb8f9..0cb610ff5 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 @@ -33,8 +33,8 @@ public class TsfSpanAttributesProvider implements SpanAttributesProvider { @Override public Map getClientBaggageAttributes(EnhancedPluginContext context) { Map attributes = new HashMap<>(); - if (null != context.getRequest().getUrl()) { - attributes.put("remoteInterface", context.getRequest().getUrl().getPath()); + if (context.getRequest() != null && StringUtils.isNotBlank(context.getRequest().getPath())) { + attributes.put("remoteInterface", context.getRequest().getPath()); } ServiceInstance targetServiceInstance = context.getTargetServiceInstance(); if (null != targetServiceInstance && CollectionUtils.isNotEmpty(targetServiceInstance.getMetadata())) { @@ -51,6 +51,9 @@ public class TsfSpanAttributesProvider implements SpanAttributesProvider { targetServiceInstance.getMetadata().get(TsfMetadataConstants.TSF_APPLICATION_ID))); } } + if (StringUtils.isBlank(attributes.get("remote.namespace-id"))) { + attributes.put("remote.namespace-id", context.getRequest().getGovernanceNamespace()); + } return attributes; } } diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/EnhancedRequestContext.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/EnhancedRequestContext.java index 769c0a79e..913db4ac0 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/EnhancedRequestContext.java +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/EnhancedRequestContext.java @@ -19,6 +19,9 @@ package com.tencent.cloud.rpc.enhancement.plugin; import java.net.URI; +import com.tencent.cloud.common.metadata.MetadataContext; +import com.tencent.polaris.api.utils.StringUtils; + import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; @@ -39,6 +42,10 @@ public class EnhancedRequestContext { private String governanceNamespace; + public static EnhancedContextRequestBuilder builder() { + return new EnhancedContextRequestBuilder(); + } + public HttpMethod getHttpMethod() { return httpMethod; } @@ -72,15 +79,31 @@ public class EnhancedRequestContext { } public String getGovernanceNamespace() { - return governanceNamespace; + return StringUtils.isNotEmpty(governanceNamespace) ? governanceNamespace : MetadataContext.LOCAL_NAMESPACE; } public void setGovernanceNamespace(String governanceNamespace) { this.governanceNamespace = governanceNamespace; } - public static EnhancedContextRequestBuilder builder() { - return new EnhancedContextRequestBuilder(); + public String getHost() { + if (serviceUrl != null) { + return serviceUrl.getHost(); + } + if (url != null) { + return url.getHost(); + } + return null; + } + + public String getPath() { + if (serviceUrl != null) { + return serviceUrl.getPath(); + } + if (url != null) { + return url.getPath(); + } + return null; } @Override