diff --git a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/constant/ContextConstant.java b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/constant/ContextConstant.java index 0a14d97bf..159d2a8d8 100644 --- a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/constant/ContextConstant.java +++ b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/constant/ContextConstant.java @@ -62,4 +62,15 @@ public final class ContextConstant { } } + + public static final class Trace { + /** + * EXTRA_TRACE_ATTRIBUTES. + */ + public static final String EXTRA_TRACE_ATTRIBUTES = "EXTRA_TRACE_ATTRIBUTES"; + + private Trace() { + + } + } } diff --git a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/constant/OrderConstant.java b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/constant/OrderConstant.java index 9c7f9fda4..a3ded6326 100644 --- a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/constant/OrderConstant.java +++ b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/constant/OrderConstant.java @@ -56,7 +56,7 @@ public class OrderConstant { /** * Order of encode router label interceptor. */ - public static final int ROUTER_LABEL_INTERCEPTOR_ORDER = Ordered.LOWEST_PRECEDENCE; + public static final int ROUTER_LABEL_INTERCEPTOR_ORDER = 0; } /** diff --git a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/util/MetadataContextUtils.java b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/util/MetadataContextUtils.java new file mode 100644 index 000000000..ea889bc38 --- /dev/null +++ b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/util/MetadataContextUtils.java @@ -0,0 +1,49 @@ +/* + * 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.common.util; + +import java.util.Optional; + +import com.tencent.cloud.common.metadata.MetadataContextHolder; +import com.tencent.polaris.metadata.core.MetadataObjectValue; +import com.tencent.polaris.metadata.core.MetadataType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Utils for MetadataContext. + * + * @author Shedfree Wu + */ +public final class MetadataContextUtils { + + private static final Logger LOG = LoggerFactory.getLogger(MetadataContextUtils.class); + + private MetadataContextUtils() { + } + + public static void putMetadataObjectValue(String key, Object value) { + MetadataContextHolder.get().getMetadataContainer(MetadataType.APPLICATION, true). + putMetadataObjectValue(key, value); + } + + public static boolean existMetadataValue(MetadataObjectValue metadataObjectValue) { + return Optional.ofNullable(metadataObjectValue).map(MetadataObjectValue::getObjectValue). + map(Optional::isPresent).orElse(false); + } +} diff --git a/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-gateway-plugin/src/main/java/com/tencent/cloud/plugin/gateway/context/ContextGatewayFilter.java b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-gateway-plugin/src/main/java/com/tencent/cloud/plugin/gateway/context/ContextGatewayFilter.java index 065e24b3d..b69ba8d7e 100644 --- a/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-gateway-plugin/src/main/java/com/tencent/cloud/plugin/gateway/context/ContextGatewayFilter.java +++ b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-gateway-plugin/src/main/java/com/tencent/cloud/plugin/gateway/context/ContextGatewayFilter.java @@ -28,9 +28,11 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import com.tencent.cloud.common.constant.ContextConstant; import com.tencent.cloud.common.constant.MetadataConstant; import com.tencent.cloud.common.metadata.MetadataContext; import com.tencent.cloud.common.metadata.MetadataContextHolder; +import com.tencent.cloud.common.util.MetadataContextUtils; import com.tencent.polaris.api.utils.CollectionUtils; import com.tencent.polaris.api.utils.StringUtils; import com.tencent.tsf.gateway.core.TsfGatewayRequest; @@ -240,6 +242,7 @@ public class ContextGatewayFilter implements GatewayFilter, Ordered { throw NotFoundException.create(true, msg); } updateRouteMetadata(exchange, contextRoute); + setTraceAttributes(contextRoute, GatewayConstant.NON_UNIT_TYPE, GatewayConstant.NON_UNIT_TRANSFER_TYPE); exchange.getAttributes().put(GatewayConstant.CONTEXT_ROUTE, contextRoute); URI requestUri = URI.create(contextRoute.getHost() + apis[1]); @@ -261,6 +264,7 @@ public class ContextGatewayFilter implements GatewayFilter, Ordered { throw NotFoundException.create(true, msg); } updateRouteMetadata(exchange, contextRoute); + setTraceAttributes(contextRoute, GatewayConstant.NON_UNIT_TYPE, GatewayConstant.NON_UNIT_TRANSFER_TYPE); exchange.getAttributes().put(GatewayConstant.CONTEXT_ROUTE, contextRoute); MetadataContext metadataContext = exchange.getAttribute( @@ -488,4 +492,22 @@ public class ContextGatewayFilter implements GatewayFilter, Ordered { throw new IllegalStateException("Invalid URI query: \"" + query + "\""); } } + + private void setTraceAttributes(GroupContext.ContextRoute contextRoute, String unitType, String unitTransferType) { + + Map traceAttributes = new HashMap<>(); + traceAttributes.put("tsf-ms-type", "MSGW"); + traceAttributes.put("tsf-unit-type", unitType); + traceAttributes.put("tsf-unit-transfer-type", unitTransferType); + traceAttributes.put("destination.namespace-id", contextRoute.getNamespaceId()); + traceAttributes.put("tsf-msgw-group", config.getGroup()); + traceAttributes.put("tsf-msgw-groupApi", contextRoute.getApiId()); + traceAttributes.put("tsf-msgw-apiPath", contextRoute.getPath()); + traceAttributes.put("tsf-msgw-apiMethod", contextRoute.getMethod()); + traceAttributes.put("tsf-msgw-namespaceName", contextRoute.getNamespace()); + traceAttributes.put("tsf-msgw-serviceName", contextRoute.getService()); + traceAttributes.put("localComponent", "msgw"); + + MetadataContextUtils.putMetadataObjectValue(ContextConstant.Trace.EXTRA_TRACE_ATTRIBUTES, traceAttributes); + } } diff --git a/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-gateway-plugin/src/main/java/com/tencent/tsf/gateway/core/constant/GatewayConstant.java b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-gateway-plugin/src/main/java/com/tencent/tsf/gateway/core/constant/GatewayConstant.java index d22e7f633..adcce6616 100644 --- a/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-gateway-plugin/src/main/java/com/tencent/tsf/gateway/core/constant/GatewayConstant.java +++ b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-gateway-plugin/src/main/java/com/tencent/tsf/gateway/core/constant/GatewayConstant.java @@ -74,6 +74,22 @@ public final class GatewayConstant { * Gateway 本地仓库的文件目录. */ public static final String GATEWAY_REPO_PREFIX = GATEWAY_REPO_ROOT + "/tsf/gateway/"; + /** + * NON_UNIT_TYPE. + */ + public static final String NON_UNIT_TYPE = "non-unit"; + /** + * NON_UNIT_TRANSFER_TYPE. + */ + public static final String NON_UNIT_TRANSFER_TYPE = "non-unit"; + /** + * UNIT_TYPE. + */ + public static final String UNIT_TYPE = "unit"; + /** + * UNIT_TRANSFER_TYPE. + */ + public static final String UNIT_TRANSFER_TYPE = "ms_unit_proxy"; private GatewayConstant() { 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 0cb610ff5..3615c05b7 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 @@ -20,10 +20,15 @@ package com.tencent.cloud.plugin.trace.attribute.tsf; import java.util.HashMap; import java.util.Map; +import com.tencent.cloud.common.constant.ContextConstant; +import com.tencent.cloud.common.metadata.MetadataContextHolder; +import com.tencent.cloud.common.util.MetadataContextUtils; import com.tencent.cloud.plugin.trace.attribute.SpanAttributesProvider; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginContext; import com.tencent.polaris.api.utils.CollectionUtils; import com.tencent.polaris.api.utils.StringUtils; +import com.tencent.polaris.metadata.core.MetadataObjectValue; +import com.tencent.polaris.metadata.core.MetadataType; import com.tencent.polaris.metadata.core.constant.TsfMetadataConstants; import org.springframework.cloud.client.ServiceInstance; @@ -54,6 +59,14 @@ public class TsfSpanAttributesProvider implements SpanAttributesProvider { if (StringUtils.isBlank(attributes.get("remote.namespace-id"))) { attributes.put("remote.namespace-id", context.getRequest().getGovernanceNamespace()); } + + 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-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/instrument/webclient/EnhancedWebClientExchangeFilterFunction.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/instrument/webclient/EnhancedWebClientExchangeFilterFunction.java index e03d2c78a..d77b82911 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/instrument/webclient/EnhancedWebClientExchangeFilterFunction.java +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/instrument/webclient/EnhancedWebClientExchangeFilterFunction.java @@ -21,6 +21,8 @@ import java.net.URI; import java.net.URISyntaxException; import java.util.Optional; +import com.tencent.cloud.common.constant.MetadataConstant; +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; @@ -56,11 +58,15 @@ public class EnhancedWebClientExchangeFilterFunction implements ExchangeFilterFu public Mono filter(ClientRequest originRequest, ExchangeFunction next) { EnhancedPluginContext enhancedPluginContext = new EnhancedPluginContext(); + String governanceNamespace = MetadataContextHolder.get().getContext(MetadataContext.FRAGMENT_APPLICATION_NONE, + MetadataConstant.POLARIS_TARGET_NAMESPACE, MetadataContext.LOCAL_NAMESPACE); + EnhancedRequestContext enhancedRequestContext = EnhancedRequestContext.builder() .httpHeaders(originRequest.headers()) .httpMethod(originRequest.method()) .url(originRequest.url()) .serviceUrl(getServiceUri(originRequest)) + .governanceNamespace(governanceNamespace) .build(); enhancedPluginContext.setRequest(enhancedRequestContext); enhancedPluginContext.setOriginRequest(originRequest);