provectus/kafka-ui · error · KsqlApiException
Error:
Error message
Error:
What it means
ResponseParser.parseSelectResponse inspects each ksql push/pull query response JSON frame. When the frame carries a non-null 'errorMessage' field (the ksql server signaling a query-level failure), it throws KsqlApiException('Error: ' + that message).
Solutions
- Read the ksqlDB server message appended after 'Error: ' and fix the query accordingly
- Verify the stream/table names exist in ksqlDB (SHOW STREAMS / SHOW TABLES)
- Check ksqlDB server logs for the full error and stack trace
- Confirm topic/schema/serde configuration the query depends on
Example fix
// before
parseSelectResponse(node); // node has errorMessage, throws at runtime
// after
if (node.hasNonNull("errorMessage")) {
log.warn("ksql query failed: {}", node.get("errorMessage").asText()); // handle before/around parsing
} Defensive patterns
Strategy: try-catch
Validate before calling
// Pre-check response frame shape before deep parsing
if (node != null && node.hasNonNull("errorMessage")) {
throw new KsqlApiException(node.get("errorMessage").asText()); // handle deliberately
} Try / catch
try {
Optional<KsqlResponseTable> t = responseParser.parseSelectResponse(jsonNode);
} catch (KsqlApiException e) {
if (e.getMessage().startsWith("Error:")) {
String serverMsg = e.getMessage().substring("Error:".length()).trim();
log.error("ksqlDB query failed: {}", serverMsg);
} else { throw e; }
} Prevention
- Validate stream/table names exist before querying (SHOW STREAMS/TABLES)
- Monitor the reactive stream's error signal (doOnError) for KsqlApiException
- Check ksqlDB server health/schema registry availability before long queries
- Surface the server's errorMessage text to users instead of retrying blindly
When it happens
Trigger: Streaming a SELECT via ksql and receiving a JSON frame from the ksqlDB server with an 'errorMessage' field — i.e. the server rejected or failed the query (bad table/topic reference, query errors).
Common situations: Querying non-existent streams/tables; ksqlDB server-side query failures; serialization/avro schema problems on the server; permission or config issues surfaced by ksqlDB.
Related errors
AI-assisted analysis of provectus/kafka-ui@83b5a60cc0 (2026-09-08).
Data as JSON: /api/errors/b7eaedd0c506fcdd.
Report an issue: GitHub.
Appendix: source
Thrown at kafka-ui-api/src/main/java/com/provectus/kafka/ui/service/ksql/response/ResponseParser.java:38
public static Optional<KsqlApiClient.KsqlResponseTable> parseSelectResponse(JsonNode jsonNode) {
// in response, we're getting either header record or row data
if (arrayFieldNonEmpty(jsonNode, "header")) {
return Optional.of(
KsqlApiClient.KsqlResponseTable.builder()
.header("Schema")
.columnNames(parseSelectHeadersString(jsonNode.get("header").get("schema").asText()))
.build());
}
if (arrayFieldNonEmpty(jsonNode, "row")) {
return Optional.of(
KsqlApiClient.KsqlResponseTable.builder()
.header("Row")
.values(
List.of(Lists.newArrayList(jsonNode.get("row").get("columns"))))
.build());
}
if (jsonNode.hasNonNull("errorMessage")) {
throw new KsqlApiException("Error: " + jsonNode.get("errorMessage"));
}
// remaining events can be skipped
return Optional.empty();
}
@VisibleForTesting
static List<String> parseSelectHeadersString(String str) {
List<String> headers = new ArrayList<>();
int structNesting = 0;
boolean quotes = false;
var headerBuilder = new StringBuilder();
for (char ch : str.toCharArray()) {
if (ch == '<') {
structNesting++;
} else if (ch == '>') {
structNesting--;
} else if (ch == '`') {
quotes = !quotes;View on GitHub (pinned to 83b5a60cc0)