{"record":{"id":"b74b7fb5fa7eb4a5","repo":"prometheus/node_exporter","slug":"collector-qdisc-device-include-and-collector-qdisc","errorCode":null,"errorMessage":"collector.qdisc.device-include and collector.qdisc.device-exclude are mutaly exclusive","messagePattern":"collector\\.qdisc\\.device-include and collector\\.qdisc\\.device-exclude are mutaly exclusive","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"collector/qdisc_linux.go","lineNumber":75,"sourceCode":"\t\tif *collectorQdiscDeviceInclude == \"\" {\n\t\t\tlogger.Warn(\"--collector.qdisk.device-include is DEPRECATED and will be removed in 2.0.0, use --collector.qdisc.device-include\")\n\t\t\t*collectorQdiscDeviceInclude = *oldCollectorQdiskDeviceInclude\n\t\t} else {\n\t\t\treturn nil, fmt.Errorf(\"--collector.qdisk.device-include and --collector.qdisc.device-include are mutually exclusive\")\n\t\t}\n\t}\n\n\tif *oldCollectorQdiskDeviceExclude != \"\" {\n\t\tif *collectorQdiscDeviceExclude == \"\" {\n\t\t\tlogger.Warn(\"--collector.qdisk.device-exclude is DEPRECATED and will be removed in 2.0.0, use --collector.qdisc.device-exclude\")\n\t\t\t*collectorQdiscDeviceExclude = *oldCollectorQdiskDeviceExclude\n\t\t} else {\n\t\t\treturn nil, fmt.Errorf(\"--collector.qdisk.device-exclude and --collector.qdisc.device-exclude are mutually exclusive\")\n\t\t}\n\t}\n\n\tif *collectorQdiscDeviceExclude != \"\" && *collectorQdiscDeviceInclude != \"\" {\n\t\treturn nil, fmt.Errorf(\"collector.qdisc.device-include and collector.qdisc.device-exclude are mutaly exclusive\")\n\t}\n\n\treturn &qdiscStatCollector{\n\t\tbytes: typedDesc{prometheus.NewDesc(\n\t\t\tprometheus.BuildFQName(namespace, \"qdisc\", \"bytes_total\"),\n\t\t\t\"Number of bytes sent.\",\n\t\t\t[]string{\"device\", \"kind\"}, nil,\n\t\t), prometheus.CounterValue},\n\t\tpackets: typedDesc{prometheus.NewDesc(\n\t\t\tprometheus.BuildFQName(namespace, \"qdisc\", \"packets_total\"),\n\t\t\t\"Number of packets sent.\",\n\t\t\t[]string{\"device\", \"kind\"}, nil,\n\t\t), prometheus.CounterValue},\n\t\tdrops: typedDesc{prometheus.NewDesc(\n\t\t\tprometheus.BuildFQName(namespace, \"qdisc\", \"drops_total\"),\n\t\t\t\"Number of packets dropped.\",\n\t\t\t[]string{\"device\", \"kind\"}, nil,\n\t\t), prometheus.CounterValue},","sourceCodeStart":57,"sourceCodeEnd":93,"githubUrl":"https://github.com/prometheus/node_exporter/blob/17ddd77c59ba27e1508e9f7894b1e55b44d6aed3/collector/qdisc_linux.go#L57-L93","documentation":"NewQdiscStatCollector rejects a configuration where both --collector.qdisc.device-include and --collector.qdisc.device-exclude are set: the qdisc collector supports either an allowlist or a denylist, not both at once. The message contains an upstream typo ('mutaly exclusive').","triggerScenarios":"Starting node_exporter with both --collector.qdisc.device-include=<v> and --collector.qdisc.device-exclude=<v> non-empty, after the deprecated-flag checks passed.","commonSituations":"Operator tries to allowlist most devices and additionally exclude a few in one invocation; args composed from multiple config sources accumulate both flags.","solutions":["Keep only device-include (allowlist semantics) or only device-exclude (denylist semantics)","Express the combined intent as a single include regex or a single exclude regex","Restart node_exporter with only one of the two flags"],"exampleFix":"// before\nnode_exporter --collector.qdisc.device-include='eth[0-9]+' --collector.qdisc.device-exclude=eth9\n// after\nnode_exporter --collector.qdisc.device-include='eth[0-8]'","handlingStrategy":"validation","validationCode":"func validateQdiscFilterMode(include, exclude string) error {\n\tif include != \"\" && exclude != \"\" {\n\t\treturn fmt.Errorf(\"--collector.qdisc.device-include and --collector.qdisc.device-exclude are mutually exclusive; choose one filter mode\")\n\t}\n\treturn nil\n}","typeGuard":null,"tryCatchPattern":"c, err := NewQdiscStatCollector(logger)\nif err != nil {\n\tlogger.Error(\"qdisc collector disabled\", \"err\", err)\n}","preventionTips":["Decide on allowlist (include) or denylist (exclude) semantics per environment, never both","Fold 'exclude one device from an allowlist' into the include regex itself","Document the chosen filter mode in the deployment config"],"tags":["cli-flags","configuration","linux","qdisc"],"backgroundTag":"mutually-exclusive-flags","analyzedSha":"17ddd77c59ba27e1508e9f7894b1e55b44d6aed3","analyzedAt":"2026-09-07T17:54:06.211Z","contentChangedAt":"2026-09-07T17:54:06.211Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}