fix: 修复链路追踪输出记录及关闭追踪时的额外开销

This commit is contained in:
Obltv
2026-07-23 14:45:43 +08:00
parent 06ff95cdc3
commit 36e3cf8c52
4 changed files with 25 additions and 9 deletions

View File

@@ -43,26 +43,26 @@ public class DefaultTraceStreamSpan implements TraceStreamSpan {
} }
@Override @Override
public void finishSuccess() { public void finishSuccess(String outputPayload) {
finish(TraceConstants.STATUS_SUCCESS, null); finish(TraceConstants.STATUS_SUCCESS, null, outputPayload);
} }
@Override @Override
public void finishError(Throwable throwable) { public void finishError(Throwable throwable) {
finish(TraceConstants.STATUS_ERROR, TracePayloadUtils.error(throwable, traceProperties)); finish(TraceConstants.STATUS_ERROR, TracePayloadUtils.error(throwable, traceProperties), null);
} }
@Override @Override
public void finishCancelledIfRunning() { public void finishCancelledIfRunning() {
finish(TraceConstants.STATUS_CANCELLED, null); finish(TraceConstants.STATUS_CANCELLED, null, null);
} }
private void finish(String status, String errorMessage) { private void finish(String status, String errorMessage, String outputPayload) {
if (!finished.compareAndSet(false, true)) { if (!finished.compareAndSet(false, true)) {
return; return;
} }
try { try {
traceRecordService.finishNode(traceId, nodeId, status, errorMessage, null, traceRecordService.finishNode(traceId, nodeId, status, errorMessage, outputPayload,
new Date(), System.currentTimeMillis() - startMillis); new Date(), System.currentTimeMillis() - startMillis);
} catch (Exception e) { } catch (Exception e) {
log.warn("结束 trace stream span 失败traceId={}, nodeId={}", traceId, nodeId, e); log.warn("结束 trace stream span 失败traceId={}, nodeId={}", traceId, nodeId, e);

View File

@@ -7,7 +7,14 @@ public interface TraceStreamSpan {
void detach(); void detach();
void finishSuccess(); /**
* 结束成功的流式节点,并可写入输出摘要。
*/
default void finishSuccess() {
finishSuccess(null);
}
void finishSuccess(String outputPayload);
void finishError(Throwable throwable); void finishError(Throwable throwable);

View File

@@ -337,7 +337,8 @@ public class ChatServiceFacade implements IChatService {
result, RoleType.ASSISTANT.getName(), chatRequest.getModel()); result, RoleType.ASSISTANT.getName(), chatRequest.getModel());
} }
if (llmSpan != null) { if (llmSpan != null) {
llmSpan.finishSuccess(); llmSpan.finishSuccess(RagTracePayloadBuilder.streamOutputSummary(
result == null ? 0 : result.length()));
} }
finishTraceRun(traceRun, TraceConstants.STATUS_SUCCESS, null); finishTraceRun(traceRun, TraceConstants.STATUS_SUCCESS, null);
} catch (Exception e) { } catch (Exception e) {

View File

@@ -76,6 +76,8 @@ public class KnowledgeRetrievalServiceImpl implements KnowledgeRetrievalService
} }
log.info("开始知识库检索, kid={}, query={}", queryVectorBo.getKid(), queryVectorBo.getQuery()); log.info("开始知识库检索, kid={}, query={}", queryVectorBo.getKid(), queryVectorBo.getQuery());
String retrievalInputPayload = traceActive()
? RagTracePayloadBuilder.retrievalInputSummary(queryVectorBo) : null;
List<KnowledgeRetrievalVo> finalResults = TraceNodeTemplate.withNode(traceRecordService, traceProperties, List<KnowledgeRetrievalVo> finalResults = TraceNodeTemplate.withNode(traceRecordService, traceProperties,
"retrieval", RagTraceNodeTypes.NODE_RETRIEVAL, "retrieval", RagTraceNodeTypes.NODE_RETRIEVAL,
KnowledgeRetrievalServiceImpl.class.getName(), "retrieve", KnowledgeRetrievalServiceImpl.class.getName(), "retrieve",
@@ -206,8 +208,10 @@ public class KnowledgeRetrievalServiceImpl implements KnowledgeRetrievalService
*/ */
private List<KnowledgeRetrievalVo> performRerank(QueryVectorBo queryVectorBo, List<KnowledgeRetrievalVo> coarseResults) { private List<KnowledgeRetrievalVo> performRerank(QueryVectorBo queryVectorBo, List<KnowledgeRetrievalVo> coarseResults) {
int topN = queryVectorBo.getRerankTopN() != null ? queryVectorBo.getRerankTopN() : queryVectorBo.getMaxResults(); int topN = queryVectorBo.getRerankTopN() != null ? queryVectorBo.getRerankTopN() : queryVectorBo.getMaxResults();
String rerankInputPayload = traceActive()
? RagTracePayloadBuilder.rerankInputSummary(queryVectorBo, coarseResults.size(), topN) : null;
TraceNodeHandle traceNode = startTraceNode("rerank", RagTraceNodeTypes.NODE_RERANK, "performRerank", TraceNodeHandle traceNode = startTraceNode("rerank", RagTraceNodeTypes.NODE_RERANK, "performRerank",
RagTracePayloadBuilder.rerankInputSummary(queryVectorBo, coarseResults.size(), topN)); rerankInputPayload);
try { try {
RerankModelService rerankModel = rerankModelFactory.createModel(queryVectorBo.getRerankModelName()); RerankModelService rerankModel = rerankModelFactory.createModel(queryVectorBo.getRerankModelName());
@@ -324,6 +328,10 @@ public class KnowledgeRetrievalServiceImpl implements KnowledgeRetrievalService
} }
} }
private boolean traceActive() {
return traceProperties.isEnabled() && StringUtils.isNotBlank(TraceContext.getTraceId());
}
private void finishTraceNode(TraceNodeHandle traceNode, String status, Throwable error, String outputPayload) { private void finishTraceNode(TraceNodeHandle traceNode, String status, Throwable error, String outputPayload) {
if (traceNode == null || !traceNode.finished.compareAndSet(false, true)) { if (traceNode == null || !traceNode.finished.compareAndSet(false, true)) {
return; return;