apache/seatunnel · warning

GET returned empty body (null/empty). Skip this node.

Error message

GET {} returned empty body (null/empty). Skip this node.

What it means

After obtaining a member's HTTP port, LogService issues GET logUrl to fetch that node's log file name list. If the response body is null or blank it logs this warning and skips the node, so the aggregated log-name listing omits that node instead of failing.

Solutions

  1. Check basic-auth username/password configuration matches across all nodes (httpConfig).
  2. Curl the logUrl directly from the failing node to see status code/body and fix the remote endpoint.
  3. Verify log4j2/log path is configured on that node so the log-name endpoint can list files.
  4. Inspect intermediate proxies/load balancers that may drop empty or error responses.

Example fix

// before (mismatched auth)
// httpConfig.username="admin"; httpConfig.password="wrong"
// after
// httpConfig.username="admin"; httpConfig.password="correct-from-config"
Defensive patterns

Strategy: validation

Validate before calling

// before calling the remote endpoint, verify auth and URL
// if (StringUtils.isBlank(httpConfig.getBasicAuthUsername()) || StringUtils.isBlank(logUrl)) {
//     failFast("missing auth or url");
// }
// HttpResponse resp = sendGet(logUrl);
// if (resp.status() != 200) { handle(resp.status()); }

Try / catch

try {
    String body = sendGet(logUrl);
    if (StringUtils.isBlank(body)) { log.warn("Empty body from {}", logUrl); return; }
} catch (IOException e) {
    log.warn("Request to {} failed", logUrl, e);
}

Prevention

When it happens

Trigger: Calling the all-log-names REST endpoint when a member's log-name HTTP route returns an empty body: remote REST endpoint erroring silently, auth misconfigured so the response is empty, proxy stripping body, or the node has no resolvable log directory.

Common situations: Basic-auth credentials mismatched between nodes so sendGetWithCredentials gets an empty/401 body; reverse proxy or TLS termination swallowing the response; log path not configured on that node (related to errorIndex 3718/3719).

Related errors


AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10). Data as JSON: /api/errors/c6dd9dbc47c852e0. Report an issue: GitHub.

Appendix: source

Thrown at seatunnel-engine/seatunnel-engine-server/src/main/java/org/apache/seatunnel/engine/server/rest/service/LogService.java:97

                                        .get();
            } catch (Exception e) {
                log.warn("Failed to get HTTP port from member {}, skip.", member.getAddress(), e);
                continue;
            }

            String url = "http://" + host + ":" + nodeHttpPort + contextPath;
            String logUrl = url + REST_URL_GET_ALL_LOG_NAME;

            String allName =
                    httpConfig.isEnableBasicAuth()
                            ? sendGet(
                                    logUrl,
                                    httpConfig.getBasicAuthUsername(),
                                    httpConfig.getBasicAuthPassword())
                            : sendGet(logUrl);

            if (StringUtils.isBlank(allName)) {
                log.warn("GET {} returned empty body (null/empty). Skip this node.", logUrl);
                continue;
            }

            if (log.isDebugEnabled()) {
                log.debug("Request: {} , Result: {}", url, allName);
            }
            ArrayNode jsonNodes = JsonUtils.parseArray(allName);

            final String nodeId = host + ":" + nodeHttpPort;
            jsonNodes.forEach(
                    jsonNode -> {
                        String fileName = jsonNode.asText();
                        if (StringUtils.isNotBlank(jobId) && !fileName.contains(jobId)) {
                            return;
                        }
                        allLogNameList.add(
                                new Tuple3<>(
                                        nodeId, url + REST_URL_LOGS + "/" + fileName, fileName));

View on GitHub (pinned to cf67b549a7)