{"record":{"id":"badae81ffeefe34f","repo":"quickwit-oss/quickwit","slug":"vrl-transforms-are-not-supported-for-otlp-input-fo","errorCode":null,"errorMessage":"VRL transforms are not supported for OTLP input formats","messagePattern":"VRL transforms are not supported for OTLP input formats","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"quickwit/quickwit-config/src/source_config/serialize.rs","lineNumber":147,"sourceCode":"            | SourceParams::File(FileSourceParams::Notifications(_)) => {}\n            _ => {\n                if self.num_pipelines > 1 {\n                    bail!(\n                        \"Quickwit currently supports multiple pipelines only for GCP PubSub or Kafka sources. open an issue https://github.com/quickwit-oss/quickwit/issues if you need the feature for other source types\"\n                    );\n                }\n            }\n        }\n\n        if let Some(transform_config) = &self.transform {\n            if matches!(\n                self.input_format,\n                SourceInputFormat::OtlpLogsJson\n                    | SourceInputFormat::OtlpLogsProtobuf\n                    | SourceInputFormat::OtlpTracesJson\n                    | SourceInputFormat::OtlpTracesProtobuf\n            ) {\n                bail!(\"VRL transforms are not supported for OTLP input formats\");\n            }\n            transform_config.validate_vrl_script()?;\n        }\n\n        Ok(SourceConfig {\n            source_id: self.source_id,\n            num_pipelines,\n            enabled: self.enabled,\n            source_params: self.source_params,\n            transform_config: self.transform,\n            input_format: self.input_format,\n        })\n    }\n}\n\nimpl From<SourceConfig> for SourceConfigV0_8 {\n    fn from(source_config: SourceConfig) -> Self {\n        SourceConfigV0_8 {","sourceCodeStart":129,"sourceCodeEnd":165,"githubUrl":"https://github.com/quickwit-oss/quickwit/blob/a39730c5cdcd1a4fe798403737ae293999ea21f8/quickwit/quickwit-config/src/source_config/serialize.rs#L129-L165","documentation":"Quickwit source configs allow VRL (Vector Remap Language) transforms to rewrite documents before indexing, but OTLP input formats (OtlpLogs/Traces in Json or Protobuf) have their own strict ingestion pipeline that cannot run VRL transforms. During source config validation, `validate_and_build` bails out if a VRL transform is attached to a source whose `input_format` is one of the four OTLP variants.","triggerScenarios":"Defining or updating a source config (via `load_source_config_from_user_config` or `load_source_config_update`) with `transform: {vrl: ...}` while `input_format` is `otlp_logs_json`, `otlp_logs_protobuf`, `otlp_traces_json`, or `otlp_traces_protobuf`.","commonSituations":"Copying a Kafka/Kinesis source config that used VRL and switching its input_format to OTLP; trying to pre-filter or enrich OTLP traces/logs with VRL because it worked for JSON log sources; tooling that generates source configs generically without checking input format.","solutions":["Remove the `transform.vrl` section from the source config, keeping the OTLP input format.","If transformation is required, switch `input_format` to a plain format (e.g. `json` or `plain_message`) and handle the OTLP payload shape with VRL instead.","Ingest OTLP data untransformed via the OTLP gRPC/HTTP endpoints and apply any reshaping at the client side before sending."],"exampleFix":"// before (source_config.yaml)\ninput_format: otlp_traces_proto\ntransform:\n  vrl: \". = parse_proto!(.message)\"\n// after\ninput_format: otlp_traces_proto","handlingStrategy":"validation","validationCode":"fn validate_source(cfg: &SourceConfig) -> Result<(), String> {\n    let is_otlp = matches!(cfg.input_format,\n        SourceInputFormat::OtlpLogsJson | SourceInputFormat::OtlpLogsProtobuf\n        | SourceInputFormat::OtlpTracesJson | SourceInputFormat::OtlpTracesProtobuf);\n    if is_otlp && cfg.transform.is_some() {\n        return Err(\"remove VRL transform when input_format is OTLP\".into());\n    }\n    Ok(())\n}","typeGuard":"let is_otlp = matches!(input_format, SourceInputFormat::OtlpLogsJson | SourceInputFormat::OtlpLogsProtobuf | SourceInputFormat::OtlpTracesJson | SourceInputFormat::OtlpTracesProtobuf);","tryCatchPattern":null,"preventionTips":["Never combine VRL transform blocks with OTLP input formats in source templates.","Validate source configs in CI before deploying them to Quickwit.","Do client-side transformation for OTLP payloads instead of server-side VRL."],"tags":["config","vrl","otlp","source-config","validation"],"backgroundTag":"unsupported-operation","analyzedSha":"a39730c5cdcd1a4fe798403737ae293999ea21f8","analyzedAt":"2026-09-08T13:19:37.784Z","contentChangedAt":"2026-09-08T13:19:37.784Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}