refactor: replace server-side DTOs with cameleer3-common ExecutionChunk and FlatProcessorRecord
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -5,7 +5,8 @@ import com.cameleer3.server.core.ingestion.MergedExecution;
|
||||
import com.cameleer3.server.core.search.ExecutionSummary;
|
||||
import com.cameleer3.server.core.search.SearchRequest;
|
||||
import com.cameleer3.server.core.search.SearchResult;
|
||||
import com.cameleer3.server.core.storage.model.FlatProcessorRecord;
|
||||
import com.cameleer3.common.model.ExecutionStatus;
|
||||
import com.cameleer3.common.model.FlatProcessorRecord;
|
||||
import com.zaxxer.hikari.HikariDataSource;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
@@ -106,17 +107,13 @@ class ClickHouseSearchIndexIT {
|
||||
store.insertExecutionBatch(List.of(exec1, exec2, exec3));
|
||||
|
||||
// Processor for exec-1: seq=1, to, inputBody with "Hello World", inputHeaders with secret-token
|
||||
FlatProcessorRecord proc1 = new FlatProcessorRecord(
|
||||
1, null, null,
|
||||
"proc-1", "to", null, null,
|
||||
"COMPLETED",
|
||||
baseTime, 50L,
|
||||
null,
|
||||
"Hello World request body", "",
|
||||
Map.of("Authorization", "Bearer secret-token"), null,
|
||||
null, null, null, null, null, null,
|
||||
null, null, null, null, null
|
||||
);
|
||||
FlatProcessorRecord proc1 = new FlatProcessorRecord(1, "proc-1", "to");
|
||||
proc1.setStatus(ExecutionStatus.COMPLETED);
|
||||
proc1.setStartTime(baseTime);
|
||||
proc1.setDurationMs(50L);
|
||||
proc1.setInputBody("Hello World request body");
|
||||
proc1.setOutputBody("");
|
||||
proc1.setInputHeaders(Map.of("Authorization", "Bearer secret-token"));
|
||||
|
||||
store.insertProcessorBatch("default", "exec-1", "route-timer", "my-app", baseTime, List.of(proc1));
|
||||
}
|
||||
|
||||
@@ -6,8 +6,9 @@ import com.cameleer3.server.core.ingestion.MergedExecution;
|
||||
import com.cameleer3.server.core.search.ExecutionSummary;
|
||||
import com.cameleer3.server.core.search.SearchRequest;
|
||||
import com.cameleer3.server.core.search.SearchResult;
|
||||
import com.cameleer3.server.core.storage.model.ExecutionChunk;
|
||||
import com.cameleer3.server.core.storage.model.FlatProcessorRecord;
|
||||
import com.cameleer3.common.model.ExecutionChunk;
|
||||
import com.cameleer3.common.model.ExecutionStatus;
|
||||
import com.cameleer3.common.model.FlatProcessorRecord;
|
||||
import com.zaxxer.hikari.HikariDataSource;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
@@ -70,53 +71,76 @@ class ClickHouseChunkPipelineIT {
|
||||
Instant start = Instant.parse("2026-03-31T12:00:00Z");
|
||||
|
||||
// Chunk 0: RUNNING with initial processors
|
||||
accumulator.onChunk(new ExecutionChunk(
|
||||
"pipeline-1", "order-service", "pod-1", "order-route",
|
||||
"corr-1", "RUNNING",
|
||||
start, null, null, "DEEP",
|
||||
null, null, null, null, null, null,
|
||||
Map.of("orderId", "ORD-123"),
|
||||
null, null, null, null,
|
||||
0, false,
|
||||
List.of(
|
||||
new FlatProcessorRecord(1, null, null, "log1", "log",
|
||||
null, null, "COMPLETED", start, 2L,
|
||||
null, null, null, null, null,
|
||||
null, null, null, null, null, null,
|
||||
null, null, null, null, null),
|
||||
new FlatProcessorRecord(2, null, null, "split1", "split",
|
||||
null, 3, "COMPLETED", start.plusMillis(2), 100L,
|
||||
null, null, null, null, null,
|
||||
null, null, null, null, null, null,
|
||||
null, null, null, null, null),
|
||||
new FlatProcessorRecord(3, 2, "split1", "to1", "to",
|
||||
0, null, "COMPLETED", start.plusMillis(5), 30L,
|
||||
"http://inventory/api",
|
||||
"order ABC-123 check stock", "stock available",
|
||||
null, null,
|
||||
null, null, null, null, null, null,
|
||||
null, null, null, null, null))));
|
||||
ExecutionChunk chunk0 = new ExecutionChunk();
|
||||
chunk0.setExchangeId("pipeline-1");
|
||||
chunk0.setApplicationName("order-service");
|
||||
chunk0.setAgentId("pod-1");
|
||||
chunk0.setRouteId("order-route");
|
||||
chunk0.setCorrelationId("corr-1");
|
||||
chunk0.setStatus(ExecutionStatus.RUNNING);
|
||||
chunk0.setStartTime(start);
|
||||
chunk0.setEngineLevel("DEEP");
|
||||
chunk0.setAttributes(Map.of("orderId", "ORD-123"));
|
||||
chunk0.setChunkSeq(0);
|
||||
chunk0.setFinal(false);
|
||||
|
||||
FlatProcessorRecord p1 = new FlatProcessorRecord(1, "log1", "log");
|
||||
p1.setStatus(ExecutionStatus.COMPLETED);
|
||||
p1.setStartTime(start);
|
||||
p1.setDurationMs(2L);
|
||||
|
||||
FlatProcessorRecord p2 = new FlatProcessorRecord(2, "split1", "split");
|
||||
p2.setIterationSize(3);
|
||||
p2.setStatus(ExecutionStatus.COMPLETED);
|
||||
p2.setStartTime(start.plusMillis(2));
|
||||
p2.setDurationMs(100L);
|
||||
|
||||
FlatProcessorRecord p3 = new FlatProcessorRecord(3, "to1", "to");
|
||||
p3.setParentSeq(2);
|
||||
p3.setParentProcessorId("split1");
|
||||
p3.setIteration(0);
|
||||
p3.setStatus(ExecutionStatus.COMPLETED);
|
||||
p3.setStartTime(start.plusMillis(5));
|
||||
p3.setDurationMs(30L);
|
||||
p3.setResolvedEndpointUri("http://inventory/api");
|
||||
p3.setInputBody("order ABC-123 check stock");
|
||||
p3.setOutputBody("stock available");
|
||||
|
||||
chunk0.setProcessors(List.of(p1, p2, p3));
|
||||
accumulator.onChunk(chunk0);
|
||||
|
||||
// Processors should be buffered immediately
|
||||
assertThat(processorBuffer).hasSize(1);
|
||||
assertThat(executionBuffer).isEmpty();
|
||||
|
||||
// Chunk 1: COMPLETED (final)
|
||||
accumulator.onChunk(new ExecutionChunk(
|
||||
"pipeline-1", "order-service", "pod-1", "order-route",
|
||||
"corr-1", "COMPLETED",
|
||||
start, start.plusMillis(750), 750L, "DEEP",
|
||||
null, null, null, null, null, null,
|
||||
null, null, null, null, null,
|
||||
1, true,
|
||||
List.of(
|
||||
new FlatProcessorRecord(4, 2, "split1", "to1", "to",
|
||||
1, null, "COMPLETED", start.plusMillis(40), 25L,
|
||||
"http://inventory/api",
|
||||
"order DEF-456 check stock", "stock available",
|
||||
null, null,
|
||||
null, null, null, null, null, null,
|
||||
null, null, null, null, null))));
|
||||
ExecutionChunk chunk1 = new ExecutionChunk();
|
||||
chunk1.setExchangeId("pipeline-1");
|
||||
chunk1.setApplicationName("order-service");
|
||||
chunk1.setAgentId("pod-1");
|
||||
chunk1.setRouteId("order-route");
|
||||
chunk1.setCorrelationId("corr-1");
|
||||
chunk1.setStatus(ExecutionStatus.COMPLETED);
|
||||
chunk1.setStartTime(start);
|
||||
chunk1.setEndTime(start.plusMillis(750));
|
||||
chunk1.setDurationMs(750L);
|
||||
chunk1.setEngineLevel("DEEP");
|
||||
chunk1.setChunkSeq(1);
|
||||
chunk1.setFinal(true);
|
||||
|
||||
FlatProcessorRecord p4 = new FlatProcessorRecord(4, "to1", "to");
|
||||
p4.setParentSeq(2);
|
||||
p4.setParentProcessorId("split1");
|
||||
p4.setIteration(1);
|
||||
p4.setStatus(ExecutionStatus.COMPLETED);
|
||||
p4.setStartTime(start.plusMillis(40));
|
||||
p4.setDurationMs(25L);
|
||||
p4.setResolvedEndpointUri("http://inventory/api");
|
||||
p4.setInputBody("order DEF-456 check stock");
|
||||
p4.setOutputBody("stock available");
|
||||
|
||||
chunk1.setProcessors(List.of(p4));
|
||||
accumulator.onChunk(chunk1);
|
||||
|
||||
assertThat(executionBuffer).hasSize(1);
|
||||
assertThat(processorBuffer).hasSize(2);
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
package com.cameleer3.server.app.storage;
|
||||
|
||||
import com.cameleer3.server.core.ingestion.MergedExecution;
|
||||
import com.cameleer3.server.core.storage.model.FlatProcessorRecord;
|
||||
import com.cameleer3.common.model.ExecutionStatus;
|
||||
import com.cameleer3.common.model.FlatProcessorRecord;
|
||||
import com.zaxxer.hikari.HikariDataSource;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
@@ -80,18 +81,16 @@ class ClickHouseExecutionStoreIT {
|
||||
|
||||
@Test
|
||||
void insertProcessorBatch_writesToClickHouse() {
|
||||
FlatProcessorRecord proc = new FlatProcessorRecord(
|
||||
1, null, null,
|
||||
"proc-1", "to", null, null,
|
||||
"COMPLETED",
|
||||
Instant.parse("2026-03-31T10:00:00Z"), 50L,
|
||||
"http://example.com",
|
||||
"input body", "output body",
|
||||
Map.of("h1", "v1"), Map.of("h2", "v2"),
|
||||
null, null, null, null, null, null,
|
||||
Map.of("a1", "v1"),
|
||||
null, null, null, null
|
||||
);
|
||||
FlatProcessorRecord proc = new FlatProcessorRecord(1, "proc-1", "to");
|
||||
proc.setStatus(ExecutionStatus.COMPLETED);
|
||||
proc.setStartTime(Instant.parse("2026-03-31T10:00:00Z"));
|
||||
proc.setDurationMs(50L);
|
||||
proc.setResolvedEndpointUri("http://example.com");
|
||||
proc.setInputBody("input body");
|
||||
proc.setOutputBody("output body");
|
||||
proc.setInputHeaders(Map.of("h1", "v1"));
|
||||
proc.setOutputHeaders(Map.of("h2", "v2"));
|
||||
proc.setAttributes(Map.of("a1", "v1"));
|
||||
|
||||
store.insertProcessorBatch(
|
||||
"default", "exec-1", "route-a", "my-app",
|
||||
@@ -112,48 +111,44 @@ class ClickHouseExecutionStoreIT {
|
||||
|
||||
@Test
|
||||
void insertProcessorBatch_withIterations() {
|
||||
FlatProcessorRecord splitContainer = new FlatProcessorRecord(
|
||||
1, null, null,
|
||||
"split-1", "split", null, 3,
|
||||
"COMPLETED",
|
||||
Instant.parse("2026-03-31T10:00:00Z"), 300L,
|
||||
null, null, null, null, null,
|
||||
null, null, null, null, null, null,
|
||||
null, null, null, null, null
|
||||
);
|
||||
FlatProcessorRecord splitContainer = new FlatProcessorRecord(1, "split-1", "split");
|
||||
splitContainer.setIterationSize(3);
|
||||
splitContainer.setStatus(ExecutionStatus.COMPLETED);
|
||||
splitContainer.setStartTime(Instant.parse("2026-03-31T10:00:00Z"));
|
||||
splitContainer.setDurationMs(300L);
|
||||
|
||||
FlatProcessorRecord child0 = new FlatProcessorRecord(
|
||||
2, 1, "split-1",
|
||||
"child-proc", "to", 0, null,
|
||||
"COMPLETED",
|
||||
Instant.parse("2026-03-31T10:00:00.100Z"), 80L,
|
||||
"http://svc-a", "body0", "out0",
|
||||
null, null,
|
||||
null, null, null, null, null, null,
|
||||
null, null, null, null, null
|
||||
);
|
||||
FlatProcessorRecord child0 = new FlatProcessorRecord(2, "child-proc", "to");
|
||||
child0.setParentSeq(1);
|
||||
child0.setParentProcessorId("split-1");
|
||||
child0.setIteration(0);
|
||||
child0.setStatus(ExecutionStatus.COMPLETED);
|
||||
child0.setStartTime(Instant.parse("2026-03-31T10:00:00.100Z"));
|
||||
child0.setDurationMs(80L);
|
||||
child0.setResolvedEndpointUri("http://svc-a");
|
||||
child0.setInputBody("body0");
|
||||
child0.setOutputBody("out0");
|
||||
|
||||
FlatProcessorRecord child1 = new FlatProcessorRecord(
|
||||
3, 1, "split-1",
|
||||
"child-proc", "to", 1, null,
|
||||
"COMPLETED",
|
||||
Instant.parse("2026-03-31T10:00:00.200Z"), 90L,
|
||||
"http://svc-a", "body1", "out1",
|
||||
null, null,
|
||||
null, null, null, null, null, null,
|
||||
null, null, null, null, null
|
||||
);
|
||||
FlatProcessorRecord child1 = new FlatProcessorRecord(3, "child-proc", "to");
|
||||
child1.setParentSeq(1);
|
||||
child1.setParentProcessorId("split-1");
|
||||
child1.setIteration(1);
|
||||
child1.setStatus(ExecutionStatus.COMPLETED);
|
||||
child1.setStartTime(Instant.parse("2026-03-31T10:00:00.200Z"));
|
||||
child1.setDurationMs(90L);
|
||||
child1.setResolvedEndpointUri("http://svc-a");
|
||||
child1.setInputBody("body1");
|
||||
child1.setOutputBody("out1");
|
||||
|
||||
FlatProcessorRecord child2 = new FlatProcessorRecord(
|
||||
4, 1, "split-1",
|
||||
"child-proc", "to", 2, null,
|
||||
"COMPLETED",
|
||||
Instant.parse("2026-03-31T10:00:00.300Z"), 100L,
|
||||
"http://svc-a", "body2", "out2",
|
||||
null, null,
|
||||
null, null, null, null, null, null,
|
||||
null, null, null, null, null
|
||||
);
|
||||
FlatProcessorRecord child2 = new FlatProcessorRecord(4, "child-proc", "to");
|
||||
child2.setParentSeq(1);
|
||||
child2.setParentProcessorId("split-1");
|
||||
child2.setIteration(2);
|
||||
child2.setStatus(ExecutionStatus.COMPLETED);
|
||||
child2.setStartTime(Instant.parse("2026-03-31T10:00:00.300Z"));
|
||||
child2.setDurationMs(100L);
|
||||
child2.setResolvedEndpointUri("http://svc-a");
|
||||
child2.setInputBody("body2");
|
||||
child2.setOutputBody("out2");
|
||||
|
||||
store.insertProcessorBatch(
|
||||
"default", "exec-2", "route-b", "my-app",
|
||||
|
||||
Reference in New Issue
Block a user