添加 Prometheus 获取器

https://storyboard.openstack.org/#!/story/2005427

CloudKitty 需要一个获取器来描述如何从 Prometheus 服务获取 scope(以前的 tenants)。本规范旨在定义需要做什么以及原因。本文档中的所有内容均可讨论,同样在相关的 storyboard 和 gerrit 上。

问题描述

目前,CloudKitty 没有实现任何从 Prometheus 服务发现和获取 scope ID 的方法,并且需要一个。

提议的变更

该获取器将在 [fetcher_prometheus] 部分的 cloudkitty.conf 中进行配置。

配置选项如下

  • 一个 metric 选项,用于提供一个度量名称,从中我们可以推断 scope ID(默认:无)。

  • 一个 scope_attribute 选项,用于提供引用 scope ID 的键(默认:project_id)。

  • 一个 filters 选项,作为一个键值字典,用于使用一些元数据过滤发现查询响应(可选)。

  • 一个 prometheus_url 选项,用于定义 Prometheus 服务的 HTTP API 端点 URL。

  • 一个 prometheus_user 和一个 prometheus_password 选项,用于提供身份验证凭据(两者默认:无)。

  • 一个 cafile 选项,用于允许自定义证书颁发机构文件(默认:无)。

  • 一个 insecure 选项,用于显式允许不安全的 HTTPS 请求(默认:false)。

该获取器将使用 PromQL 查询请求指定 metric 上的聚合,并通过 HTTP 发送到指定的 Prometheus 服务 API 瞬时查询端点。它还将根据指定的 scope_attribute 对结果进行分组,如果指定了某些元数据 filters,则过滤响应,以便收集 scope_ids。

示例

# cloudkitty.conf

# [...]

[fetcher_prometheus]
metric=container_memory_usage_bytes
scope_attribute=namespace
prometheus_url=https://prometheus-dn.tld/api/v1
prometheus_user=foobar
prometheus_password=foobar
insecure=true
filters=label1:foo,label2:bar

PromQL 请求如下所示

max(container_memory_usage_bytes{label1="foo", label2="bar"}) by (namespace)

带有 URL 编码的 PromQL 的 HTTP URL 将如下所示

http://prometheus-dn.tld/api/v1/query?query=max%28container_memory_usage_bytes%7Blabel1%3D%22foo%22%2C%20label2%3D%22bar%22%7D%29%20by%20%28namespace%29

数据模型影响

REST API 影响

安全影响

通知影响

其他最终用户影响

最终用户将受益于新的 Prometheus 获取器,以动态发现 scope ID。

它将特别适用于与 Prometheus 收集器结合使用。

性能影响

其他部署者影响

开发人员影响

实现

负责人

Justin Ferrieu 被分配来处理规范以及开发所引发的点。

主要负责人

jferrieu

其他贡献者

工作项

  • 实现 Prometheus 获取器(带有单元测试)

  • 添加获取器文档

依赖项

测试

提议的更改将使用单元测试进行测试。

文档影响

我们将在 Administration Guide/Configuration Guide/Fetcher/Prometheus 中添加一个条目,详细介绍 Prometheus 获取器配置。

参考资料