如何在 Prometheus 中正确检测区域和环境信息?
How do I instrument region and environment information correctly in Prometheus?
我有一个应用程序,我 运行 每个 AWS 区域都有一个此应用程序的实例。
我正在尝试使用 Prometheus 指标客户端检测应用程序代码,并将收集的指标公开给 /metrics
端点。有一个中央服务器将跨所有区域抓取 /metrics
个端点,并将它们存储在中央时间序列数据库中。
假设我定义了一个名为:http_responses_total
的指标,那么我想知道它在所有区域的聚合值以及各个区域值。
我如何存储此 region
信息(可能是 13 个区域中的任何一个)和 env
信息(可能是 dev
或 test
或 prod
以及指标)这样我就可以根据 region
和 env
?
对指标进行切片和切块
我找到了一些方法来做到这一点,但不确定一般是如何完成的,因为这似乎是一个很常见的场景:
- 将
region
和 env
信息存储为每个指标的标签(不推荐:https://prometheus.io/docs/instrumenting/writing_exporters/#target-labels-not-static-scraped-labels)
- 使用目标标签 - 我在应用程序中有
region
和 env
值,我想从应用程序本身设置此信息,而不是在抓取配置中设置它们
- 保留一个单独的衡量标准来记录
region
和 env
信息作为标签(如此处所述:https://www.robustperception.io/exposing-the-software-version-to-prometheus)-这就是我计划存储我的应用程序的方式 version
信息,但 app version
信息和 region
信息之间的区别是:版本在不同版本中不断变化,但是我从配置文件中获取的区域是不变的。所以,不确定这是否是一个好方法。
我是普罗米修斯的新手。有人可以建议我应该如何存储此 region
和 env
信息吗?还有其他更好的方法吗?
所有建议的选项都有效,但都有缺点。
first 选项(具有 env
和 region
应用程序公开的每个指标)易于实施但难以维护。最终有人会忘记这些,为发生未被观察到的故障打开了可能性。除此之外,您可能无法将这些标签添加到其他出口商,由其他人编写。最后,如果你必须处理数百万的时间序列,更多的纯文本数据意味着更多的流量。
third 选项(将这些标签存储在单独的指标中)将使编写和理解查询变得相当困难。以这个为例:
sum by(instance) (node_arp_entries) and on(instance) node_exporter_build_info{version="0.17.0"}
它为 node-exporter version="0.17.0"
的实例计算 node_arp_entries
的 sum
。更具体地说,它计算每个实例的总和,然后删除版本错误的那些,但你明白了。
我会选择 second 选项(使用 Prometheus 添加这些标签作为抓取配置的一部分)。为了省事,请考虑以下监控设置:
Datacener Prometheus
Regional Prometheus
Global Prometheus
1. Collects metrics from local instances. 2. Adds dc
label to each metric. 3. Pushes the data into the regional Prometheus ->
1. Collects data on datacenter scale. 2. Adds region
label to all metrics. 3. Pushes the data into the global instance ->
Simply collects and stores the data on global scale
这是您在 Google 规模上需要的那种设置,但关键是简单。每个标签的来源和原因一目了然。这种方法要求您使 Prometheus 配置稍微复杂一些,并且您拥有的 Prometheus 实例越少,您需要的抓取配置就越多。 总的来说,我认为这个选项优于其他选项。
我有一个应用程序,我 运行 每个 AWS 区域都有一个此应用程序的实例。
我正在尝试使用 Prometheus 指标客户端检测应用程序代码,并将收集的指标公开给 /metrics
端点。有一个中央服务器将跨所有区域抓取 /metrics
个端点,并将它们存储在中央时间序列数据库中。
假设我定义了一个名为:http_responses_total
的指标,那么我想知道它在所有区域的聚合值以及各个区域值。
我如何存储此 region
信息(可能是 13 个区域中的任何一个)和 env
信息(可能是 dev
或 test
或 prod
以及指标)这样我就可以根据 region
和 env
?
我找到了一些方法来做到这一点,但不确定一般是如何完成的,因为这似乎是一个很常见的场景:
- 将
region
和env
信息存储为每个指标的标签(不推荐:https://prometheus.io/docs/instrumenting/writing_exporters/#target-labels-not-static-scraped-labels) - 使用目标标签 - 我在应用程序中有
region
和env
值,我想从应用程序本身设置此信息,而不是在抓取配置中设置它们 - 保留一个单独的衡量标准来记录
region
和env
信息作为标签(如此处所述:https://www.robustperception.io/exposing-the-software-version-to-prometheus)-这就是我计划存储我的应用程序的方式version
信息,但 appversion
信息和region
信息之间的区别是:版本在不同版本中不断变化,但是我从配置文件中获取的区域是不变的。所以,不确定这是否是一个好方法。
我是普罗米修斯的新手。有人可以建议我应该如何存储此 region
和 env
信息吗?还有其他更好的方法吗?
所有建议的选项都有效,但都有缺点。
first 选项(具有 env
和 region
应用程序公开的每个指标)易于实施但难以维护。最终有人会忘记这些,为发生未被观察到的故障打开了可能性。除此之外,您可能无法将这些标签添加到其他出口商,由其他人编写。最后,如果你必须处理数百万的时间序列,更多的纯文本数据意味着更多的流量。
third 选项(将这些标签存储在单独的指标中)将使编写和理解查询变得相当困难。以这个为例:
sum by(instance) (node_arp_entries) and on(instance) node_exporter_build_info{version="0.17.0"}
它为 node-exporter version="0.17.0"
的实例计算 node_arp_entries
的 sum
。更具体地说,它计算每个实例的总和,然后删除版本错误的那些,但你明白了。
我会选择 second 选项(使用 Prometheus 添加这些标签作为抓取配置的一部分)。为了省事,请考虑以下监控设置:
Datacener Prometheus | Regional Prometheus | Global Prometheus |
---|---|---|
1. Collects metrics from local instances. 2. Adds dc label to each metric. 3. Pushes the data into the regional Prometheus -> |
1. Collects data on datacenter scale. 2. Adds region label to all metrics. 3. Pushes the data into the global instance -> |
Simply collects and stores the data on global scale |
这是您在 Google 规模上需要的那种设置,但关键是简单。每个标签的来源和原因一目了然。这种方法要求您使 Prometheus 配置稍微复杂一些,并且您拥有的 Prometheus 实例越少,您需要的抓取配置就越多。 总的来说,我认为这个选项优于其他选项。