apache/seatunnel · warning
Observability is explicitly disabled…
Error message
Observability is explicitly disabled (engine.observability.enabled=false) but async boundaries or split sink IO is configured. The split config will be ignored. jobName={}, asyncBoundaries={}, splitSinkIo={} What it means
When engine.observability.enabled is explicitly set to false but the job configures observability split features (async boundaries or split sink IO), the split configuration cannot take effect, so the handler logs this warning and ignores it. (If enabled was not set explicitly, observability is auto-enabled instead.)
Solutions
- Remove engine.observability.enabled=false (or set it true) if you want async boundary / split sink IO observability.
- Otherwise remove the asyncBoundaries / splitSinkIo config entries to silence the warning.
- Note the auto-enable behavior: omitting the enabled key entirely while providing split config turns observability on.
Example fix
// before
engine {
observability { enabled = false; split-sink-io = true }
}
// after
engine {
observability { enabled = true; split-sink-io = true }
} Defensive patterns
Strategy: validation
Validate before calling
if (!observabilityEnabled && (splitSinkIo || !asyncBoundaries.isEmpty())) { log.warn("split observability config will be ignored because observability is disabled"); } Prevention
- Keep observability settings consistent — enable it when using split features.
- Review job configs for stale engine.observability.enabled=false entries.
- Remember split config auto-enables observability only when the key is omitted entirely.
When it happens
Trigger: ObservabilityConfig.fromEnvOptions() sees enabledExplicit == false AND (splitSinkIo == true OR asyncBoundaries is non-empty) — i.e. the user disabled observability but still supplied split observability settings for the job.
Common situations: Copy-pasting a config template that includes engine.observability.enabled=false while retaining async-boundary/split-sink-io settings; toggling observability off for performance without cleaning up related options.
Understand the failure class
Background: Conflicting config options: "cannot be used together" — configuration validation errors across open-source libraries — this error's family across 162 libraries.
Related errors
- connector-jar-storage-mode must in [SHARED, ISOLATED]
- accessId and accesskey must be provided when sts_token is…
- Agent config is not a readable file
- agent.id must be non-empty after resolution.
- At least one sink plugin must be configured.
AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10).
Data as JSON: /api/errors/49eaca793192d674.
Report an issue: GitHub.
Appendix: source
Thrown at seatunnel-engine/seatunnel-engine-server/src/main/java/org/apache/seatunnel/engine/server/observability/ObservabilityConfig.java:122
long bucketMs = getLong(config, PREFIX + "bucket_ms", 5000L);
int retentionMinutesRaw =
(int) getLong(config, PREFIX + "retention_minutes", DEFAULT_RETENTION_MINUTES);
int retentionMinutes = Math.min(MAX_RETENTION_MINUTES, Math.max(1, retentionMinutesRaw));
List<String> asyncBoundaries = getStringList(config, PREFIX + "async_boundaries");
int edgeBufferCapacity = (int) getLong(config, PREFIX + "edge_buffer_capacity", 0L);
Map<String, Integer> edgeOverrides = getEdgeOverrides(config, PREFIX + "edge_overrides");
boolean splitSinkIo = getBoolean(config, PREFIX + "split_sink_io", false);
// If users configured async boundaries or sink splitting but didn't set `enabled=true`,
// turn it on automatically to make the config take effect. Respect explicit
// `enabled=false`.
boolean hasSplitConfig =
splitSinkIo || (asyncBoundaries != null && !asyncBoundaries.isEmpty());
if (!enabled && hasSplitConfig) {
if (enabledExplicit == null) {
enabled = true;
} else {
log.warn(
"Observability is explicitly disabled (engine.observability.enabled=false) "
+ "but async boundaries or split sink IO is configured. "
+ "The split config will be ignored. jobName={}, asyncBoundaries={}, splitSinkIo={}",
jobName,
asyncBoundaries == null ? 0 : asyncBoundaries.size(),
splitSinkIo);
}
}
return new ObservabilityConfig(
enabled,
Math.max(1000L, bucketMs),
retentionMinutes,
asyncBoundaries,
Math.max(0, edgeBufferCapacity),
edgeOverrides,
splitSinkIo,
jobName,View on GitHub (pinned to cf67b549a7)