diff --git a/fizz-bootstrap/src/main/resources/log4j2-spring.xml b/fizz-bootstrap/src/main/resources/log4j2-spring.xml
index 8429c18..c67a4d2 100644
--- a/fizz-bootstrap/src/main/resources/log4j2-spring.xml
+++ b/fizz-bootstrap/src/main/resources/log4j2-spring.xml
@@ -20,6 +20,5 @@
-
diff --git a/fizz-core/src/main/java/we/config/SystemConfig.java b/fizz-core/src/main/java/we/config/SystemConfig.java
index e3fbe53..54337e5 100644
--- a/fizz-core/src/main/java/we/config/SystemConfig.java
+++ b/fizz-core/src/main/java/we/config/SystemConfig.java
@@ -69,6 +69,27 @@ public class SystemConfig {
@Value("${route-timeout:0}")
private long routeTimeout = 0;
+ @Value("${fizz-trace-id.header:X-Trace-Id}")
+ private String fizzTraceIdHeader;
+
+ @Value("${fizz-trace-id.value-strategy:}")
+ private String fizzTraceIdValueStrategy;
+
+ @Value("${fizz-trace-id.value-prefix:}")
+ private String fizzTraceIdValuePrefix;
+
+ public String fizzTraceIdHeader() {
+ return fizzTraceIdHeader;
+ }
+
+ public String fizzTraceIdValueStrategy() {
+ return fizzTraceIdValueStrategy;
+ }
+
+ public String fizzTraceIdValuePrefix() {
+ return fizzTraceIdValuePrefix;
+ }
+
public long getRouteTimeout() {
return routeTimeout;
}
@@ -179,8 +200,8 @@ public class SystemConfig {
@PostConstruct
public void afterPropertiesSet() {
- afterLogResponseBodySet();
- afterLogHeadersSet();
+ // afterLogResponseBodySet();
+ // afterLogHeadersSet();
}
private void afterLogResponseBodySet() {
@@ -193,6 +214,9 @@ public class SystemConfig {
Arrays.stream(StringUtils.split(logHeaders, Constants.Symbol.COMMA)).forEach(h -> {
logHeaderSet.add(h);
});
+ if (!fizzTraceIdHeader.equals("X-Trace-Id")) {
+ logHeaderSet.add(fizzTraceIdHeader);
+ }
WebUtils.LOG_HEADER_SET = logHeaderSet;
log.info("log header list: " + logHeaderSet.toString());
}
@@ -216,7 +240,7 @@ public class SystemConfig {
this.updateLogResponseBody(logResponseBody);
}
- @Value("${log.headers:x}")
+ @Value("${log.headers:}")
public void setLogHeaders(String logHeaders) {
if (ObjectUtils.nullSafeEquals(this.logHeaders, logHeaders)) {
return;
diff --git a/fizz-core/src/main/java/we/filter/AggregateFilter.java b/fizz-core/src/main/java/we/filter/AggregateFilter.java
index 1aa5f18..047975f 100644
--- a/fizz-core/src/main/java/we/filter/AggregateFilter.java
+++ b/fizz-core/src/main/java/we/filter/AggregateFilter.java
@@ -138,11 +138,13 @@ public class AggregateFilter implements WebFilter {
}
// traceId
+ /*
String tmpTraceId = CommonConstants.TRACE_ID_PREFIX + exchange.getRequest().getId();
if (StringUtils.isNotBlank(request.getHeaders().getFirst(CommonConstants.HEADER_TRACE_ID))) {
tmpTraceId = request.getHeaders().getFirst(CommonConstants.HEADER_TRACE_ID);
}
- final String traceId = tmpTraceId;
+ */
+ final String traceId = WebUtils.getTraceId(exchange);
LogService.setBizId(traceId);
LOGGER.debug("matched aggregation api: {}", path);
@@ -207,9 +209,9 @@ public class AggregateFilter implements WebFilter {
// default content-type
serverHttpResponse.getHeaders().add(CommonConstants.HEADER_CONTENT_TYPE, CommonConstants.CONTENT_TYPE_JSON);
}
- List headerTraceIds = serverHttpResponse.getHeaders().get(CommonConstants.HEADER_TRACE_ID);
+ List headerTraceIds = serverHttpResponse.getHeaders().get(systemConfig.fizzTraceIdHeader());
if (headerTraceIds == null || !headerTraceIds.contains(traceId)) {
- serverHttpResponse.getHeaders().add(CommonConstants.HEADER_TRACE_ID, traceId);
+ serverHttpResponse.getHeaders().add(systemConfig.fizzTraceIdHeader(), traceId);
}
long end = System.currentTimeMillis();
diff --git a/fizz-core/src/main/java/we/filter/CallbackFilter.java b/fizz-core/src/main/java/we/filter/CallbackFilter.java
index d69339c..f1e5aef 100644
--- a/fizz-core/src/main/java/we/filter/CallbackFilter.java
+++ b/fizz-core/src/main/java/we/filter/CallbackFilter.java
@@ -172,7 +172,7 @@ public class CallbackFilter extends FizzWebFilter {
StringBuilder b = ThreadContext.getStringBuilder();
b.append(Constants.Symbol.LEFT_BRACE);
- b.append(_id); toJsonStringValue(b, req.getId()); b.append(Constants.Symbol.COMMA);
+ b.append(_id); toJsonStringValue(b, WebUtils.getTraceId(exchange)); b.append(Constants.Symbol.COMMA);
b.append(_datetime); b.append(System.currentTimeMillis()); b.append(Constants.Symbol.COMMA);
b.append(_origin); toJsonStringValue(b, WebUtils.getOriginIp(exchange)); b.append(Constants.Symbol.COMMA);
diff --git a/fizz-core/src/main/java/we/filter/FilterExceptionHandlerConfig.java b/fizz-core/src/main/java/we/filter/FilterExceptionHandlerConfig.java
index 1e37bda..c0b9437 100644
--- a/fizz-core/src/main/java/we/filter/FilterExceptionHandlerConfig.java
+++ b/fizz-core/src/main/java/we/filter/FilterExceptionHandlerConfig.java
@@ -68,30 +68,29 @@ public class FilterExceptionHandlerConfig {
return Mono.empty();
}
}
+ String rid = WebUtils.getTraceId(exchange);
if (t instanceof ExecuteScriptException) {
ExecuteScriptException ex = (ExecuteScriptException) t;
resp.getHeaders().add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
RespEntity rs = null;
- String reqId = exchange.getRequest().getId();
if (ex.getStepContext() != null && ex.getStepContext().returnContext()) {
- rs = new RespEntity(HttpStatus.INTERNAL_SERVER_ERROR.value(), t.getMessage(), reqId, ex.getStepContext());
+ rs = new RespEntity(HttpStatus.INTERNAL_SERVER_ERROR.value(), t.getMessage(), rid, ex.getStepContext());
return resp.writeWith(Mono.just(resp.bufferFactory().wrap(JacksonUtils.writeValueAsString(rs).getBytes())));
} else {
- rs = new RespEntity(HttpStatus.INTERNAL_SERVER_ERROR.value(), t.getMessage(), reqId);
+ rs = new RespEntity(HttpStatus.INTERNAL_SERVER_ERROR.value(), t.getMessage(), rid);
return resp.writeWith(Mono.just(resp.bufferFactory().wrap(rs.toString().getBytes())));
}
}
if (t instanceof FizzRuntimeException) {
FizzRuntimeException ex = (FizzRuntimeException) t;
- log.error(ex.getMessage(), LogService.BIZ_ID, exchange.getRequest().getId(), ex);
+ log.error(ex.getMessage(), LogService.BIZ_ID, rid, ex);
resp.getHeaders().add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
RespEntity rs = null;
- String reqId = exchange.getRequest().getId();
if (ex.getStepContext() != null && ex.getStepContext().returnContext()) {
- rs = new RespEntity(HttpStatus.INTERNAL_SERVER_ERROR.value(), t.getMessage(), reqId, ex.getStepContext());
+ rs = new RespEntity(HttpStatus.INTERNAL_SERVER_ERROR.value(), t.getMessage(), rid, ex.getStepContext());
return resp.writeWith(Mono.just(resp.bufferFactory().wrap(JacksonUtils.writeValueAsString(rs).getBytes())));
} else {
- rs = new RespEntity(HttpStatus.INTERNAL_SERVER_ERROR.value(), t.getMessage(), reqId);
+ rs = new RespEntity(HttpStatus.INTERNAL_SERVER_ERROR.value(), t.getMessage(), rid);
return resp.writeWith(Mono.just(resp.bufferFactory().wrap(rs.toString().getBytes())));
}
}
@@ -100,8 +99,8 @@ public class FilterExceptionHandlerConfig {
if (fc == null) { // t came from flow control filter
StringBuilder b = ThreadContext.getStringBuilder();
WebUtils.request2stringBuilder(exchange, b);
- log.error(b.toString(), LogService.BIZ_ID, exchange.getRequest().getId(), t);
- String s = RespEntity.toJson(HttpStatus.INTERNAL_SERVER_ERROR.value(), t.getMessage(), exchange.getRequest().getId());
+ log.error(b.toString(), LogService.BIZ_ID, rid, t);
+ String s = RespEntity.toJson(HttpStatus.INTERNAL_SERVER_ERROR.value(), t.getMessage(), rid);
resp.getHeaders().add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
vm = resp.writeWith(Mono.just(resp.bufferFactory().wrap(s.getBytes())));
} else {
diff --git a/fizz-core/src/main/java/we/filter/FizzLogFilter.java b/fizz-core/src/main/java/we/filter/FizzLogFilter.java
index 7756447..3c346eb 100644
--- a/fizz-core/src/main/java/we/filter/FizzLogFilter.java
+++ b/fizz-core/src/main/java/we/filter/FizzLogFilter.java
@@ -55,7 +55,7 @@ public class FizzLogFilter implements WebFilter {
WebUtils.request2stringBuilder(exchange, b);
b.append(resp).append(exchange.getResponse().getStatusCode())
.append(in) .append(System.currentTimeMillis() - startTime);
- LOGGER.info(b.toString(), LogService.BIZ_ID, exchange.getRequest().getId());
+ LOGGER.info(b.toString(), LogService.BIZ_ID, WebUtils.getTraceId(exchange));
}
}
);
diff --git a/fizz-core/src/main/java/we/filter/FlowControlFilter.java b/fizz-core/src/main/java/we/filter/FlowControlFilter.java
index 7df67c3..da2c9f4 100644
--- a/fizz-core/src/main/java/we/filter/FlowControlFilter.java
+++ b/fizz-core/src/main/java/we/filter/FlowControlFilter.java
@@ -17,11 +17,6 @@
package we.filter;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.annotation.Resource;
-
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -33,7 +28,6 @@ import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebFilterChain;
-
import reactor.core.publisher.Mono;
import reactor.core.publisher.SignalType;
import we.config.SystemConfig;
@@ -47,10 +41,11 @@ import we.stats.IncrRequestResult;
import we.stats.ResourceConfig;
import we.stats.ratelimit.ResourceRateLimitConfig;
import we.stats.ratelimit.ResourceRateLimitConfigService;
-import we.util.Constants;
-import we.util.JacksonUtils;
-import we.util.ThreadContext;
-import we.util.WebUtils;
+import we.util.*;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
/**
* @author hongqiaowei
@@ -68,6 +63,8 @@ public class FlowControlFilter extends FizzWebFilter {
private static final String actuator = "actuator";
+ private static final String uuid = "uuid";
+
public static final String ADMIN_REQUEST = "$a";
@Resource
@@ -85,6 +82,9 @@ public class FlowControlFilter extends FizzWebFilter {
@Resource
private AppService appService;
+ @Resource
+ private SystemConfig systemConfig;
+
@Override
public Mono doFilter(ServerWebExchange exchange, WebFilterChain chain) {
@@ -111,10 +111,6 @@ public class FlowControlFilter extends FizzWebFilter {
return WebUtils.buildJsonDirectResponse(exchange, HttpStatus.FORBIDDEN, null, json);
}
String app = WebUtils.getAppId(exchange);
- // if (app != null && !appService.getAppMap().containsKey(app)) {
- // String json = RespEntity.toJson(HttpStatus.FORBIDDEN.value(), "no app " + app, exchange.getRequest().getId());
- // return WebUtils.buildJsonDirectResponse(exchange, HttpStatus.FORBIDDEN, null, json);
- // }
path = WebUtils.getClientReqPath(exchange);
String ip = WebUtils.getOriginIp(exchange);
@@ -151,6 +147,7 @@ public class FlowControlFilter extends FizzWebFilter {
} else {
long start = System.currentTimeMillis();
+ setTraceId(exchange);
return chain.filter(exchange).doFinally(s -> {
long rt = System.currentTimeMillis() - start;
if (s == SignalType.ON_ERROR || exchange.getResponse().getStatusCode().is5xxServerError()) {
@@ -162,9 +159,27 @@ public class FlowControlFilter extends FizzWebFilter {
}
}
+ setTraceId(exchange);
return chain.filter(exchange);
}
+ private void setTraceId(ServerWebExchange exchange) {
+ String traceId = exchange.getRequest().getHeaders().getFirst(systemConfig.fizzTraceIdHeader());
+ if (StringUtils.isBlank(traceId)) {
+ if (StringUtils.isBlank(systemConfig.fizzTraceIdValueStrategy())) {
+ traceId = exchange.getRequest().getId();
+ } else if (systemConfig.fizzTraceIdValueStrategy().equals(uuid)) {
+ traceId = UUIDUtil.getUUID();
+ } else {
+ throw Utils.runtimeExceptionWithoutStack("unsupported " + systemConfig.fizzTraceIdValueStrategy() + " trace id value strategy!");
+ }
+ }
+ if (StringUtils.isNotBlank(systemConfig.fizzTraceIdValuePrefix())) {
+ traceId = systemConfig.fizzTraceIdValuePrefix() + traceId;
+ }
+ exchange.getAttributes().put(WebUtils.TRACE_ID, traceId);
+ }
+
private List getResourceConfigItselfAndParents(ResourceConfig rc, List rcs) {
boolean check = false;
String rcId = rc.getResourceId();
diff --git a/fizz-core/src/main/java/we/filter/RouteFilter.java b/fizz-core/src/main/java/we/filter/RouteFilter.java
index 8dd1d3c..e2a2a3c 100644
--- a/fizz-core/src/main/java/we/filter/RouteFilter.java
+++ b/fizz-core/src/main/java/we/filter/RouteFilter.java
@@ -33,6 +33,7 @@ import org.springframework.web.reactive.function.client.ClientResponse;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebFilterChain;
import reactor.core.publisher.Mono;
+import we.config.SystemConfig;
import we.constants.CommonConstants;
import we.flume.clients.log4j2appender.LogService;
import we.legacy.RespEntity;
@@ -67,6 +68,9 @@ public class RouteFilter extends FizzWebFilter {
@Resource
private ApacheDubboGenericService dubboGenericService;
+ @Resource
+ private SystemConfig systemConfig;
+
@Override
public Mono doFilter(ServerWebExchange exchange, WebFilterChain chain) {
@@ -77,7 +81,7 @@ public class RouteFilter extends FizzWebFilter {
Mono resp = WebUtils.getDirectResponse(exchange);
if (resp == null) { // should not reach here
ServerHttpRequest clientReq = exchange.getRequest();
- String rid = clientReq.getId();
+ String rid = WebUtils.getTraceId(exchange);
String msg = pfr.id + " fail";
if (pfr.cause == null) {
log.error(msg, LogService.BIZ_ID, rid);
@@ -94,7 +98,7 @@ public class RouteFilter extends FizzWebFilter {
private Mono doFilter0(ServerWebExchange exchange, WebFilterChain chain) {
ServerHttpRequest req = exchange.getRequest();
- String rid = req.getId();
+ String rid = WebUtils.getTraceId(exchange);
// ApiConfig ac = WebUtils.getApiConfig(exchange);
Route route = WebUtils.getRoute(exchange);
@@ -133,7 +137,7 @@ public class RouteFilter extends FizzWebFilter {
private Mono send(ServerWebExchange exchange, HttpMethod method, String service, String relativeUri, HttpHeaders hdrs) {
ServerHttpRequest clientReq = exchange.getRequest();
- return fizzWebClient.send2service(clientReq.getId(), method, service, relativeUri, hdrs, clientReq.getBody()).flatMap(genServerResponse(exchange));
+ return fizzWebClient.send2service(WebUtils.getTraceId(exchange), method, service, relativeUri, hdrs, clientReq.getBody()).flatMap(genServerResponse(exchange));
}
private Function> genServerResponse(ServerWebExchange exchange) {
@@ -160,7 +164,7 @@ public class RouteFilter extends FizzWebFilter {
);
if (log.isDebugEnabled()) {
StringBuilder b = ThreadContext.getStringBuilder();
- String rid = exchange.getRequest().getId();
+ String rid = WebUtils.getTraceId(exchange);
WebUtils.response2stringBuilder(rid, remoteResp, b);
log.debug(b.toString(), LogService.BIZ_ID, rid);
}
@@ -208,7 +212,7 @@ public class RouteFilter extends FizzWebFilter {
}
declaration.setTimeout(t);
- Map attachments = Collections.singletonMap(CommonConstants.HEADER_TRACE_ID, WebUtils.getTraceId(exchange));
+ Map attachments = Collections.singletonMap(systemConfig.fizzTraceIdHeader(), WebUtils.getTraceId(exchange));
return dubboGenericService.send(parameters, declaration, attachments);
}
)
@@ -225,7 +229,7 @@ public class RouteFilter extends FizzWebFilter {
if (ls[0] != null) {
b.append('\n').append(ls[0]);
}
- log.error(b.toString(), LogService.BIZ_ID, exchange.getRequest().getId(), t);
+ log.error(b.toString(), LogService.BIZ_ID, WebUtils.getTraceId(exchange), t);
}
)
;
diff --git a/fizz-core/src/main/java/we/fizz/AggregateService.java b/fizz-core/src/main/java/we/fizz/AggregateService.java
index c664c14..4d916d2 100644
--- a/fizz-core/src/main/java/we/fizz/AggregateService.java
+++ b/fizz-core/src/main/java/we/fizz/AggregateService.java
@@ -29,6 +29,7 @@ import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.core.scheduler.Schedulers;
+import we.config.SystemConfig;
import we.constants.CommonConstants;
import we.fizz.input.Input;
import we.flume.clients.log4j2appender.LogService;
@@ -54,6 +55,9 @@ public class AggregateService {
@Resource
private ConfigLoader aggregateResourceLoader;
+ @Resource
+ private SystemConfig systemConfig;
+
public Mono request(String traceId, String clientReqPathPrefix, String method, String service, String path, MultiValueMap queryParams,
HttpHeaders headers, String body) {
@@ -114,9 +118,9 @@ public class AggregateService {
// defalut content-type
clientResp.getHeaders().add("Content-Type", "application/json; charset=UTF-8");
}
- List headerTraceIds = clientResp.getHeaders().get(CommonConstants.HEADER_TRACE_ID);
+ List headerTraceIds = clientResp.getHeaders().get(systemConfig.fizzTraceIdHeader());
if (headerTraceIds == null || !headerTraceIds.contains(traceId)) {
- clientResp.getHeaders().add(CommonConstants.HEADER_TRACE_ID, traceId);
+ clientResp.getHeaders().add(systemConfig.fizzTraceIdHeader(), traceId);
}
// long end = System.currentTimeMillis();
// pipeline.getStepContext().addElapsedTime("总耗时", end - start);
diff --git a/fizz-core/src/main/java/we/fizz/input/extension/dubbo/DubboInput.java b/fizz-core/src/main/java/we/fizz/input/extension/dubbo/DubboInput.java
index f34ccef..5a23bb1 100644
--- a/fizz-core/src/main/java/we/fizz/input/extension/dubbo/DubboInput.java
+++ b/fizz-core/src/main/java/we/fizz/input/extension/dubbo/DubboInput.java
@@ -29,6 +29,8 @@ import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.util.CollectionUtils;
import reactor.core.publisher.Mono;
+import we.FizzAppContext;
+import we.config.SystemConfig;
import we.constants.CommonConstants;
import we.exception.ExecuteScriptException;
import we.fizz.StepContext;
@@ -79,7 +81,12 @@ public class DubboInput extends RPCInput {
contextAttachment = new HashMap(attachments);
}
if (inputContext.getStepContext() != null && inputContext.getStepContext().getTraceId() != null) {
- contextAttachment.put(CommonConstants.HEADER_TRACE_ID, inputContext.getStepContext().getTraceId());
+ if (FizzAppContext.appContext == null) {
+ contextAttachment.put(CommonConstants.HEADER_TRACE_ID, inputContext.getStepContext().getTraceId());
+ } else {
+ SystemConfig systemConfig = FizzAppContext.appContext.getBean(SystemConfig.class);
+ contextAttachment.put(systemConfig.fizzTraceIdHeader(), inputContext.getStepContext().getTraceId());
+ }
}
Mono