{"record":{"id":"d3b86120e4b9c5c9","repo":"elastic/elasticsearch","slug":"telemetry-logs-endpoint-must-be-configured-when-te-d3b861","errorCode":null,"errorMessage":"telemetry.logs.endpoint must be configured when telemetry.logs.querylog.enabled=true","messagePattern":"telemetry\\.logs\\.endpoint must be configured when telemetry\\.logs\\.querylog\\.enabled=true","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/apm/src/main/java/org/elasticsearch/telemetry/apm/internal/export/otelsdk/OtelSdkSettings.java","lineNumber":249,"sourceCode":"            @Override\n            public Iterator<Setting<?>> settings() {\n                return List.<Setting<?>>of(TELEMETRY_LOGS_ENDPOINT).iterator();\n            }\n        },\n        NodeScope\n    );\n\n    public static final Setting<Boolean> TELEMETRY_LOGS_QUERYLOG_ENABLED = Setting.boolSetting(\n        \"telemetry.logs.querylog.enabled\",\n        false,\n        new Setting.Validator<>() {\n            @Override\n            public void validate(Boolean value) {}\n\n            @Override\n            public void validate(Boolean value, Map<Setting<?>, Object> settings) {\n                if (value && ((String) settings.get(TELEMETRY_LOGS_ENDPOINT)).isEmpty()) {\n                    throw new IllegalArgumentException(\n                        TELEMETRY_LOGS_ENDPOINT.getKey() + \" must be configured when telemetry.logs.querylog.enabled=true\"\n                    );\n                }\n            }\n\n            @Override\n            public Iterator<Setting<?>> settings() {\n                return List.<Setting<?>>of(TELEMETRY_LOGS_ENDPOINT).iterator();\n            }\n        },\n        NodeScope\n    );\n\n    /**\n     * Maximum number of log records the {@code BatchLogRecordProcessor} buffers before dropping.\n     * Sized for ~30 MB of in-flight records at ~3 KB/record average.\n     */\n    public static final Setting<Integer> TELEMETRY_LOGS_MAX_QUEUE_SIZE = Setting.intSetting(","sourceCodeStart":231,"sourceCodeEnd":267,"githubUrl":"https://github.com/elastic/elasticsearch/blob/db6a809a667c081ca1dc7500389d26975573215f/modules/apm/src/main/java/org/elasticsearch/telemetry/apm/internal/export/otelsdk/OtelSdkSettings.java#L231-L267","documentation":"telemetry.logs.querylog.enabled has the same shape as the audit flag: its validator requires telemetry.logs.endpoint to be non-empty when querylog is true. endpoint defaults to empty, so enabling querylog without an endpoint is rejected at validation time (bootstrap or dynamic update).","triggerScenarios":"Setting telemetry.logs.querylog.enabled: true without also setting telemetry.logs.endpoint.","commonSituations":"Enabling the slow-query log export feature without pointing at a collector; partial config rollout.","solutions":["Set telemetry.logs.endpoint to a valid OTLP endpoint alongside telemetry.logs.querylog.enabled: true.","Leave querylog disabled if no collector is configured.","When applying via update-settings, batch both keys in one call."],"exampleFix":"// before\ntelemetry.logs.querylog.enabled: true\n// after\ntelemetry.logs.querylog.enabled: true\ntelemetry.logs.endpoint: \"https://otel-collector:4317\"","handlingStrategy":"validation","validationCode":"// Pre-flight: querylog requires endpoint\nstatic String check(Map<String,Object> s) {\n  boolean q = Boolean.TRUE.equals(s.get(\"telemetry.logs.querylog.enabled\"));\n  String ep = (String) s.getOrDefault(\"telemetry.logs.endpoint\", \"\");\n  return (q && ep.isEmpty()) ? \"set telemetry.logs.endpoint\" : null;\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Pair telemetry.logs.endpoint with any logs-export feature flag.","Batch the endpoint and the flag in one update-settings call."],"tags":["apm","telemetry","configuration","validation","querylog"],"backgroundTag":null,"analyzedSha":"db6a809a667c081ca1dc7500389d26975573215f","analyzedAt":"2026-08-12T01:39:14.192Z","schemaVersion":2},"datasetVersion":"2026-08-13T09:17:06.757Z"}