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

  1. Remove engine.observability.enabled=false (or set it true) if you want async boundary / split sink IO observability.
  2. Otherwise remove the asyncBoundaries / splitSinkIo config entries to silence the warning.
  3. 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

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


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)