This is a spec proposing to add a Prometheus fetcher. See specs/train/adding_prometheus_fetcher.rst for more details. Story: 2005427 Change-Id: I458e2d5a7b06fba25a094ce04cb2050ad51554e8
3.8 KiB
Adding Prometheus fetcher
https://storyboard.openstack.org/#!/story/2005427
CloudKitty needs a fetcher describing how to get scopes (formerly tenants) from a Prometheus service. This spec aims at defining what is to be done and why. Everything in this document is open to discussion, equally on the associated storyboard and gerrit.
Problem Description
In the present state, CloudKitty does not implement any method for discovering and fetching scope IDs from a Prometheus service and it needs one.
Proposed Change
The fetcher will be configurable under a
[fetcher_prometheus]
section in
cloudkitty.conf
.
The configuration options will be the folllowing :
- A
metric
option to provide a metric name from which we can infer the scope ID (default: none). - A
scope_attribute
option to provide the key referring the scope IDs (default:project_id
). - A
filters
option as a key-value dictionary to filter out the discovery query response with some metadata (optional). - A
prometheus_url
option to define the HTTP API endpoint URL of a Prometheus service. - A
prometheus_user
and aprometheus_password
option to provide credentials for authentication (both defaults: none). - A
cafile
option to allow custom certificate authority file (default: none). - An
insecure
option to explicitly allow insecure HTTPS requests (default: false).
The fetcher will request an aggregation on the specified
metric
using PromQL query and send it over HTTP to the
specified Prometheus service API instant query endpoint. It will also
group the result by the specified scope_attribute
and
filter out the response if some metadata filters
have been
specified in order to gather the scope_ids.
Example
# 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
The PromQL request will look the following:
max(container_memory_usage_bytes{label1="foo", label2="bar"}) by (namespace)
The HTTP URL with the url-encoded PromQL will then look the following :
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
Data model impact
None
REST API impact
None
Security impact
None
Notifications Impact
None
Other end user impact
End users will benefit from new Prometheus fetcher to dynamically discover scope IDs.
It will be particularly handy in conjunction with the Prometheus collector.
Performance Impact
None
Other deployer impact
None
Developer impact
None
Implementation
Assignee(s)
Justin Ferrieu is assigned to work on the spec as well as to develop the evoked points.
- Primary assignee:
-
jferrieu
- Other contributors:
-
None
Work Items
- Implement Prometheus fetcher (with unit tests)
- Add fetcher documentation
Dependencies
None
Testing
The proposed changes will be tested with unit tests.
Documentation Impact
We will add an entry detailing the Prometheus fetcher configuration
in
Administration Guide/Configuration Guide/Fetcher/Prometheus
.
References
- Prometheus documentation: https://prometheus.io/docs/