feat: persist and expose resolvedEndpointUri for execution-level drill-down
Wire resolvedEndpointUri through the full chain: - V9 migration adds resolved_endpoint_uri column - IngestionService extracts from ProcessorExecution - PostgresExecutionStore persists and reads the column - ProcessorNode includes field in detail API response - UI schema updated for ProcessorNode and PositionedNode Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -73,8 +73,9 @@ public class PostgresExecutionStore implements ExecutionStore {
|
|||||||
application_name, route_id, depth, parent_processor_id,
|
application_name, route_id, depth, parent_processor_id,
|
||||||
status, start_time, end_time, duration_ms, error_message, error_stacktrace,
|
status, start_time, end_time, duration_ms, error_message, error_stacktrace,
|
||||||
input_body, output_body, input_headers, output_headers, attributes,
|
input_body, output_body, input_headers, output_headers, attributes,
|
||||||
loop_index, loop_size, split_index, split_size, multicast_index)
|
loop_index, loop_size, split_index, split_size, multicast_index,
|
||||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?::jsonb, ?::jsonb, ?::jsonb, ?, ?, ?, ?, ?)
|
resolved_endpoint_uri)
|
||||||
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?::jsonb, ?::jsonb, ?::jsonb, ?, ?, ?, ?, ?, ?)
|
||||||
ON CONFLICT (execution_id, processor_id, start_time) DO UPDATE SET
|
ON CONFLICT (execution_id, processor_id, start_time) DO UPDATE SET
|
||||||
status = EXCLUDED.status,
|
status = EXCLUDED.status,
|
||||||
end_time = COALESCE(EXCLUDED.end_time, processor_executions.end_time),
|
end_time = COALESCE(EXCLUDED.end_time, processor_executions.end_time),
|
||||||
@@ -90,7 +91,8 @@ public class PostgresExecutionStore implements ExecutionStore {
|
|||||||
loop_size = COALESCE(EXCLUDED.loop_size, processor_executions.loop_size),
|
loop_size = COALESCE(EXCLUDED.loop_size, processor_executions.loop_size),
|
||||||
split_index = COALESCE(EXCLUDED.split_index, processor_executions.split_index),
|
split_index = COALESCE(EXCLUDED.split_index, processor_executions.split_index),
|
||||||
split_size = COALESCE(EXCLUDED.split_size, processor_executions.split_size),
|
split_size = COALESCE(EXCLUDED.split_size, processor_executions.split_size),
|
||||||
multicast_index = COALESCE(EXCLUDED.multicast_index, processor_executions.multicast_index)
|
multicast_index = COALESCE(EXCLUDED.multicast_index, processor_executions.multicast_index),
|
||||||
|
resolved_endpoint_uri = COALESCE(EXCLUDED.resolved_endpoint_uri, processor_executions.resolved_endpoint_uri)
|
||||||
""",
|
""",
|
||||||
processors.stream().map(p -> new Object[]{
|
processors.stream().map(p -> new Object[]{
|
||||||
p.executionId(), p.processorId(), p.processorType(),
|
p.executionId(), p.processorId(), p.processorType(),
|
||||||
@@ -102,7 +104,8 @@ public class PostgresExecutionStore implements ExecutionStore {
|
|||||||
p.inputBody(), p.outputBody(), p.inputHeaders(), p.outputHeaders(),
|
p.inputBody(), p.outputBody(), p.inputHeaders(), p.outputHeaders(),
|
||||||
p.attributes(),
|
p.attributes(),
|
||||||
p.loopIndex(), p.loopSize(), p.splitIndex(), p.splitSize(),
|
p.loopIndex(), p.loopSize(), p.splitIndex(), p.splitSize(),
|
||||||
p.multicastIndex()
|
p.multicastIndex(),
|
||||||
|
p.resolvedEndpointUri()
|
||||||
}).toList());
|
}).toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -160,7 +163,8 @@ public class PostgresExecutionStore implements ExecutionStore {
|
|||||||
rs.getObject("loop_size") != null ? rs.getInt("loop_size") : null,
|
rs.getObject("loop_size") != null ? rs.getInt("loop_size") : null,
|
||||||
rs.getObject("split_index") != null ? rs.getInt("split_index") : null,
|
rs.getObject("split_index") != null ? rs.getInt("split_index") : null,
|
||||||
rs.getObject("split_size") != null ? rs.getInt("split_size") : null,
|
rs.getObject("split_size") != null ? rs.getInt("split_size") : null,
|
||||||
rs.getObject("multicast_index") != null ? rs.getInt("multicast_index") : null);
|
rs.getObject("multicast_index") != null ? rs.getInt("multicast_index") : null,
|
||||||
|
rs.getString("resolved_endpoint_uri"));
|
||||||
|
|
||||||
private static Instant toInstant(ResultSet rs, String column) throws SQLException {
|
private static Instant toInstant(ResultSet rs, String column) throws SQLException {
|
||||||
Timestamp ts = rs.getTimestamp(column);
|
Timestamp ts = rs.getTimestamp(column);
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
ALTER TABLE processor_executions ADD COLUMN resolved_endpoint_uri TEXT;
|
||||||
@@ -63,7 +63,8 @@ public class DetailService {
|
|||||||
parseAttributes(p.attributes()),
|
parseAttributes(p.attributes()),
|
||||||
p.loopIndex(), p.loopSize(),
|
p.loopIndex(), p.loopSize(),
|
||||||
p.splitIndex(), p.splitSize(),
|
p.splitIndex(), p.splitSize(),
|
||||||
p.multicastIndex()
|
p.multicastIndex(),
|
||||||
|
p.resolvedEndpointUri()
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ public final class ProcessorNode {
|
|||||||
private final Integer splitIndex;
|
private final Integer splitIndex;
|
||||||
private final Integer splitSize;
|
private final Integer splitSize;
|
||||||
private final Integer multicastIndex;
|
private final Integer multicastIndex;
|
||||||
|
private final String resolvedEndpointUri;
|
||||||
private final List<ProcessorNode> children;
|
private final List<ProcessorNode> children;
|
||||||
|
|
||||||
public ProcessorNode(String processorId, String processorType, String status,
|
public ProcessorNode(String processorId, String processorType, String status,
|
||||||
@@ -35,7 +36,8 @@ public final class ProcessorNode {
|
|||||||
Map<String, String> attributes,
|
Map<String, String> attributes,
|
||||||
Integer loopIndex, Integer loopSize,
|
Integer loopIndex, Integer loopSize,
|
||||||
Integer splitIndex, Integer splitSize,
|
Integer splitIndex, Integer splitSize,
|
||||||
Integer multicastIndex) {
|
Integer multicastIndex,
|
||||||
|
String resolvedEndpointUri) {
|
||||||
this.processorId = processorId;
|
this.processorId = processorId;
|
||||||
this.processorType = processorType;
|
this.processorType = processorType;
|
||||||
this.status = status;
|
this.status = status;
|
||||||
@@ -50,6 +52,7 @@ public final class ProcessorNode {
|
|||||||
this.splitIndex = splitIndex;
|
this.splitIndex = splitIndex;
|
||||||
this.splitSize = splitSize;
|
this.splitSize = splitSize;
|
||||||
this.multicastIndex = multicastIndex;
|
this.multicastIndex = multicastIndex;
|
||||||
|
this.resolvedEndpointUri = resolvedEndpointUri;
|
||||||
this.children = new ArrayList<>();
|
this.children = new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -71,5 +74,6 @@ public final class ProcessorNode {
|
|||||||
public Integer getSplitIndex() { return splitIndex; }
|
public Integer getSplitIndex() { return splitIndex; }
|
||||||
public Integer getSplitSize() { return splitSize; }
|
public Integer getSplitSize() { return splitSize; }
|
||||||
public Integer getMulticastIndex() { return multicastIndex; }
|
public Integer getMulticastIndex() { return multicastIndex; }
|
||||||
|
public String getResolvedEndpointUri() { return resolvedEndpointUri; }
|
||||||
public List<ProcessorNode> getChildren() { return List.copyOf(children); }
|
public List<ProcessorNode> getChildren() { return List.copyOf(children); }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -131,7 +131,8 @@ public class IngestionService {
|
|||||||
toJson(p.getAttributes()),
|
toJson(p.getAttributes()),
|
||||||
p.getLoopIndex(), p.getLoopSize(),
|
p.getLoopIndex(), p.getLoopSize(),
|
||||||
p.getSplitIndex(), p.getSplitSize(),
|
p.getSplitIndex(), p.getSplitSize(),
|
||||||
p.getMulticastIndex()
|
p.getMulticastIndex(),
|
||||||
|
p.getResolvedEndpointUri()
|
||||||
));
|
));
|
||||||
if (p.getChildren() != null) {
|
if (p.getChildren() != null) {
|
||||||
flat.addAll(flattenProcessors(
|
flat.addAll(flattenProcessors(
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ public interface ExecutionStore {
|
|||||||
String attributes,
|
String attributes,
|
||||||
Integer loopIndex, Integer loopSize,
|
Integer loopIndex, Integer loopSize,
|
||||||
Integer splitIndex, Integer splitSize,
|
Integer splitIndex, Integer splitSize,
|
||||||
Integer multicastIndex
|
Integer multicastIndex,
|
||||||
|
String resolvedEndpointUri
|
||||||
) {}
|
) {}
|
||||||
}
|
}
|
||||||
|
|||||||
2
ui/src/api/schema.d.ts
vendored
2
ui/src/api/schema.d.ts
vendored
@@ -1652,6 +1652,7 @@ export interface components {
|
|||||||
attributes: {
|
attributes: {
|
||||||
[key: string]: string;
|
[key: string]: string;
|
||||||
};
|
};
|
||||||
|
resolvedEndpointUri?: string;
|
||||||
children: components["schemas"]["ProcessorNode"][];
|
children: components["schemas"]["ProcessorNode"][];
|
||||||
};
|
};
|
||||||
DiagramLayout: {
|
DiagramLayout: {
|
||||||
@@ -1680,6 +1681,7 @@ export interface components {
|
|||||||
width?: number;
|
width?: number;
|
||||||
/** Format: double */
|
/** Format: double */
|
||||||
height?: number;
|
height?: number;
|
||||||
|
endpointUri?: string;
|
||||||
};
|
};
|
||||||
/** @description OIDC configuration for SPA login flow */
|
/** @description OIDC configuration for SPA login flow */
|
||||||
OidcPublicConfigResponse: {
|
OidcPublicConfigResponse: {
|
||||||
|
|||||||
Reference in New Issue
Block a user