Skip to content

Commit 16f359e

Browse files
superhxclaude
andcommitted
test(cluster-events): use protobuf serialization in integration test
Also fix build: include proto-generated sources in clients compilation, exclude them from spotless/checkstyle/spotbugs. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 4b0d507 commit 16f359e

File tree

3 files changed

+56
-9
lines changed

3 files changed

+56
-9
lines changed

build.gradle

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -769,7 +769,7 @@ subprojects {
769769
apply plugin: 'com.diffplug.spotless'
770770
spotless {
771771
java {
772-
targetExclude('src/generated/**/*.java','src/generated-test/**/*.java')
772+
targetExclude('src/generated/**/*.java', 'src/generated-test/**/*.java', 'build/generated/**/*.java')
773773
importOrder('kafka', 'org.apache.kafka', 'com', 'net', 'org', 'java', 'javax', '', '\\#')
774774
removeUnusedImports()
775775
}
@@ -1826,6 +1826,7 @@ project(':clients') {
18261826
main {
18271827
java {
18281828
srcDirs = ["src/generated/java", "src/main/java"]
1829+
srcDir "${protobuf.generatedFilesBaseDir}/main/java"
18291830
}
18301831
}
18311832
test {
@@ -1841,6 +1842,18 @@ project(':clients') {
18411842
}
18421843
}
18431844

1845+
// Exclude protobuf-generated sources from checkstyle and spotless
1846+
afterEvaluate {
1847+
checkstyleMain.source = checkstyleMain.source.filter { !it.path.contains('/generated/source/proto/') }
1848+
if (tasks.findByName('spotlessJava')) {
1849+
spotless {
1850+
java {
1851+
targetExclude('build/generated/source/proto/**/*.java')
1852+
}
1853+
}
1854+
}
1855+
}
1856+
18441857
compileJava.dependsOn 'processMessages'
18451858
srcJar.dependsOn 'processMessages'
18461859

@@ -2489,6 +2502,7 @@ project(':tools') {
24892502
implementation libs.bucket4j
24902503
implementation libs.oshi
24912504
implementation libs.cloudeventsKafka
2505+
implementation libs.protobuf
24922506
// AutoMQ inject end
24932507

24942508
// for SASL/OAUTHBEARER JWT validation

gradle/spotbugs-exclude.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -636,6 +636,10 @@ For a detailed description of spotbugs bug categories, see https://spotbugs.read
636636
<Bug pattern="RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE"/>
637637
</Or>
638638
</Match>
639+
<!-- Suppress all warnings for protobuf-generated classes -->
640+
<Match>
641+
<Package name="~com\.automq\.events"/>
642+
</Match>
639643
<!-- AutoMQ inject end -->
640644

641645
<Match>

tools/src/main/java/org/apache/kafka/tools/ClusterEventsIntegrationTest.java

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@
2525
import org.apache.kafka.clients.admin.NewTopic;
2626
import org.apache.kafka.common.errors.TopicExistsException;
2727

28-
import java.nio.charset.StandardCharsets;
28+
import com.automq.events.RebalanceSummaryEvent;
29+
import com.automq.events.RequestErrorEvent;
30+
2931
import java.util.Collections;
3032
import java.util.List;
3133
import java.util.Map;
@@ -67,21 +69,30 @@ public static void main(String[] args) throws Exception {
6769

6870
// Step 2: publish test events via ClusterEventPublisher
6971
try (ClusterEventPublisher publisher = new ClusterEventPublisher(bootstrapServers, Map.of())) {
72+
RebalanceSummaryEvent rebalanceEvent = RebalanceSummaryEvent.newBuilder()
73+
.setRebalanceId("test-001")
74+
.setTriggerReason("load_imbalance")
75+
.setPartitionCount(5)
76+
.build();
7077
publisher.publishEvent(
7178
"com.automq.ops.rebalance.summary",
7279
"/automq/broker/0",
7380
"rebalance-test-001",
74-
"com.automq.events.RebalanceSummaryEvent",
75-
"{\"rebalance_id\":\"test-001\",\"trigger_reason\":\"load_imbalance\",\"partition_count\":5}"
76-
.getBytes(StandardCharsets.UTF_8));
77-
81+
RebalanceSummaryEvent.getDescriptor().getFullName(),
82+
rebalanceEvent.toByteArray());
83+
84+
RequestErrorEvent requestErrorEvent = RequestErrorEvent.newBuilder()
85+
.setApiKey(0)
86+
.setErrorCode(29)
87+
.setResource("test-topic")
88+
.setRps(42.0)
89+
.build();
7890
publisher.publishEvent(
7991
"com.automq.risk.request_error",
8092
"/automq/broker/0",
8193
"PRODUCE:test-topic",
82-
"com.automq.events.RequestErrorEvent",
83-
"{\"api_key\":0,\"error_code\":29,\"resource\":\"test-topic\",\"rps\":42.0}"
84-
.getBytes(StandardCharsets.UTF_8));
94+
RequestErrorEvent.getDescriptor().getFullName(),
95+
requestErrorEvent.toByteArray());
8596

8697
System.out.println("✓ Published 2 test events");
8798
}
@@ -97,6 +108,7 @@ public static void main(String[] args) throws Exception {
97108
for (CloudEvent e : events) {
98109
System.out.printf(" type=%-45s source=%-25s subject=%s%n",
99110
e.getType(), e.getSource(), e.getSubject());
111+
printEventData(e);
100112
}
101113

102114
List<CloudEvent> rebalanceEvents = admin.describeClusterEvents(
@@ -118,4 +130,21 @@ public static void main(String[] args) throws Exception {
118130
System.out.println("\n✓ All assertions passed");
119131
}
120132
}
133+
134+
private static void printEventData(CloudEvent event) throws Exception {
135+
io.cloudevents.CloudEventData data = event.getData();
136+
if (data == null) return;
137+
byte[] bytes = data.toBytes();
138+
if (bytes == null) return;
139+
String schema = event.getDataSchema() != null ? event.getDataSchema().toString() : "";
140+
if (schema.endsWith("RebalanceSummaryEvent")) {
141+
RebalanceSummaryEvent msg = RebalanceSummaryEvent.parseFrom(bytes);
142+
System.out.printf(" rebalance_id=%s trigger_reason=%s partition_count=%d%n",
143+
msg.getRebalanceId(), msg.getTriggerReason(), msg.getPartitionCount());
144+
} else if (schema.endsWith("RequestErrorEvent")) {
145+
RequestErrorEvent msg = RequestErrorEvent.parseFrom(bytes);
146+
System.out.printf(" api_key=%d error_code=%d resource=%s rps=%.1f%n",
147+
msg.getApiKey(), msg.getErrorCode(), msg.getResource(), msg.getRps());
148+
}
149+
}
121150
}

0 commit comments

Comments
 (0)