【问题标题】:dashes and indentations in yamlyaml中的破折号和缩进
【发布时间】:2021-02-13 17:42:24
【问题描述】:

我正在经历“入门”tutorial for Prometheus。我对 YAML 配置文件非常感兴趣:

scrape_configs:
  - job_name:       'node'

    # Override the global default and scrape targets from this job every 5 seconds.
    scrape_interval: 5s

    static_configs:
      - targets: ['localhost:8080', 'localhost:8081']
        labels:
          group: 'production'

      - targets: ['localhost:8082']
        labels:
          group: 'canary'

因此,显然连字符应该表示以下两种情况之一:新列表中的第一项,或键值对。

  • 所以看起来job_name: 'node' 是一个键值对。那为什么缩进之后的都是呢?

  • targets 也看起来像一个键值对。但是labels 也是如此,而且它没有连字符。此外,grouplabels 缩进一个空格。

我很难说出这里发生了什么。我需要知道我是否要自定义这个文件(我已经尝试过这样做并且在启动 Prometheus 时收到错误)。

这个文件的逻辑结构是什么?

【问题讨论】:

  • “因此,显然连字符应该表示两件事之一:新列表中的第一项,或键值对。” - 不,连字符 (-) 的唯一目的是指示列表中每个元素开始。一个元素一直持续到另一个连字符或列表末尾。

标签: yaml prometheus


【解决方案1】:

YAML 文档由三种类型的节点组成:标量、序列和映射。 使用块语法时,每个节点都存在于特定的缩进级别,其中定义了其内容。

下面是一个简单的例子,可以更清楚地说明:

-
  a
- 
  b:
    c
-
  -
    d

在缩进级别 0,有连字符定义序列项。因此,顶层节点是一个序列。 在第一个序列项中,有一个a。它是序列项的一部分,因为它有更多缩进。 这被解析为标量。

在第二个序列项中,有一个将标量 b 映射到标量 c 的映射。我们看到因为b:是一个隐式键(冒号后接的单行节点),而隐式键的出现表明存在一个映射(就像一个序列项表示序列的存在)。 cb 的值,因为它再次缩进。

现在 YAML 定义了一个紧凑表示法,您可以在其中将序列指示符视为缩进的一部分。您也可以将某些节点直接放在隐式键之后。这将示例压缩为:

- a
- b: c
- - d

不过,键 b: 完全独立于序列项指示符 -。现在让我们将它应用到您的文件中:

scrape_configs:
  - job_name:       'node'

    # Override the global default and scrape targets from this job every 5 seconds.
    scrape_interval: 5s
    # …

顶层是一个映射,因为有一个隐式键 scrape_configs。它包含一个包含一个项目的序列。这一项是一个映射,从job_name: 开始。其他键是scrape_intervalstatic_configsstatic_configs 映射到一系列映射,其中每个映射包含键 targetslabels

[] 语法是用于定义序列的替代语法,通常用于适合单行的短序列。标量可以被引用,这通常在值包含 YAML 特殊符号时完成。例如,在[] 中,逗号开始下一项,因此如果您想在标量中使用逗号,则需要引用标量。

因此,底线:连字符和隐式键是独立的结构。不要将连字符读作键的一部分。

【讨论】:

    猜你喜欢
    • 2021-01-24
    • 2021-09-21
    • 2016-06-06
    • 1970-01-01
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多