Skip to content

Commit 8522b3e

Browse files
committed
Merge branch 'feature/trace' into feature/trace-log
2 parents 79dc7b8 + 1e902e2 commit 8522b3e

27 files changed

Lines changed: 3132 additions & 45 deletions

File tree

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package com.iflytek.astron.console.hub.controller.workflow;
2+
3+
import com.iflytek.astron.console.commons.response.ApiResult;
4+
import com.iflytek.astron.console.commons.util.space.SpaceInfoUtil;
5+
import com.iflytek.astron.console.hub.dto.workflow.WorkflowTraceExecutionQueryRequestDto;
6+
import com.iflytek.astron.console.hub.service.workflow.WorkflowTraceService;
7+
import com.iflytek.astron.console.toolkit.entity.core.workflowtrace.WorkflowTraceExecutionDetailDto;
8+
import com.iflytek.astron.console.toolkit.entity.core.workflowtrace.WorkflowTraceExecutionPageDto;
9+
import io.swagger.v3.oas.annotations.Operation;
10+
import io.swagger.v3.oas.annotations.Parameter;
11+
import io.swagger.v3.oas.annotations.tags.Tag;
12+
import jakarta.validation.Valid;
13+
import lombok.RequiredArgsConstructor;
14+
import lombok.extern.slf4j.Slf4j;
15+
import org.springframework.http.HttpHeaders;
16+
import org.springframework.validation.annotation.Validated;
17+
import org.springframework.web.bind.annotation.GetMapping;
18+
import org.springframework.web.bind.annotation.ModelAttribute;
19+
import org.springframework.web.bind.annotation.PathVariable;
20+
import org.springframework.web.bind.annotation.RequestHeader;
21+
import org.springframework.web.bind.annotation.RequestMapping;
22+
import org.springframework.web.bind.annotation.RequestParam;
23+
import org.springframework.web.bind.annotation.RestController;
24+
25+
@Slf4j
26+
@RestController
27+
@RequestMapping("/publish/workflows")
28+
@RequiredArgsConstructor
29+
@Validated
30+
@Tag(name = "Workflow Trace", description = "Workflow trace panel APIs")
31+
public class WorkflowTraceController {
32+
33+
private final WorkflowTraceService workflowTraceService;
34+
35+
@GetMapping("/{flowId}/trace/executions")
36+
@Operation(summary = "Get workflow trace executions", description = "Retrieve workflow execution traces with pagination")
37+
public ApiResult<WorkflowTraceExecutionPageDto> queryExecutions(
38+
@Parameter(description = "Workflow flowId", required = true)
39+
@PathVariable String flowId,
40+
@Valid @ModelAttribute WorkflowTraceExecutionQueryRequestDto requestDto,
41+
@RequestHeader HttpHeaders headers) {
42+
Long spaceId = SpaceInfoUtil.getSpaceId();
43+
WorkflowTraceExecutionPageDto result = workflowTraceService.queryExecutions(flowId, requestDto, spaceId, headers);
44+
return ApiResult.success(result);
45+
}
46+
47+
@GetMapping("/{flowId}/trace/executions/{sid}")
48+
@Operation(summary = "Get workflow trace execution detail", description = "Retrieve detail for a single workflow execution trace")
49+
public ApiResult<WorkflowTraceExecutionDetailDto> getExecutionDetail(
50+
@Parameter(description = "Workflow flowId", required = true)
51+
@PathVariable String flowId,
52+
@Parameter(description = "Execution sid", required = true)
53+
@PathVariable String sid,
54+
@RequestParam(required = false) String appId,
55+
@RequestHeader HttpHeaders headers) {
56+
Long spaceId = SpaceInfoUtil.getSpaceId();
57+
WorkflowTraceExecutionDetailDto result = workflowTraceService.getExecutionDetail(flowId, sid, appId, spaceId, headers);
58+
return ApiResult.success(result);
59+
}
60+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.iflytek.astron.console.hub.dto.workflow;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
import jakarta.validation.constraints.Max;
5+
import jakarta.validation.constraints.Min;
6+
import lombok.Data;
7+
8+
@Data
9+
@Schema(description = "Workflow trace execution query parameters")
10+
public class WorkflowTraceExecutionQueryRequestDto {
11+
12+
@Schema(description = "Application ID", example = "a01c2bc7")
13+
private String appId;
14+
15+
@Schema(description = "Chat ID", example = "chat-123")
16+
private String chatId;
17+
18+
@Schema(description = "Execution start time in milliseconds", example = "1710000000000")
19+
private Long startTime;
20+
21+
@Schema(description = "Execution end time in milliseconds", example = "1710000006200")
22+
private Long endTime;
23+
24+
@Schema(description = "Page number (1-based)", example = "1")
25+
@Min(value = 1, message = "Page number must be at least 1")
26+
private Integer page = 1;
27+
28+
@Schema(description = "Page size (1-100)", example = "20")
29+
@Min(value = 1, message = "Page size must be at least 1")
30+
@Max(value = 100, message = "Page size cannot exceed 100")
31+
private Integer pageSize = 20;
32+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.iflytek.astron.console.hub.service.workflow;
2+
3+
import com.iflytek.astron.console.hub.dto.workflow.WorkflowTraceExecutionQueryRequestDto;
4+
import com.iflytek.astron.console.toolkit.entity.core.workflowtrace.WorkflowTraceExecutionDetailDto;
5+
import com.iflytek.astron.console.toolkit.entity.core.workflowtrace.WorkflowTraceExecutionPageDto;
6+
import org.springframework.http.HttpHeaders;
7+
8+
public interface WorkflowTraceService {
9+
WorkflowTraceExecutionPageDto queryExecutions(
10+
String flowId,
11+
WorkflowTraceExecutionQueryRequestDto requestDto,
12+
Long spaceId,
13+
HttpHeaders headers);
14+
15+
WorkflowTraceExecutionDetailDto getExecutionDetail(
16+
String flowId,
17+
String sid,
18+
String appId,
19+
Long spaceId,
20+
HttpHeaders headers);
21+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package com.iflytek.astron.console.hub.service.workflow.impl;
2+
3+
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
4+
import com.iflytek.astron.console.commons.entity.workflow.Workflow;
5+
import com.iflytek.astron.console.hub.dto.workflow.WorkflowTraceExecutionQueryRequestDto;
6+
import com.iflytek.astron.console.hub.service.workflow.WorkflowTraceService;
7+
import com.iflytek.astron.console.toolkit.entity.core.workflowtrace.WorkflowTraceExecutionDetailDto;
8+
import com.iflytek.astron.console.toolkit.entity.core.workflowtrace.WorkflowTraceExecutionPageDto;
9+
import com.iflytek.astron.console.toolkit.mapper.workflow.WorkflowMapper;
10+
import com.iflytek.astron.console.toolkit.service.workflowtrace.WorkflowTraceClient;
11+
import com.iflytek.astron.console.toolkit.tool.DataPermissionCheckTool;
12+
import lombok.RequiredArgsConstructor;
13+
import lombok.extern.slf4j.Slf4j;
14+
import org.springframework.http.HttpHeaders;
15+
import org.springframework.stereotype.Service;
16+
17+
@Slf4j
18+
@Service
19+
@RequiredArgsConstructor
20+
public class WorkflowTraceServiceImpl implements WorkflowTraceService {
21+
22+
private final WorkflowMapper workflowMapper;
23+
private final DataPermissionCheckTool dataPermissionCheckTool;
24+
private final WorkflowTraceClient workflowTraceClient;
25+
26+
@Override
27+
public WorkflowTraceExecutionPageDto queryExecutions(
28+
String flowId,
29+
WorkflowTraceExecutionQueryRequestDto requestDto,
30+
Long spaceId,
31+
HttpHeaders headers) {
32+
Workflow workflow = getAuthorizedWorkflow(flowId, spaceId);
33+
log.info("Querying workflow trace executions, flowId={}, workflowId={}, page={}, pageSize={}",
34+
flowId, workflow.getId(), requestDto.getPage(), requestDto.getPageSize());
35+
return workflowTraceClient.queryExecutions(
36+
flowId,
37+
requestDto.getAppId() != null ? requestDto.getAppId() : workflow.getAppId(),
38+
requestDto.getChatId(),
39+
requestDto.getStartTime(),
40+
requestDto.getEndTime(),
41+
requestDto.getPage(),
42+
requestDto.getPageSize(),
43+
headers);
44+
}
45+
46+
@Override
47+
public WorkflowTraceExecutionDetailDto getExecutionDetail(
48+
String flowId,
49+
String sid,
50+
String appId,
51+
Long spaceId,
52+
HttpHeaders headers) {
53+
Workflow workflow = getAuthorizedWorkflow(flowId, spaceId);
54+
log.info("Querying workflow trace execution detail, flowId={}, workflowId={}, sid={}",
55+
flowId, workflow.getId(), sid);
56+
return workflowTraceClient.getExecutionDetail(
57+
sid,
58+
flowId,
59+
appId != null ? appId : workflow.getAppId(),
60+
headers);
61+
}
62+
63+
private Workflow getAuthorizedWorkflow(String flowId, Long spaceId) {
64+
Workflow workflow = workflowMapper.selectOne(
65+
Wrappers.<Workflow>lambdaQuery()
66+
.eq(Workflow::getFlowId, flowId)
67+
.eq(Workflow::getDeleted, false)
68+
.last("LIMIT 1"));
69+
dataPermissionCheckTool.checkWorkflowBelong(workflow, spaceId);
70+
return workflow;
71+
}
72+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.iflytek.astron.console.toolkit.config.properties;
2+
3+
import lombok.Data;
4+
import org.springframework.boot.context.properties.ConfigurationProperties;
5+
import org.springframework.stereotype.Component;
6+
7+
@Component
8+
@Data
9+
@ConfigurationProperties(prefix = "workflow-trace")
10+
public class WorkflowTraceProperties {
11+
private String esUrl;
12+
private String esIndex;
13+
private String esUsername;
14+
private String esPassword;
15+
private boolean esVerify;
16+
private int esTimeoutSeconds;
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.iflytek.astron.console.toolkit.entity.core.workflowtrace;
2+
3+
import lombok.Data;
4+
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
8+
@Data
9+
public class WorkflowTraceExecutionDetailDto {
10+
private WorkflowTraceExecutionItemDto execution = new WorkflowTraceExecutionItemDto();
11+
private List<WorkflowTraceNodeDto> nodes = new ArrayList<>();
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.iflytek.astron.console.toolkit.entity.core.workflowtrace;
2+
3+
import com.fasterxml.jackson.annotation.JsonAlias;
4+
import lombok.Data;
5+
6+
@Data
7+
public class WorkflowTraceExecutionItemDto {
8+
private String sid;
9+
10+
@JsonAlias("flow_id")
11+
private String flowId;
12+
13+
@JsonAlias("flow_name")
14+
private String flowName;
15+
16+
@JsonAlias("start_time")
17+
private Long startTime;
18+
19+
@JsonAlias("end_time")
20+
private Long endTime;
21+
22+
private Integer duration = 0;
23+
24+
private String status;
25+
26+
private WorkflowTraceUsageDto usage = new WorkflowTraceUsageDto();
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.iflytek.astron.console.toolkit.entity.core.workflowtrace;
2+
3+
import lombok.Data;
4+
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
8+
@Data
9+
public class WorkflowTraceExecutionPageDto {
10+
private List<WorkflowTraceExecutionItemDto> list = new ArrayList<>();
11+
private Long total = 0L;
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package com.iflytek.astron.console.toolkit.entity.core.workflowtrace;
2+
3+
import com.fasterxml.jackson.annotation.JsonAlias;
4+
import lombok.Data;
5+
6+
import java.util.ArrayList;
7+
import java.util.List;
8+
import java.util.Map;
9+
10+
@Data
11+
public class WorkflowTraceNodeDto {
12+
private String id;
13+
14+
@JsonAlias("node_id")
15+
private String nodeId;
16+
17+
@JsonAlias("node_name")
18+
private String nodeName;
19+
20+
@JsonAlias("node_type")
21+
private String nodeType;
22+
23+
@JsonAlias("next_log_ids")
24+
private List<String> nextLogIds = new ArrayList<>();
25+
26+
@JsonAlias("start_time")
27+
private Long startTime;
28+
29+
@JsonAlias("end_time")
30+
private Long endTime;
31+
32+
private Integer duration = 0;
33+
34+
@JsonAlias("first_frame_duration")
35+
private Integer firstFrameDuration = -1;
36+
37+
private String status;
38+
39+
@JsonAlias("raw_status")
40+
private Map<String, Object> rawStatus;
41+
42+
private WorkflowTraceUsageDto usage = new WorkflowTraceUsageDto();
43+
44+
private Map<String, Object> input;
45+
46+
private Map<String, Object> config;
47+
48+
private Map<String, Object> output;
49+
50+
private List<String> logs = new ArrayList<>();
51+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.iflytek.astron.console.toolkit.entity.core.workflowtrace;
2+
3+
import com.fasterxml.jackson.annotation.JsonAlias;
4+
import lombok.Data;
5+
6+
@Data
7+
public class WorkflowTraceUsageDto {
8+
@JsonAlias("question_tokens")
9+
private Long questionTokens = 0L;
10+
11+
@JsonAlias("prompt_tokens")
12+
private Long promptTokens = 0L;
13+
14+
@JsonAlias("completion_tokens")
15+
private Long completionTokens = 0L;
16+
17+
@JsonAlias("total_tokens")
18+
private Long totalTokens = 0L;
19+
}

0 commit comments

Comments
 (0)