{"record":{"id":"6e57ec3542c67669","repo":"netdata/netdata","slug":"expected-a-mapping-for-merging-but-found-s","errorCode":null,"errorMessage":"expected a mapping for merging, but found %s","messagePattern":"expected a mapping for merging, but found (.+?)","errorType":"exception","errorClass":"ConstructorError","httpStatus":null,"severity":"error","filePath":"src/collectors/python.d.plugin/python_modules/pyyaml3/constructor.py","lineNumber":181,"sourceCode":"                if key_node.tag == 'tag:yaml.org,2002:value':\n                    return self.construct_scalar(value_node)\n        return super().construct_scalar(node)\n\n    def flatten_mapping(self, node):\n        merge = []\n        index = 0\n        while index < len(node.value):\n            key_node, value_node = node.value[index]\n            if key_node.tag == 'tag:yaml.org,2002:merge':\n                del node.value[index]\n                if isinstance(value_node, MappingNode):\n                    self.flatten_mapping(value_node)\n                    merge.extend(value_node.value)\n                elif isinstance(value_node, SequenceNode):\n                    submerge = []\n                    for subnode in value_node.value:\n                        if not isinstance(subnode, MappingNode):\n                            raise ConstructorError(\"while constructing a mapping\",\n                                    node.start_mark,\n                                    \"expected a mapping for merging, but found %s\"\n                                    % subnode.id, subnode.start_mark)\n                        self.flatten_mapping(subnode)\n                        submerge.append(subnode.value)\n                    submerge.reverse()\n                    for value in submerge:\n                        merge.extend(value)\n                else:\n                    raise ConstructorError(\"while constructing a mapping\", node.start_mark,\n                            \"expected a mapping or list of mappings for merging, but found %s\"\n                            % value_node.id, value_node.start_mark)\n            elif key_node.tag == 'tag:yaml.org,2002:value':\n                key_node.tag = 'tag:yaml.org,2002:str'\n                index += 1\n            else:\n                index += 1\n        if merge:","sourceCodeStart":163,"sourceCodeEnd":199,"githubUrl":"https://github.com/netdata/netdata/blob/4864de85e26f6734d92cfc27ccbeff5921f49938/src/collectors/python.d.plugin/python_modules/pyyaml3/constructor.py#L163-L199","documentation":"Raised by SafeConstructor.flatten_mapping while processing a merge key ('<<'). When the merge value is a sequence, each element must itself be a mapping; an element that is a scalar or another sequence raises this error with the offending subnode's mark.","triggerScenarios":"'<<: [{a: 1}, not-a-map]' — a list under the merge key containing a scalar/nested list; mixing mappings and plain values in a merge list.","commonSituations":"Users building inheritance-style configs with '<<:' and appending a stray scalar (e.g. a comment value or a flag) into the merge list; copy-paste errors in templated YAML.","solutions":["Make every element of the merge list a mapping: '<<: [{a: 1}, {b: 2}]'.","Remove non-mapping entries from the merge sequence.","If merging one mapping only, drop the list brackets: '<<: *defaults'."],"exampleFix":"# before\nbase: &base {a: 1}\nmerged:\n  <<: [*base, extra]\n\n# after\nbase: &base {a: 1}\nextra: &extra {b: 2}\nmerged:\n  <<: [*base, *extra]","handlingStrategy":"validation","validationCode":"import yaml\n\ndef merge_list_elements_are_mappings(text):\n    for n in iter_all_nodes(yaml.compose(text)):\n        if isinstance(n, yaml.MappingNode):\n            for k, v in n.value:\n                if k.tag == 'tag:yaml.org,2002:merge' and isinstance(v, yaml.SequenceNode):\n                    for sub in v.value:\n                        if not isinstance(sub, yaml.MappingNode):\n                            raise ValueError('merge list has a non-mapping %s at line %s' % (sub.id, sub.start_mark.line))","typeGuard":null,"tryCatchPattern":"try:\n    cfg = yaml.safe_load(text)\nexcept yaml.ConstructorError as e:\n    if 'expected a mapping for merging' in str(e):\n        reject_config('every entry in a <<: merge list must be a mapping, line %s' % e.problem_mark.line)","preventionTips":["Only put mappings (or aliases to mappings) inside '<<:' merge lists.","Review generated YAML from templates for stray scalars in merge lists.","Prefer merging one anchored mapping ('<<: *base') over lists when possible."],"tags":["yaml","python","merge-key","config"],"backgroundTag":null,"analyzedSha":"4864de85e26f6734d92cfc27ccbeff5921f49938","analyzedAt":"2026-08-15T09:12:38.226Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}