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:
hsiegeln
2026-03-31 19:33:49 +02:00
parent 38551eac9d
commit 07f215b0fd
10 changed files with 270 additions and 448 deletions

View File

@@ -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));
}

View File

@@ -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);

View File

@@ -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",