|
@@ -2,8 +2,10 @@ package cn.com.goldenwater.filter;
|
|
|
|
|
|
|
|
import cn.com.goldenwater.domain.PtApp;
|
|
import cn.com.goldenwater.domain.PtApp;
|
|
|
import cn.com.goldenwater.domain.PtService;
|
|
import cn.com.goldenwater.domain.PtService;
|
|
|
|
|
+import cn.com.goldenwater.domain.PtServiceAlarm;
|
|
|
import cn.com.goldenwater.domain.PtServiceLog;
|
|
import cn.com.goldenwater.domain.PtServiceLog;
|
|
|
import cn.com.goldenwater.service.PtAppService;
|
|
import cn.com.goldenwater.service.PtAppService;
|
|
|
|
|
+import cn.com.goldenwater.service.PtServiceAlarmService;
|
|
|
import cn.com.goldenwater.service.PtServiceLogService;
|
|
import cn.com.goldenwater.service.PtServiceLogService;
|
|
|
import cn.com.goldenwater.service.PtServiceService;
|
|
import cn.com.goldenwater.service.PtServiceService;
|
|
|
import cn.com.goldenwater.utils.GeoipUtils;
|
|
import cn.com.goldenwater.utils.GeoipUtils;
|
|
@@ -48,26 +50,23 @@ public class ResponseLogGlobalFilter implements GlobalFilter, Ordered {
|
|
|
@Autowired
|
|
@Autowired
|
|
|
private PtAppService ptAppService;
|
|
private PtAppService ptAppService;
|
|
|
|
|
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private PtServiceAlarmService ptServiceAlarmService;
|
|
|
|
|
+
|
|
|
@Override
|
|
@Override
|
|
|
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
|
|
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
|
|
|
try {
|
|
try {
|
|
|
ServerHttpResponse originalResponse = exchange.getResponse();
|
|
ServerHttpResponse originalResponse = exchange.getResponse();
|
|
|
DataBufferFactory bufferFactory = originalResponse.bufferFactory();
|
|
DataBufferFactory bufferFactory = originalResponse.bufferFactory();
|
|
|
- HttpStatus statusCode = originalResponse.getStatusCode();
|
|
|
|
|
|
|
|
|
|
// 记录请求开始时间
|
|
// 记录请求开始时间
|
|
|
long startTime = System.currentTimeMillis();
|
|
long startTime = System.currentTimeMillis();
|
|
|
|
|
|
|
|
- if (statusCode != HttpStatus.OK) {
|
|
|
|
|
- return chain.filter(exchange); // 降级处理返回数据
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
ServerHttpResponseDecorator decoratedResponse = new ServerHttpResponseDecorator(originalResponse) {
|
|
ServerHttpResponseDecorator decoratedResponse = new ServerHttpResponseDecorator(originalResponse) {
|
|
|
@Override
|
|
@Override
|
|
|
public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
|
|
public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
|
|
|
if (body instanceof Flux) {
|
|
if (body instanceof Flux) {
|
|
|
Flux<? extends DataBuffer> fluxBody = Flux.from(body);
|
|
Flux<? extends DataBuffer> fluxBody = Flux.from(body);
|
|
|
-
|
|
|
|
|
return super.writeWith(fluxBody.buffer().map(dataBuffers -> {
|
|
return super.writeWith(fluxBody.buffer().map(dataBuffers -> {
|
|
|
|
|
|
|
|
// 合并多个流集合,解决返回体分段传输
|
|
// 合并多个流集合,解决返回体分段传输
|
|
@@ -92,7 +91,6 @@ public class ResponseLogGlobalFilter implements GlobalFilter, Ordered {
|
|
|
rspArgs.add(originalResponse.getStatusCode().value());
|
|
rspArgs.add(originalResponse.getStatusCode().value());
|
|
|
rspArgs.add(exchange.getRequest().getURI());
|
|
rspArgs.add(exchange.getRequest().getURI());
|
|
|
rspArgs.add(result);
|
|
rspArgs.add(result);
|
|
|
- log.info("<-- {} {}\n{}", rspArgs.toArray());
|
|
|
|
|
|
|
|
|
|
// 保存服务日志
|
|
// 保存服务日志
|
|
|
saveServiceLog(exchange, result, System.currentTimeMillis() - startTime, originalResponse.getStatusCode().value());
|
|
saveServiceLog(exchange, result, System.currentTimeMillis() - startTime, originalResponse.getStatusCode().value());
|
|
@@ -101,10 +99,16 @@ public class ResponseLogGlobalFilter implements GlobalFilter, Ordered {
|
|
|
return bufferFactory.wrap(result.getBytes());
|
|
return bufferFactory.wrap(result.getBytes());
|
|
|
}));
|
|
}));
|
|
|
} else {
|
|
} else {
|
|
|
- // 对于非Flux响应体,仍然记录日志但不处理内容
|
|
|
|
|
- saveServiceLog(exchange, "", System.currentTimeMillis() - startTime, originalResponse.getStatusCode().value());
|
|
|
|
|
|
|
+ Mono<DataBuffer> monoBody = (Mono<DataBuffer>) body;
|
|
|
|
|
+ return super.writeWith(monoBody.doOnNext(dataBuffer -> {
|
|
|
|
|
+ byte[] content = new byte[dataBuffer.readableByteCount()];
|
|
|
|
|
+ dataBuffer.read(content);
|
|
|
|
|
+ String responseStr = new String(content);
|
|
|
|
|
+
|
|
|
|
|
+ // 记录日志
|
|
|
|
|
+ saveServiceLog(exchange, responseStr, System.currentTimeMillis() - startTime, originalResponse.getStatusCode().value());
|
|
|
|
|
+ }));
|
|
|
}
|
|
}
|
|
|
- return super.writeWith(body);
|
|
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
return chain.filter(exchange.mutate().response(decoratedResponse).build());
|
|
return chain.filter(exchange.mutate().response(decoratedResponse).build());
|
|
@@ -134,6 +138,7 @@ public class ResponseLogGlobalFilter implements GlobalFilter, Ordered {
|
|
|
PtServiceLog serviceLog = new PtServiceLog();
|
|
PtServiceLog serviceLog = new PtServiceLog();
|
|
|
// 设置日志字段
|
|
// 设置日志字段
|
|
|
serviceLog.setTm(new Date());
|
|
serviceLog.setTm(new Date());
|
|
|
|
|
+ serviceLog.setStatusCode(statusCode);
|
|
|
|
|
|
|
|
// 构建包含查询参数和请求体的JSON对象
|
|
// 构建包含查询参数和请求体的JSON对象
|
|
|
JSONObject requestParams = new JSONObject();
|
|
JSONObject requestParams = new JSONObject();
|
|
@@ -168,9 +173,11 @@ public class ResponseLogGlobalFilter implements GlobalFilter, Ordered {
|
|
|
// 将请求参数转换为JSON字符串存储
|
|
// 将请求参数转换为JSON字符串存储
|
|
|
serviceLog.setSenText(requestParams.toJSONString());
|
|
serviceLog.setSenText(requestParams.toJSONString());
|
|
|
serviceLog.setUrl(exchange.getRequest().getURI().getPath());
|
|
serviceLog.setUrl(exchange.getRequest().getURI().getPath());
|
|
|
|
|
+ if (responseContent.length() > 4000) {
|
|
|
|
|
+ responseContent = responseContent.substring(0, 4000);
|
|
|
|
|
+ }
|
|
|
serviceLog.setReturnText(responseContent);
|
|
serviceLog.setReturnText(responseContent);
|
|
|
serviceLog.setExecTm(execTime);
|
|
serviceLog.setExecTm(execTime);
|
|
|
- serviceLog.setStatusCode((long) statusCode);
|
|
|
|
|
|
|
|
|
|
// 获取客户端IP
|
|
// 获取客户端IP
|
|
|
String clientIp = exchange.getRequest().getHeaders().getFirst("X-Forwarded-For");
|
|
String clientIp = exchange.getRequest().getHeaders().getFirst("X-Forwarded-For");
|
|
@@ -187,6 +194,8 @@ public class ResponseLogGlobalFilter implements GlobalFilter, Ordered {
|
|
|
|
|
|
|
|
// 通过URL获取服务信息
|
|
// 通过URL获取服务信息
|
|
|
String requestUrl = exchange.getRequest().getURI().getPath();
|
|
String requestUrl = exchange.getRequest().getURI().getPath();
|
|
|
|
|
+ String gatewayUrl = "/" + requestUrl.split("/")[1];
|
|
|
|
|
+ requestUrl = requestUrl.replaceFirst(gatewayUrl, "");
|
|
|
PtService ptService = ptServiceService.getServiceByUrl(requestUrl);
|
|
PtService ptService = ptServiceService.getServiceByUrl(requestUrl);
|
|
|
if (ptService != null) {
|
|
if (ptService != null) {
|
|
|
serviceLog.setServiceName(ptService.getName());
|
|
serviceLog.setServiceName(ptService.getName());
|
|
@@ -207,8 +216,12 @@ public class ResponseLogGlobalFilter implements GlobalFilter, Ordered {
|
|
|
|
|
|
|
|
// 异步保存日志
|
|
// 异步保存日志
|
|
|
ptServiceLogService.save(serviceLog);
|
|
ptServiceLogService.save(serviceLog);
|
|
|
|
|
+
|
|
|
|
|
+ // 判断是否记录报警信息
|
|
|
|
|
+ ptServiceAlarmService.saveByLog(serviceLog, responseContent, gatewayUrl);
|
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
|
log.error("保存服务日志异常: ", e);
|
|
log.error("保存服务日志异常: ", e);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
}
|
|
}
|