使用 callee metadata 存储临时变量

pull/1681/head
shedfreewu 2 weeks ago
parent 58427e0498
commit 0aa15f345f

@ -18,7 +18,7 @@
package com.tencent.cloud.polaris.circuitbreaker.reporter;
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.polaris.circuitbreaker.PolarisCircuitBreaker;
import com.tencent.cloud.polaris.circuitbreaker.instrument.resttemplate.PolarisCircuitBreakerHttpResponse;
import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPlugin;
@ -28,7 +28,6 @@ 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.circuitbreak.client.exception.CallAbortedException;
import com.tencent.polaris.metadata.core.MetadataType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -77,8 +76,8 @@ public class CircuitBreakerPlugin implements EnhancedPlugin {
CircuitBreaker circuitBreaker = circuitBreakerFactory.create(governanceNamespace + "#" + host + "#" + path + "#http#" + httpMethod);
if (circuitBreaker instanceof PolarisCircuitBreaker) {
PolarisCircuitBreaker polarisCircuitBreaker = (PolarisCircuitBreaker) circuitBreaker;
putMetadataObjectValue(ContextConstant.CircuitBreaker.POLARIS_CIRCUIT_BREAKER, polarisCircuitBreaker);
putMetadataObjectValue(ContextConstant.CircuitBreaker.CIRCUIT_BREAKER_START_TIME, System.currentTimeMillis());
MetadataContextUtils.putMetadataObjectValue(ContextConstant.CircuitBreaker.POLARIS_CIRCUIT_BREAKER, polarisCircuitBreaker);
MetadataContextUtils.putMetadataObjectValue(ContextConstant.CircuitBreaker.CIRCUIT_BREAKER_START_TIME, System.currentTimeMillis());
try {
polarisCircuitBreaker.acquirePermission();
@ -88,7 +87,7 @@ public class CircuitBreakerPlugin implements EnhancedPlugin {
polarisCircuitBreaker.reportStatus(e);
if (e.getFallbackInfo() != null) {
Object fallbackResponse = new PolarisCircuitBreakerHttpResponse(e.getFallbackInfo());
putMetadataObjectValue(ContextConstant.CircuitBreaker.CIRCUIT_BREAKER_FALLBACK_HTTP_RESPONSE, fallbackResponse);
MetadataContextUtils.putMetadataObjectValue(ContextConstant.CircuitBreaker.CIRCUIT_BREAKER_FALLBACK_HTTP_RESPONSE, fallbackResponse);
}
throw e;
}
@ -105,9 +104,4 @@ public class CircuitBreakerPlugin implements EnhancedPlugin {
public int getOrder() {
return CIRCUIT_BREAKER_REPORTER_PLUGIN_ORDER;
}
private void putMetadataObjectValue(String key, Object value) {
MetadataContextHolder.get().getMetadataContainer(MetadataType.APPLICATION, true).
putMetadataObjectValue(key, value);
}
}

@ -22,6 +22,7 @@ import java.util.concurrent.TimeUnit;
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.polaris.circuitbreaker.PolarisCircuitBreaker;
import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementReporterProperties;
import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPlugin;
@ -61,11 +62,6 @@ public class ExceptionCircuitBreakerReporter implements EnhancedPlugin {
this.circuitBreakAPI = circuitBreakAPI;
}
private static boolean existMetadataValue(MetadataObjectValue<?> metadataObjectValue) {
return Optional.ofNullable(metadataObjectValue).map(MetadataObjectValue::getObjectValue).
map(Optional::isPresent).orElse(false);
}
@Override
public String getName() {
return ExceptionCircuitBreakerReporter.class.getName();
@ -103,15 +99,15 @@ public class ExceptionCircuitBreakerReporter implements EnhancedPlugin {
circuitBreakAPI.report(resourceStat);
MetadataObjectValue<PolarisCircuitBreaker> circuitBreakerObject = MetadataContextHolder.get().
getMetadataContainer(MetadataType.APPLICATION, true).
getMetadataContainer(MetadataType.CUSTOM, false).
getMetadataValue(ContextConstant.CircuitBreaker.POLARIS_CIRCUIT_BREAKER);
MetadataObjectValue<Long> startTimeMilliObject = MetadataContextHolder.get().
getMetadataContainer(MetadataType.APPLICATION, true).
getMetadataContainer(MetadataType.CUSTOM, false).
getMetadataValue(ContextConstant.CircuitBreaker.CIRCUIT_BREAKER_START_TIME);
boolean existCircuitBreaker = existMetadataValue(circuitBreakerObject);
boolean existStartTime = existMetadataValue(startTimeMilliObject);
boolean existCircuitBreaker = MetadataContextUtils.existMetadataValue(circuitBreakerObject);
boolean existStartTime = MetadataContextUtils.existMetadataValue(startTimeMilliObject);
if (existCircuitBreaker && existStartTime) {
PolarisCircuitBreaker polarisCircuitBreaker = circuitBreakerObject.getObjectValue().get();

@ -22,6 +22,7 @@ import java.util.concurrent.TimeUnit;
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.polaris.circuitbreaker.PolarisCircuitBreaker;
import com.tencent.cloud.polaris.context.CircuitBreakerStatusCodeException;
import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementReporterProperties;
@ -65,11 +66,6 @@ public class SuccessCircuitBreakerReporter implements EnhancedPlugin {
this.circuitBreakAPI = circuitBreakAPI;
}
private static boolean existMetadataValue(MetadataObjectValue<?> metadataObjectValue) {
return Optional.ofNullable(metadataObjectValue).map(MetadataObjectValue::getObjectValue).
map(Optional::isPresent).orElse(false);
}
@Override
public String getName() {
return SuccessCircuitBreakerReporter.class.getName();
@ -107,15 +103,15 @@ public class SuccessCircuitBreakerReporter implements EnhancedPlugin {
circuitBreakAPI.report(resourceStat);
MetadataObjectValue<PolarisCircuitBreaker> circuitBreakerObject = MetadataContextHolder.get().
getMetadataContainer(MetadataType.APPLICATION, true).
getMetadataContainer(MetadataType.CUSTOM, false).
getMetadataValue(ContextConstant.CircuitBreaker.POLARIS_CIRCUIT_BREAKER);
MetadataObjectValue<Long> startTimeMilliObject = MetadataContextHolder.get().
getMetadataContainer(MetadataType.APPLICATION, true).
getMetadataContainer(MetadataType.CUSTOM, false).
getMetadataValue(ContextConstant.CircuitBreaker.CIRCUIT_BREAKER_START_TIME);
boolean existCircuitBreaker = existMetadataValue(circuitBreakerObject);
boolean existStartTime = existMetadataValue(startTimeMilliObject);
boolean existCircuitBreaker = MetadataContextUtils.existMetadataValue(circuitBreakerObject);
boolean existStartTime = MetadataContextUtils.existMetadataValue(startTimeMilliObject);
if (existCircuitBreaker && existStartTime) {
PolarisCircuitBreaker polarisCircuitBreaker = circuitBreakerObject.getObjectValue().get();

@ -170,9 +170,9 @@ public class ExceptionCircuitBreakerReporterTest {
pluginContext.setTargetServiceInstance(serviceInstance, null);
pluginContext.setThrowable(new RuntimeException());
MetadataContextHolder.get().getMetadataContainer(MetadataType.APPLICATION, true).
MetadataContextHolder.get().getMetadataContainer(MetadataType.CUSTOM, false).
putMetadataObjectValue(ContextConstant.CircuitBreaker.POLARIS_CIRCUIT_BREAKER, polarisCircuitBreaker);
MetadataContextHolder.get().getMetadataContainer(MetadataType.APPLICATION, true).
MetadataContextHolder.get().getMetadataContainer(MetadataType.CUSTOM, false).
putMetadataObjectValue(ContextConstant.CircuitBreaker.CIRCUIT_BREAKER_START_TIME, System.currentTimeMillis());
exceptionCircuitBreakerReporter.run(pluginContext);
@ -205,7 +205,7 @@ public class ExceptionCircuitBreakerReporterTest {
pluginContext.setTargetServiceInstance(serviceInstance, null);
pluginContext.setThrowable(new RuntimeException());
// not exist circuit CIRCUIT_BREAKER_START_TIME
MetadataContextHolder.get().getMetadataContainer(MetadataType.APPLICATION, true).
MetadataContextHolder.get().getMetadataContainer(MetadataType.CUSTOM, false).
putMetadataObjectValue(ContextConstant.CircuitBreaker.POLARIS_CIRCUIT_BREAKER, polarisCircuitBreaker);
exceptionCircuitBreakerReporter.run(pluginContext);

@ -183,9 +183,9 @@ public class SuccessCircuitBreakerReporterTest {
pluginContext.setResponse(response);
pluginContext.setTargetServiceInstance(serviceInstance, null);
MetadataContextHolder.get().getMetadataContainer(MetadataType.APPLICATION, true).
MetadataContextHolder.get().getMetadataContainer(MetadataType.CUSTOM, false).
putMetadataObjectValue(ContextConstant.CircuitBreaker.POLARIS_CIRCUIT_BREAKER, polarisCircuitBreaker);
MetadataContextHolder.get().getMetadataContainer(MetadataType.APPLICATION, true).
MetadataContextHolder.get().getMetadataContainer(MetadataType.CUSTOM, false).
putMetadataObjectValue(ContextConstant.CircuitBreaker.CIRCUIT_BREAKER_START_TIME, System.currentTimeMillis());
successCircuitBreakerReporter.run(pluginContext);
@ -217,7 +217,7 @@ public class SuccessCircuitBreakerReporterTest {
pluginContext.setResponse(response);
pluginContext.setTargetServiceInstance(serviceInstance, null);
// not exist circuit CIRCUIT_BREAKER_START_TIME
MetadataContextHolder.get().getMetadataContainer(MetadataType.APPLICATION, true).
MetadataContextHolder.get().getMetadataContainer(MetadataType.CUSTOM, false).
putMetadataObjectValue(ContextConstant.CircuitBreaker.POLARIS_CIRCUIT_BREAKER, polarisCircuitBreaker);
successCircuitBreakerReporter.run(pluginContext);

@ -37,8 +37,11 @@ public final class MetadataContextUtils {
private MetadataContextUtils() {
}
/**
* use callee's custom metadata to store local thread's metadata. caller's metadata is for remote upstream service.
*/
public static void putMetadataObjectValue(String key, Object value) {
MetadataContextHolder.get().getMetadataContainer(MetadataType.APPLICATION, true).
MetadataContextHolder.get().getMetadataContainer(MetadataType.CUSTOM, false).
putMetadataObjectValue(key, value);
}

@ -22,6 +22,7 @@ import java.util.HashMap;
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.common.util.MetadataContextUtils;
import com.tencent.cloud.plugin.fault.config.FaultInjectionProperties;
import com.tencent.cloud.plugin.fault.instrument.resttemplate.PolarisFaultInjectionHttpResponse;
import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPlugin;
@ -37,7 +38,6 @@ import com.tencent.polaris.fault.api.rpc.DelayResult;
import com.tencent.polaris.fault.api.rpc.FaultRequest;
import com.tencent.polaris.fault.api.rpc.FaultResponse;
import com.tencent.polaris.fault.client.exception.FaultInjectionException;
import com.tencent.polaris.metadata.core.MetadataType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -94,18 +94,13 @@ public class FaultInjectionPrePlugin implements EnhancedPlugin {
CircuitBreakerStatus.FallbackInfo fallbackInfo = new CircuitBreakerStatus.FallbackInfo(abortResult.getAbortCode(), new HashMap<>(), "");
if (ClassUtils.isClassPresent("org.springframework.http.client.ClientHttpResponse")) {
Object fallbackResponse = new PolarisFaultInjectionHttpResponse(fallbackInfo);
putMetadataObjectValue(ContextConstant.FaultInjection.FAULT_INJECTION_FALLBACK_HTTP_RESPONSE, fallbackResponse);
MetadataContextUtils.putMetadataObjectValue(ContextConstant.FaultInjection.FAULT_INJECTION_FALLBACK_HTTP_RESPONSE, fallbackResponse);
}
throw new FaultInjectionException(fallbackInfo);
}
}
}
private void putMetadataObjectValue(String key, Object value) {
MetadataContextHolder.get().getMetadataContainer(MetadataType.APPLICATION, true).
putMetadataObjectValue(key, value);
}
@Override
public void handlerThrowable(EnhancedPluginContext context, Throwable throwable) {
LOG.error("FaultInjectionPrePlugin runs failed. context=[{}].", context, throwable);

@ -65,14 +65,14 @@ public class TsfSpanAttributesProvider implements SpanAttributesProvider {
}
MetadataObjectValue<Tag> langTagObject = MetadataContextHolder.get().
getMetadataContainer(MetadataType.APPLICATION, true).
getMetadataContainer(MetadataType.CUSTOM, false).
getMetadataValue(ContextConstant.LANE_TAG);
if (MetadataContextUtils.existMetadataValue(langTagObject)) {
attributes.put(OtUtils.OTEL_LANE_ID_KEY, langTagObject.getObjectValue().get().getValue());
}
MetadataObjectValue<Map<String, String>> extraTraceAttributeObject = MetadataContextHolder.get().
getMetadataContainer(MetadataType.APPLICATION, true).
getMetadataContainer(MetadataType.CUSTOM, false).
getMetadataValue(ContextConstant.Trace.EXTRA_TRACE_ATTRIBUTES);
if (MetadataContextUtils.existMetadataValue(extraTraceAttributeObject)) {
Map<String, String> extraTraceAttributes = extraTraceAttributeObject.getObjectValue().get();
@ -101,7 +101,7 @@ public class TsfSpanAttributesProvider implements SpanAttributesProvider {
public Map<String, String> getServerFinallySpanAttributes(EnhancedPluginContext context) {
Map<String, String> attributes = new HashMap<>();
MetadataObjectValue<Map<String, String>> extraTraceAttributeObject = MetadataContextHolder.get().
getMetadataContainer(MetadataType.APPLICATION, true).
getMetadataContainer(MetadataType.CUSTOM, false).
getMetadataValue(ContextConstant.Trace.EXTRA_TRACE_ATTRIBUTES);
if (MetadataContextUtils.existMetadataValue(extraTraceAttributeObject)) {
Map<String, String> extraTraceAttributes = extraTraceAttributeObject.getObjectValue().get();

@ -149,7 +149,7 @@ public final class TencentUnitContext {
private static Map<String, String> getUserContext() {
MetadataObjectValue<Map<String, String>> metadataObjectValue = MetadataContextHolder.get().
getMetadataContainer(MetadataType.APPLICATION, true).
getMetadataContainer(MetadataType.CUSTOM, false).
getMetadataValue(USER_CONTEXTS_KEY);
if (MetadataContextUtils.existMetadataValue(metadataObjectValue)) {
return metadataObjectValue.getObjectValue().get();
@ -163,7 +163,7 @@ public final class TencentUnitContext {
private static Map<String, String> getSystemContext() {
MetadataObjectValue<Map<String, String>> metadataObjectValue = MetadataContextHolder.get().
getMetadataContainer(MetadataType.APPLICATION, true).
getMetadataContainer(MetadataType.CUSTOM, false).
getMetadataValue(SYSTEM_CONTEXTS_KEY);
if (MetadataContextUtils.existMetadataValue(metadataObjectValue)) {
return metadataObjectValue.getObjectValue().get();
@ -177,7 +177,7 @@ public final class TencentUnitContext {
private static Map<String, Object> getRouteContext() {
MetadataObjectValue<Map<String, Object>> metadataObjectValue = MetadataContextHolder.get().
getMetadataContainer(MetadataType.APPLICATION, true).
getMetadataContainer(MetadataType.CUSTOM, false).
getMetadataValue(ROUTE_CONTEXTS_KEY);
if (MetadataContextUtils.existMetadataValue(metadataObjectValue)) {
return metadataObjectValue.getObjectValue().get();
@ -191,7 +191,7 @@ public final class TencentUnitContext {
private static Map<String, String> getSourceContext() {
MetadataObjectValue<Map<String, String>> metadataObjectValue = MetadataContextHolder.get().
getMetadataContainer(MetadataType.APPLICATION, true).
getMetadataContainer(MetadataType.CUSTOM, false).
getMetadataValue(SOURCE_CONTEXTS_KEY);
if (MetadataContextUtils.existMetadataValue(metadataObjectValue)) {
return metadataObjectValue.getObjectValue().get();
@ -205,7 +205,7 @@ public final class TencentUnitContext {
private static Map<String, String> getGrayUserContext() {
MetadataObjectValue<Map<String, String>> metadataObjectValue = MetadataContextHolder.get().
getMetadataContainer(MetadataType.APPLICATION, true).
getMetadataContainer(MetadataType.CUSTOM, false).
getMetadataValue(GRAY_USER_CONTEXTS_KEY);
if (MetadataContextUtils.existMetadataValue(metadataObjectValue)) {
return metadataObjectValue.getObjectValue().get();
@ -219,7 +219,7 @@ public final class TencentUnitContext {
private static Map<String, String> getGraySystemContext() {
MetadataObjectValue<Map<String, String>> metadataObjectValue = MetadataContextHolder.get().
getMetadataContainer(MetadataType.APPLICATION, true).
getMetadataContainer(MetadataType.CUSTOM, false).
getMetadataValue(GRAY_SYSTEM_CONTEXTS_KEY);
if (MetadataContextUtils.existMetadataValue(metadataObjectValue)) {
return metadataObjectValue.getObjectValue().get();

@ -127,7 +127,7 @@ public class EnhancedRestTemplateBlockingLoadBalancerClientInterceptor {
}
catch (CallAbortedException callAbortedException) {
MetadataObjectValue<Object> fallbackResponseValue = MetadataContextHolder.get().
getMetadataContainer(MetadataType.APPLICATION, true).
getMetadataContainer(MetadataType.CUSTOM, false).
getMetadataValue(ContextConstant.CircuitBreaker.CIRCUIT_BREAKER_FALLBACK_HTTP_RESPONSE);
boolean existFallback = Optional.ofNullable(fallbackResponseValue).
@ -143,7 +143,7 @@ public class EnhancedRestTemplateBlockingLoadBalancerClientInterceptor {
}
catch (FaultInjectionException faultInjectionException) {
MetadataObjectValue<Object> fallbackResponseValue = MetadataContextHolder.get().
getMetadataContainer(MetadataType.APPLICATION, true).
getMetadataContainer(MetadataType.CUSTOM, false).
getMetadataValue(ContextConstant.FaultInjection.FAULT_INJECTION_FALLBACK_HTTP_RESPONSE);
boolean existFallback = Optional.ofNullable(fallbackResponseValue).

@ -43,7 +43,7 @@ public final class EnhancedPluginUtils {
public static EnhancedPluginContext getEnhancedPluginContextFromMetadataContext() {
MetadataObjectValue<EnhancedPluginContext> enhancedPluginContextObject = MetadataContextHolder.get().
getMetadataContainer(MetadataType.APPLICATION, true).
getMetadataContainer(MetadataType.CUSTOM, false).
getMetadataValue(ContextConstant.ENHANCED_PLUGIN_CONTEXT);
if (MetadataContextUtils.existMetadataValue(enhancedPluginContextObject)) {

Loading…
Cancel
Save