feat(tracing): add trace start time tracking and improve request logging

This commit is contained in:
sol 2026-03-16 16:10:42 +08:00
parent c679368795
commit c18d4956b5
4 changed files with 42 additions and 15 deletions

View file

@ -1,8 +1,8 @@
package com.bgasol.common.core.base.interceptor;
import cn.dev33.satoken.stp.StpUtil;
import com.bgasol.model.system.requestLog.entity.RequestLogEntity;
import com.bgasol.common.requestLog.service.RequestLogService;
import com.bgasol.model.system.requestLog.entity.RequestLogEntity;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletRequest;
@ -20,13 +20,14 @@ import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import java.lang.reflect.Method;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.UUID;
import static com.bgasol.common.constant.value.SystemConfigValues.REQUEST_EXCEPTION;
import static com.bgasol.common.constant.value.SystemConfigValues.REQUEST_EXCEPTION_PRIMARY;
import static com.bgasol.plugin.openfeign.interceptor.FeignInterceptor.SPAN_ID;
import static com.bgasol.plugin.openfeign.interceptor.FeignInterceptor.TRACE_ID;
import static com.bgasol.plugin.openfeign.interceptor.FeignInterceptor.*;
/**
* 请求日志拦截器
@ -48,20 +49,44 @@ public class RequestLoggingInterceptor implements HandlerInterceptor {
private static final String BUSINESS_METHOD = "BUSINESS_METHOD";
private static final String START_TIME_ATTRIBUTE = "REQUEST_START_TIME";
private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("yyyy_MM_dd");
@Lazy
private final RequestLogService requestLogService;
@Override
public boolean preHandle(@NonNull HttpServletRequest request, @NonNull HttpServletResponse response, @NonNull Object handler) {
getHandlerInfo(request, handler);
Date now = new Date();
request.setAttribute(START_TIME_ATTRIBUTE, now.getTime());
String traceId = request.getHeader(TRACE_ID);
String traceStartTime = request.getHeader(TRACE_START_TIME);
if (ObjectUtils.isEmpty(traceId)) {
request.setAttribute(TRACE_ID, UUID.randomUUID().toString());
traceId = UUID.randomUUID()
.toString()
.replace("-", "");
request.setAttribute(TRACE_ID, traceId);
traceStartTime = now.toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDate()
.format(DATE_FORMAT);
request.setAttribute(TRACE_START_TIME, traceStartTime);
} else {
request.setAttribute(TRACE_ID, traceId);
request.setAttribute(TRACE_START_TIME, traceStartTime);
}
request.setAttribute(SPAN_ID, UUID.randomUUID().toString());
request.setAttribute(START_TIME_ATTRIBUTE, System.currentTimeMillis());
String spanId = traceStartTime + "_" + UUID.randomUUID()
.toString()
.replace("-", "");
request.setAttribute(SPAN_ID, spanId);
return true;
}

View file

@ -18,7 +18,6 @@ import org.apache.commons.lang3.ObjectUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.List;
@ -33,6 +32,7 @@ import static com.bgasol.common.constant.value.SystemConfigValues.ADMIN_USER_ID;
@RequiredArgsConstructor
@Slf4j
public class RequestLogService extends BaseTreeService<RequestLogEntity, RequestLogPageDto> {
private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("yyyy_MM_dd");
private final RequestLogMapper requestLogMapper;
private final UserApi userApi;
private final MessageEnvelopeService messageEnvelopeService;
@ -69,7 +69,7 @@ public class RequestLogService extends BaseTreeService<RequestLogEntity, Request
String dateStr = pageDto.getCreateTime().toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDate()
.format(DateTimeFormatter.ofPattern("yyyy_MM_dd"));
.format(DATE_FORMAT);
RequestLogTableNameHandler.TABLE_SUFFIX.set(dateStr);
return super.findByPage(pageDto);
}
@ -77,8 +77,7 @@ public class RequestLogService extends BaseTreeService<RequestLogEntity, Request
@Override
@Transactional
public void insert(RequestLogEntity entity) {
// 获取当前年_月_日
String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy_MM_dd"));
String dateStr = entity.getId().substring(0, "yyyy_MM_dd".length());
RequestLogTableNameHandler.TABLE_SUFFIX.set(dateStr);
super.insert(entity);
if (!entity.getIsPrimaryErr()) {

View file

@ -19,7 +19,7 @@ public class MybatisPlusInterceptorConfig {
@Bean()
public MybatisPlusInterceptor mybatisPlusInterceptor() {
// 初始化MybatisPlus拦截器
// 初始化MybatisPlus拦截器 插件顺序很重要
MybatisPlusInterceptor interceptors = new MybatisPlusInterceptor();
// 数据权限插件 *数据权限插件需要在分页插件之前添加
@ -27,15 +27,15 @@ public class MybatisPlusInterceptorConfig {
dataPermissionInterceptor.setDataPermissionHandler(dataScopeHandler);
interceptors.addInnerInterceptor(dataPermissionInterceptor);
// 动态表名插件
DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor(dynamicTableNameHandler);
interceptors.addInnerInterceptor(dynamicTableNameInnerInterceptor);
// 分页插件
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
paginationInnerInterceptor.setMaxLimit(10000L);
interceptors.addInnerInterceptor(paginationInnerInterceptor);
// 动态表名插件
DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor(dynamicTableNameHandler);
interceptors.addInnerInterceptor(dynamicTableNameInnerInterceptor);
return interceptors;
}
}

View file

@ -21,6 +21,7 @@ public class FeignInterceptor implements RequestInterceptor {
public static final String TRACE_ID = "TRACE_ID";
public static final String SPAN_ID = "SPAN_ID";
public static final String TRACE_START_TIME = "TRACE_START_TIME";
/**
* feign拦截器, 在feign请求发出之前加入一些操作
@ -46,8 +47,10 @@ public class FeignInterceptor implements RequestInterceptor {
HttpServletRequest request = servletAttributes.getRequest();
String spanId = (String) request.getAttribute(SPAN_ID);
String traceId = (String) request.getAttribute(TRACE_ID);
String traceStartTime = (String) request.getAttribute(TRACE_START_TIME);
requestTemplate.header(SPAN_ID, spanId);
requestTemplate.header(TRACE_ID, traceId);
requestTemplate.header(TRACE_START_TIME, traceStartTime);
}
}