首页 > 解决方案 > Helm-Charts(yaml):正则表达式被破坏

问题描述

我正在使用https://github.com/prometheus-community/helm-charts并且遇到了一些问题,一些正则表达式查询是我们基本 yaml 部署的一部分。我遇到的问题专门与普罗米修斯图表的节点导出器部分有关。我已经配置了这个:

   nodeExporter:
      extraArgs: {
        collector.filesystem.ignored-fs-types="^(devpts|devtmpfs|mqueue|proc|securityfs|binfmt_misc|debugfs|overlay|pstore|selinuxfs|tmpfs|hugetlbfs|nfsd|cgroup|configfs|rpc_pipefs|sysfs|autofs|rootfs)$",
        collector.filesystem.ignored-mount-points="^/etc/.+$",
        collector.netstat.fields="*",
        collector.diskstats.ignored-devices="^(ram|loop|fd|(h|s|v|xv)d[a-z]|nvme\d+n\d+p|dm-)\d+$", # BROKEN
        collector.netclass.ignored-devices=^(?:tun|kube|veth|dummy|docker).+$,                      # BROKEN
        collector.nfs
       }
      tolerations:
        - operator: Exists

如上所述,这两条带有正则表达式的行被破坏了:

 collector.diskstats.ignored-devices="^(ram|loop|fd|(h|s|v|xv)d[a-z]|nvme\d+n\d+p|dm-)\d+$", # BROKEN
 collector.netclass.ignored-devices=^(?:tun|kube|veth|dummy|docker).+$,                      # BROKEN

|第一个中的“nvme”之前的字符似乎有问题,第二个中的字符似乎有问题?:。我相信这与 regex/yaml 格式有关,但我不知道如何纠正这个问题。

标签: yamlprometheuskubernetes-helm

解决方案


有了{,您就开始了 YAML流映射。它通常包含逗号分隔的键值对,但您也可以像本例中一样,提供单个值,这将使它们成为具有null值的键。

在 YAML 中,一旦您输入流式集合,所有特殊的流式指示符都不能再用于纯标量。特殊的流量指标是{}[],。纯标量是未引用的文本值。

第一个损坏的值是非法的,因为它包含[and ]。根据规范,第二个损坏的值实际上是合法的,但是相当多的 YAML 实现会阻塞它,因为?它也用作映射键的指示符。

你有几个选择:

  • 引用标量。因为它们都不包含单引号,所以用单引号括起来就可以了。通常你也可以双引号,但是你需要转义所有双引号字符和所有反斜杠,这不利于可读性。
   nodeExporter:
      extraArgs: {
        collector.filesystem.ignored-fs-types="^(devpts|devtmpfs|mqueue|proc|securityfs|binfmt_misc|debugfs|overlay|pstore|selinuxfs|tmpfs|hugetlbfs|nfsd|cgroup|configfs|rpc_pipefs|sysfs|autofs|rootfs)$",
        collector.filesystem.ignored-mount-points="^/etc/.+$",
        collector.netstat.fields="*",
        'collector.diskstats.ignored-devices="^(ram|loop|fd|(h|s|v|xv)d[a-z]|nvme\d+n\d+p|dm-)\d+$"',
        'collector.netclass.ignored-devices=^(?:tun|kube|veth|dummy|docker).+$',
        collector.nfs
       }
      tolerations:
        - operator: Exists
  • 使用块标量。块标量通常是输入具有许多特殊字符的标量的最佳方式,因为它们以缩进结束,因此可以包含任何特殊字符。块标量只能出现在其他块结构中,因此您需要进行extraArgs块映射:
   nodeExporter:
      extraArgs:
        ? collector.filesystem.ignored-fs-types="^(devpts|devtmpfs|mqueue|proc|securityfs|binfmt_misc|debugfs|overlay|pstore|selinuxfs|tmpfs|hugetlbfs|nfsd|cgroup|configfs|rpc_pipefs|sysfs|autofs|rootfs)$"
        ? collector.filesystem.ignored-mount-points="^/etc/.+$"
        ? collector.netstat.fields="*"
        ? |-
          collector.diskstats.ignored-devices="^(ram|loop|fd|(h|s|v|xv)d[a-z]|nvme\d+n\d+p|dm-)\d+$"
        ? |-
          collector.netclass.ignored-devices=^(?:tun|kube|veth|dummy|docker).+$
        ? collector.nfs
      tolerations:
        - operator: Exists

如您所见,这现在使用前面提到?的作为关键指标。由于它是一个块序列,因此您不再需要逗号。 |-开始一个文字块标量,从中剥离最后的换行符。


推荐阅读