{"record":{"id":"49eaca793192d674","repo":"apache/seatunnel","slug":"observability-is-explicitly-disabled-engine-obser","errorCode":null,"errorMessage":"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={}","messagePattern":"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=(.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"seatunnel-engine/seatunnel-engine-server/src/main/java/org/apache/seatunnel/engine/server/observability/ObservabilityConfig.java","lineNumber":122,"sourceCode":"        long bucketMs = getLong(config, PREFIX + \"bucket_ms\", 5000L);\n        int retentionMinutesRaw =\n                (int) getLong(config, PREFIX + \"retention_minutes\", DEFAULT_RETENTION_MINUTES);\n        int retentionMinutes = Math.min(MAX_RETENTION_MINUTES, Math.max(1, retentionMinutesRaw));\n        List<String> asyncBoundaries = getStringList(config, PREFIX + \"async_boundaries\");\n        int edgeBufferCapacity = (int) getLong(config, PREFIX + \"edge_buffer_capacity\", 0L);\n        Map<String, Integer> edgeOverrides = getEdgeOverrides(config, PREFIX + \"edge_overrides\");\n        boolean splitSinkIo = getBoolean(config, PREFIX + \"split_sink_io\", false);\n\n        // If users configured async boundaries or sink splitting but didn't set `enabled=true`,\n        // turn it on automatically to make the config take effect. Respect explicit\n        // `enabled=false`.\n        boolean hasSplitConfig =\n                splitSinkIo || (asyncBoundaries != null && !asyncBoundaries.isEmpty());\n        if (!enabled && hasSplitConfig) {\n            if (enabledExplicit == null) {\n                enabled = true;\n            } else {\n                log.warn(\n                        \"Observability is explicitly disabled (engine.observability.enabled=false) \"\n                                + \"but async boundaries or split sink IO is configured. \"\n                                + \"The split config will be ignored. jobName={}, asyncBoundaries={}, splitSinkIo={}\",\n                        jobName,\n                        asyncBoundaries == null ? 0 : asyncBoundaries.size(),\n                        splitSinkIo);\n            }\n        }\n\n        return new ObservabilityConfig(\n                enabled,\n                Math.max(1000L, bucketMs),\n                retentionMinutes,\n                asyncBoundaries,\n                Math.max(0, edgeBufferCapacity),\n                edgeOverrides,\n                splitSinkIo,\n                jobName,","sourceCodeStart":104,"sourceCodeEnd":140,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-engine/seatunnel-engine-server/src/main/java/org/apache/seatunnel/engine/server/observability/ObservabilityConfig.java#L104-L140","documentation":"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.)","triggerScenarios":"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.","commonSituations":"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.","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."],"exampleFix":"// before\nengine { \n  observability { enabled = false; split-sink-io = true }\n}\n// after\nengine { \n  observability { enabled = true; split-sink-io = true }\n}","handlingStrategy":"validation","validationCode":"if (!observabilityEnabled && (splitSinkIo || !asyncBoundaries.isEmpty())) { log.warn(\"split observability config will be ignored because observability is disabled\"); }","typeGuard":null,"tryCatchPattern":null,"preventionTips":["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."],"tags":["config","observability","zeta"],"backgroundTag":"conflicting-config-options","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}