重构 Prometheus Collector¶
CloudKitty 的 Prometheus collector 需要进行重构。本规范旨在定义需要完成的内容以及原因。本文档中的所有内容均可讨论,同样适用于相关的故事板和 gerrit。
问题描述¶
目前,Prometheus collector 在配置和操作方面与 CloudKitty 中的其他 collector 不一致。
最终用户完全自行定义要在
metrics.yml文件中的extra_args子键下的query选项中执行的 PromQL 查询。允许最终用户以牺牲通用性为代价构建如此复杂的请求,与 CloudKitty 涵盖的使用场景无关。该 collector 未使用原生的 PromQL
groupby功能。该过程在 Prometheus 服务响应之后完成,导致了额外的运营成本。该 collector 忽略
scope_key配置选项,不允许对请求进行范围限定,但这是项目其他 collector 中的标准行为。此外,这对于编排来说是一个主要问题。假设您部署了多个 CK 处理器。如果没有范围限定,您最终会得到数据重复,这可能会导致错误的报告。
该 collector 还需要以下新功能
它需要身份验证配置选项才能拨接到一些安全的 Prometheus 服务。
它需要一个配置选项来考虑自定义证书颁发机构文件,以便授权使用自定义证书签名的 HTTPS 请求。
它需要一个不安全配置选项来显式信任使用不受信任证书签名的 HTTPS 请求。
这些功能将对最终用户配置 CloudKitty 以有效地连接到 Prometheus 服务非常有用。
提议的变更¶
在 cloudkitty.conf 中,在 [collector_prometheus] 部分
添加一个
prometheus_user和一个prometheus_password选项来提供身份验证凭据(两者默认值:无)。添加一个
cafile选项以允许自定义证书颁发机构文件(默认值:无)。添加一个
insecure选项以显式允许不安全的 HTTPS 请求(默认值:false)。
可能弃用 metrics.yml 中为定义的指标中的 extra_args/query(参见 替代方案 部分)。
在 metrics.yml 中,对于定义的指标,在 extra_args 子键下添加一个 aggregation_method 选项,以定义在收集指标数据时使用哪种聚合方法。
例如
# metrics.yml
metrics:
# [...]
volume_size:
unit: GiB
groupby:
- id
- project_id
metadata:
- volume_type
extra_args:
aggregation_method: max
有效的聚合方法将如下所示
avg:时间窗口内所有点的平均值。min:时间窗口内所有点的最小值。max:时间窗口内所有点的最大值。sum:时间窗口内所有值的总和。count:时间窗口内所有值的计数。stddev:时间窗口内值的总体标准差。stdvar:时间窗口内值的总体标准方差。
注意
时间窗口是从 cloudkitty.conf 中 [collect] 部分下的 period 配置选项计算得出的。
此时的其他更改主要集中在 Prometheus collector 内部发生查询构建过程中
[collect]/scope_key选项值将被添加到过滤器中,以使用相应的scope_id对每个查询进行过滤。该 collector 现在将使用 PromQL 提供的
groupby功能,使用by (scope_key, groupby, metadata)语法,而不是将其推迟到 collector 实现中。
示例¶
对于以下 cloudkitty.conf
# Some options have been omitted for the sake of clarity
[collect]
collector = prometheus
scope_key = namespace
period = 3600
[collector_prometheus]
prometheus_url = http://prometheus-dn.tld/api/v1
和以下 metrics.yml
metrics:
# [...]
# Let's say we want to rate the following metric
container_memory_usage_bytes:
unit: GiB
groupby:
- container_id
metadata:
- volume_type
extra_args:
aggregation_method: max
PromQL 请求将如下所示
max(max_over_time(container_memory_usage_bytes{namespace="foobar"}[3600s])) by (namespace, container_id, volume_type)
开始和结束时间戳将从 period 选项计算得出。假设我们从 2019 年 1 月 30 日下午 1 点 (时间戳: 1548853200) 开始。那么结束时间戳将是 1548853200 + period (= 1548856800)。
带有 URL 编码的 PromQL 的 HTTP URL 将如下所示
http://prometheus-dn.tld/api/v1/query?query=max%28max_over_time%28container_memory_usage_bytes%7Bnamespace%3D%22foobar%22%7D%5B3600s%5D%29%29%20by%20%28namespace%2C%20container_id%2C%20volume_type%29&time=158856800
备选方案¶
与其弃用 metrics.yml 文件中为指标定义的 extra_args/query 选项,不如将其删除。
数据模型影响¶
无
REST API 影响¶
无
安全影响¶
无
通知影响¶
无
其他最终用户影响¶
如果最终用户正在使用当前的 Prometheus collector,他们可能需要重新配置其指标定义。
但是,在进行这些更改之后,由于 metrics.yml 中指标定义的改进一致性,他们将需要更少的开销配置才能从一个 collector 切换到另一个 collector。
他们还将受益于 cloudkitty.conf 中 [collector_prometheus] 部分中添加的配置选项。
性能影响¶
无
其他部署者影响¶
无
开发人员影响¶
无
实现¶
负责人¶
Justin Ferrieu 被分配来处理规范以及开发所引发的点。
- 主要负责人
jferrieu
- 其他贡献者
无
工作项¶
相应地更改 Prometheus collector 内部的配置模式、查询构建过程和查询响应格式化过程。
添加 HTTPS 和身份验证支持。
依赖项¶
无
测试¶
所提出的更改将使用单元测试进行测试。
文档影响¶
我们将添加一个条目,详细介绍 Prometheus collector 配置,位于 Administration Guide/Configuration Guide/Collector/Prometheus 中。
参考资料¶
Prometheus 文档:https://prometheus.ac.cn/docs/