Skip to content

Commit d6d43a7

Browse files
authored
Allow searching messages in a specific partition (#678)
1 parent 10d4537 commit d6d43a7

File tree

6 files changed

+38
-5
lines changed

6 files changed

+38
-5
lines changed

src/main/java/kafdrop/controller/MessageController.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,7 @@ public String searchMessageForm(@PathVariable("name") String topicName,
218218
defaultForm.setSearchText("");
219219
defaultForm.setFormat(defaultFormat);
220220
defaultForm.setKeyFormat(defaultKeyFormat);
221+
defaultForm.setPartition(-1);
221222
defaultForm.setMaximumCount(100);
222223
defaultForm.setStartTimestamp(new Date(0));
223224
model.addAttribute("searchMessageForm", defaultForm);
@@ -231,6 +232,7 @@ public String searchMessageForm(@PathVariable("name") String topicName,
231232
model.addAttribute("messageFormats", MessageFormat.values());
232233
model.addAttribute("defaultKeyFormat", defaultKeyFormat);
233234
model.addAttribute("keyFormats", KeyFormat.values());
235+
model.addAttribute("partitions", topic.getPartitions().stream().map(TopicPartitionVO::getId).toList());
234236
model.addAttribute("descFiles", protobufProperties.getDescFilesList());
235237

236238
if (!searchMessageForm.isEmpty() && !errors.hasErrors()) {
@@ -247,6 +249,7 @@ public String searchMessageForm(@PathVariable("name") String topicName,
247249
var searchResults = kafkaMonitor.searchMessages(
248250
topicName,
249251
searchMessageForm.getSearchText(),
252+
searchMessageForm.getPartition(),
250253
searchMessageForm.getMaximumCount(),
251254
searchMessageForm.getStartTimestamp(),
252255
deserializers);

src/main/java/kafdrop/form/SearchMessageForm.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ public class SearchMessageForm {
2020
@Max(1000)
2121
private Integer maximumCount;
2222

23+
private Integer partition;
24+
2325
private MessageFormat format;
2426

2527
private MessageFormat keyFormat;
@@ -103,4 +105,12 @@ public String getMsgTypeName() {
103105
public void setMsgTypeName(String msgTypeName) {
104106
this.msgTypeName = msgTypeName;
105107
}
108+
109+
public Integer getPartition() {
110+
return partition;
111+
}
112+
113+
public void setPartition(Integer partition) {
114+
this.partition = partition;
115+
}
106116
}

src/main/java/kafdrop/service/KafkaHighLevelConsumer.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,11 +204,19 @@ synchronized List<ConsumerRecord<String, String>> getLatestRecords(String topic,
204204
*/
205205
synchronized SearchResults searchRecords(String topic,
206206
String searchString,
207+
Integer partition,
207208
Integer maximumCount,
208209
Date startTimestamp,
209210
Deserializers deserializers) {
210211
initializeClient();
211-
final List<TopicPartition> partitions = determinePartitionsForTopic(topic);
212+
List<TopicPartition> partitions = determinePartitionsForTopic(topic);
213+
if (partition != -1) {
214+
var partitionOpt = partitions.stream().filter(p -> p.partition() == partition).findAny();
215+
if (partitionOpt.isEmpty()) {
216+
throw new IllegalArgumentException("Partition does not exist in topic");
217+
}
218+
partitions = List.of(partitionOpt.get());
219+
}
212220
kafkaConsumer.assign(partitions);
213221
seekToTimestamp(partitions, startTimestamp);
214222

src/main/java/kafdrop/service/KafkaMonitor.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ List<MessageVO> getMessages(TopicPartition topicPartition, long offset, int coun
6060

6161
SearchResultsVO searchMessages(String topic,
6262
String searchString,
63+
Integer partition,
6364
Integer maximumCount,
6465
Date startTimestamp,
6566
Deserializers deserializers);

src/main/java/kafdrop/service/KafkaMonitorImpl.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -250,10 +250,11 @@ public List<ConsumerVO> getConsumersByTopics(Collection<TopicVO> topicVos) {
250250
@Override
251251
public SearchResultsVO searchMessages(String topic,
252252
String searchString,
253-
Integer maxmuimCount,
253+
Integer partition,
254+
Integer maximumCount,
254255
Date startTimestamp,
255256
Deserializers deserializers) {
256-
final var records = highLevelConsumer.searchRecords(topic, searchString, maxmuimCount, startTimestamp,
257+
final var records = highLevelConsumer.searchRecords(topic, searchString, partition, maximumCount, startTimestamp,
257258
deserializers);
258259
final var results = new SearchResultsVO();
259260

src/main/resources/templates/search-message.ftlh

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,13 +70,23 @@
7070
<form method="GET" action="<@spring.url '/topic/${topic.name}/search-messages'/>" id="searchMessageForm" class="card-body">
7171
<div class="row g-3">
7272
<@spring.bind path="searchMessageForm.searchText"/>
73-
<div class="col-7 form-group ${spring.status.error?string("has-error", "")}">
73+
<div class="col-5 form-group ${spring.status.error?string("has-error", "")}">
7474
<label class="control-label" for="searchText">Search text</label>
7575
<@spring.formInput path="searchMessageForm.searchText" attributes='class="form-control" size="40"'/>
7676
<#if spring.status.error>
7777
<span class="text-danger"><i class="fa fa-times-circle"></i><@spring.showErrors "<br/>"/></span>
7878
</#if>
7979
</div>
80+
<@spring.bind path="searchMessageForm.partition"/>
81+
<div class="col-2 form-group ${spring.status.error?string("has-error", "")}">
82+
<label class="control-label" for="partition">Partition</label>
83+
<select class="form-control" id="partition" name="partition">
84+
<option value="-1">All</option>
85+
<#list partitions as p>
86+
<option value="${p}">${p}</option>
87+
</#list>
88+
</select>
89+
</div>
8090
<@spring.bind path="searchMessageForm.startTimestamp"/>
8191
<div class="col form-group ${spring.status.error?string("has-error", "")}">
8292
<label class=control-label" for="maximumCount">Start Timestamp</label>
@@ -169,4 +179,4 @@
169179
</#if>
170180
</div>
171181
172-
<@template.footer/>
182+
<@template.footer/>

0 commit comments

Comments
 (0)