{"record":{"id":"a617601c4caba8a9","repo":"quickwit-oss/quickwit","slug":"otp-logs-or-traces-do-not-support-vrl-transforms","errorCode":null,"errorMessage":"OTP logs or traces do not support VRL transforms","messagePattern":"OTP logs or traces do not support VRL transforms","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"critical","filePath":"quickwit/quickwit-indexing/src/actors/doc_processor.rs","lineNumber":145,"sourceCode":"fn try_into_vrl_doc(\n    input_format: SourceInputFormat,\n    raw_doc: Bytes,\n    num_bytes: usize,\n) -> Result<VrlDoc, DocProcessorError> {\n    let vrl_value = match input_format {\n        SourceInputFormat::Json => serde_json::from_slice::<VrlValue>(&raw_doc)?,\n        SourceInputFormat::PlainText => {\n            let mut map = std::collections::BTreeMap::new();\n            let key = vrl::value::KeyString::from(PLAIN_TEXT);\n            let value = VrlValue::Bytes(raw_doc);\n            map.insert(key, value);\n            VrlValue::Object(map)\n        }\n        SourceInputFormat::OtlpLogsJson\n        | SourceInputFormat::OtlpLogsProtobuf\n        | SourceInputFormat::OtlpTracesJson\n        | SourceInputFormat::OtlpTracesProtobuf => {\n            panic!(\"OTP logs or traces do not support VRL transforms\")\n        }\n    };\n    let vrl_doc = VrlDoc::new(vrl_value, num_bytes);\n    Ok(vrl_doc)\n}\n\nfn try_into_json_docs(\n    input_format: SourceInputFormat,\n    raw_doc: Bytes,\n    num_bytes: usize,\n) -> JsonDocIterator {\n    match input_format {\n        SourceInputFormat::Json => {\n            let json_doc_result = serde_json::from_slice::<JsonObject>(&raw_doc)\n                .map(|json_obj| JsonDoc::new(json_obj, num_bytes));\n            JsonDocIterator::from(json_doc_result)\n        }\n        SourceInputFormat::OtlpLogsJson => {","sourceCodeStart":127,"sourceCodeEnd":163,"githubUrl":"https://github.com/quickwit-oss/quickwit/blob/a39730c5cdcd1a4fe798403737ae293999ea21f8/quickwit/quickwit-indexing/src/actors/doc_processor.rs#L127-L163","documentation":"Same pattern as the REST server: the health check server runs as a named Tokio task and its JoinHandle is awaited. `.expect` fires when that task panics or is cancelled, which the library treats as unrecoverable — the health endpoint must stay alive for the node to be considered healthy.","triggerScenarios":"The `health_server_fut` panics (e.g. failure binding the health port is handled upstream, but a panic inside readiness/liveness state access does not); or the task is cancelled by runtime shutdown.","commonSituations":"Port already bound by another process after an earlier misconfigured start (leading to an awaited error path being mishandled), panic inside health handlers accessing cluster state, OOM conditions, or running the binary under a supervisor that kills tasks mid-flight.","solutions":["Look at the log lines preceding the panic to identify the actual panic in the health server task and fix it.","Reproduce with RUST_BACKTRACE=full to get the panic location.","Ensure the health-check port is free and not duplicated in the config so startup errors surface as clean errors instead of task panics.","Check host memory/limits; restart with adequate resources if the task was killed under pressure."],"exampleFix":"// before\n.expect(\"tasks running the health check server should not panic or be cancelled\")\n// after\n.map_err(|err| anyhow::anyhow!(\"health check server task failed: {err}\"))\n.and_then(|res| res.context(\"health check server failed\"))","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"// treat node exit as fatal and capture cause\nif let Err(err) = serve_quickwit(config).await {\n    tracing::error!(error = ?err, \"server terminated\");\n    std::process::exit(1);\n}","preventionTips":["Ensure the health-check port in the config is free and unique.","Run with RUST_BACKTRACE=1 in all environments.","Deploy under a restart-capable supervisor.","Watch health endpoint availability and alert on restarts."],"tags":["rust","tokio","panic","health-check","internal-invariant"],"backgroundTag":"internal-invariant-violation","analyzedSha":"a39730c5cdcd1a4fe798403737ae293999ea21f8","analyzedAt":"2026-09-08T13:19:37.784Z","contentChangedAt":"2026-09-08T13:19:37.784Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}