重构 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 中。

参考资料