【问题标题】:Prometheus config file with Puppet: how to handle quotes and brackets in yaml config file?带有 Puppet 的 Prometheus 配置文件:如何处理 yaml 配置文件中的引号和括号?
【发布时间】:2017-02-11 15:53:22
【问题描述】:

我正在尝试使用此模块编写 Prometheus 配置:https://github.com/voxpupuli/puppet-prometheus

但我似乎无法让它为 Prometheus 生成有效的重新标记配置。

这是我当前配置的相关部分:

'relabel_configs' => [
  {
    'source_labels' => '[__meta_consul_node]',
    'regex'         => '^(.*)$',
    'target_label'  => 'instance',
    'replacement'   => '$1',
  },
  {
    'source_labels' => '[__meta_consul_service]',
    'regex'         => '^(.*)$',
    'target_label'  => 'job',
    'replacement'   => '$1',
  }
],

这是我在 prometheus.yml 中得到的:

relabel_configs:
  - source_labels: '[__meta_consul_node]'
    regex: ^(.*)$
    target_label: instance
    replacement: $1
  - source_labels: '[__meta_consul_service]'
    regex: ^(.*)$
    target_label: job
    replacement: $1

我想要的是:

relabel_configs:
  - source_labels: ['__meta_consul_node']
    regex: '^(.*)$'
    target_label: 'instance'
    replacement: '$1'
  - source_labels: ['__meta_consul_service']
    regex: '^(.*)$'
    target_label: 'job'
    replacement: '$1'

我尝试了很多方法,但无法弄清楚如何在清单中格式化哈希值,以便获得 Prometheus 的正确配置文件。

这似乎是 ruby​​ 解析器的问题?如何正确转义'

【问题讨论】:

  • 在 YAML 中指定此键值对:regex: ^(.*)$ 或此:regex: '^(.*)$' 完全相同,因为第一个标量值不需要引用。他们的 KV 对与密钥 regextarget_labelsreplacement 也是如此。在那里添加引号绝对没有意义。仅对于source_labels,您正在将值从以括号开头和结尾的标量字符串更改为包含单个标量字符串值的列表。为什么要添加所有这些多余的引号?

标签: arrays yaml puppet prometheus


【解决方案1】:

我认为这里的困惑在于如何在 Puppet 和 YAML 中处理变量数组,以及如何在 YAML 中解析字符串。

在 YAML 中,变量数组可以是:

array:
- element
- another_element

或:

array: [element, another_element]

在 Puppet 中,它们看起来像:

$array = [element, another_element]

因此,您只需在 Puppet 散列中为 source_labels 键指定一个字符串数组,即可对数组进行干净的一对一映射,例如:

'relabel_configs' => [
  {
    'source_labels' => ['__meta_consul_node'], # single element string array
    'regex'         => '^(.*)$',
    'target_label'  => 'instance',
    'replacement'   => '$1',
  },
  {
    'source_labels' => ['__meta_consul_service'], # single element string array
    'regex'         => '^(.*)$',
    'target_label'  => 'job',
    'replacement'   => '$1',
  }
],

这将为您的source_labels 正确生成一个字符串数组,正如您所描述的那样。

relabel_configs:
  - source_labels: ['__meta_consul_node'] # single element string array
    regex: ^(.*)$
    target_label: instance
    replacement: $1
  - source_labels: ['__meta_consul_service'] # single element string array
    regex: ^(.*)$
    target_label: job
    replacement: $1

请注意,对于带引号和不带引号的字符串,YAML 的解析方式将完全相同(例如,target_label: jobtarget_label: 'job' 相同)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    • 2016-02-05
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 2017-02-04
    • 1970-01-01
    相关资源
    最近更新 更多