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

  1. Read the ksqlDB server message appended after 'Error: ' and fix the query accordingly
  2. Verify the stream/table names exist in ksqlDB (SHOW STREAMS / SHOW TABLES)
  3. Check ksqlDB server logs for the full error and stack trace
  4. 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

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)