{"record":{"id":"fdcf076e1956a198","repo":"quickwit-oss/quickwit","slug":"contains-an-empty-label-name","errorCode":null,"errorMessage":"{} contains an empty label name: {}","messagePattern":"(.+?) contains an empty label name: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"quickwit/quickwit-metrics/src/lib.rs","lineNumber":437,"sourceCode":"    let mut parsed_labels: Vec<Label> = Vec::new();\n    if labels.trim().is_empty() {\n        return Ok(parsed_labels);\n    }\n\n    const LABELS_SEPARATOR: char = ',';\n    const KEY_VALUE_SEPARATOR: char = '=';\n\n    for label in labels.split(LABELS_SEPARATOR) {\n        let (name, value) = label.split_once(KEY_VALUE_SEPARATOR).ok_or_else(|| {\n            anyhow::anyhow!(\n                \"{} contains invalid label format: {}\",\n                QW_METRICS_LABELS_ENV_VAR,\n                label\n            )\n        })?;\n        let name = name.trim();\n        if name.is_empty() {\n            anyhow::bail!(\n                \"{} contains an empty label name: {}\",\n                QW_METRICS_LABELS_ENV_VAR,\n                label\n            );\n        }\n        let value = value.trim();\n        if value.is_empty() {\n            anyhow::bail!(\n                \"{} contains an empty label value: {}\",\n                QW_METRICS_LABELS_ENV_VAR,\n                label\n            );\n        }\n        let label = Label::new(name.to_string(), value.to_string());\n        parsed_labels.push(label);\n    }\n\n    Ok(parsed_labels)","sourceCodeStart":419,"sourceCodeEnd":455,"githubUrl":"https://github.com/quickwit-oss/quickwit/blob/a39730c5cdcd1a4fe798403737ae293999ea21f8/quickwit/quickwit-metrics/src/lib.rs#L419-L455","documentation":"`parse_metrics_labels`, which parses the `QW_METRICS_LABELS` environment variable into Prometheus labels, found a `name=value` pair whose name side is empty after trimming (e.g. `=foo` or ` , =foo`). The labels are appended to all Quickwit metrics, and Prometheus rejects empty label names, so parsing aborts.","triggerScenarios":"Setting QW_METRICS_LABELS_ENV_VAR with a comma-separated entry lacking a name, such as \"=value\" or \" ,cluster=prod\", or a leading/trailing comma producing an empty fragment.","commonSituations":"Typos in the env var like \"=prod\"; copy-paste with trailing comma \"a=b,c=d,\"; misbuilt label strings missing the key.","solutions":["Ensure every entry in `QW_METRICS_LABELS` has the form `name=value` with a non-empty name","Check for stray commas producing empty segments and quote the value if needed"],"exampleFix":"// before\nexport QW_METRICS_LABELS_ENV_VAR=\"=prod,team=obs\"\n// after\nexport QW_METRICS_LABELS_ENV_VAR=\"cluster=prod,team=obs\"","handlingStrategy":"validation","validationCode":"fn labels_valid(s: &str) -> bool {\n    s.split(',').all(|l| {\n        let mut it = l.splitn(2, '=');\n        it.next().map(|n| !n.trim().is_empty()).unwrap_or(false)\n            && it.next().map(|v| !v.trim().is_empty()).unwrap_or(false)\n    })\n}","typeGuard":null,"tryCatchPattern":"if let Err(e) = init_metrics_labels_env_var() {\n    if e.to_string().contains(\"empty label name\") {\n        eprintln!(\"bad QW_METRICS_LABELS_ENV_VAR: {e}\");\n    }\n}","preventionTips":["Follow the strict name=value,name=value format","Avoid trailing or doubled commas","Add a pre-launch lint step that validates metric label strings"],"tags":["metrics","env-var","config","validation"],"backgroundTag":"invalid-config-value","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"}