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
- Check basic-auth username/password configuration matches across all nodes (httpConfig).
- Curl the logUrl directly from the failing node to see status code/body and fix the remote endpoint.
- Verify log4j2/log path is configured on that node so the log-name endpoint can list files.
- 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
- Synchronize basic-auth credentials across all nodes
- Verify log path configuration on every node
- Curl endpoints directly per node to validate before cluster-wide calls
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
- Failed to get response from Doris FE
- GET -> HTTP
- http post response failed. statusCode
- Logger level request to member
- Request body is empty.
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)