CloudKitty: what did it cost?
- Rates the collected usage, period by period
- Keeps the history; summaries, dataframes, reprocessing
- OpenStack's API, unchanged for its clients
OpenKeel: the sovereign French Cloud solution of the inherent group, with a European reach Discover inherent
Architecture
What a project cost, what it would cost and what it emits: CloudKitty rates the usage after the fact, openkeel-pricing quotes cost and carbon now, and Skyline shows both.
openstack-exporter series (instances, volumes, images) in the Prometheus of the observability stack
Collects each project's usage every hour and prices it with hashmap rules and CEL scripts
Keeps the rated history per project, period and service
The FinOps / GreenOps page reads the summaries; the forms and the quota popup read openkeel-pricing
The rating service rewritten in Go from the reverse-spec of stable/2026.2: the same 66 API operations (v1, hashmap, pyscripts, v2), status codes, error bodies and policies.
| Part | OpenKeel |
|---|---|
API (cloudkitty-api) | Rules, modules, summaries, dataframes and instant quotes; quotes computed in the API with the same rating code |
Processor (cloudkitty-processor) | Lists the projects (Keystone fetcher: every enabled project), collects their usage from Prometheus every period (1 hour), rates it and stores it; one active processor holds a Kubernetes Lease |
| Rating | hashmap rules (services, fields, mappings, thresholds), and scripts written as CEL expressions instead of Python: no statements, no I/O, cost and time limits |
| Storage | InfluxDB 1.x or 2.x (InfluxQL with escaped literals); MariaDB Galera for the rules and the scope state |
| Collected series | The upstream metric file on openstack-exporter: instances (openstack_nova_server_status), volume capacity (openstack_cinder_limits_volume_used_gb), image size (openstack_glance_image_bytes), projects labelled tenant_id |
| Deployment | Optional component: okadm install --components …,cloudkitty --grafana; okadm turns openstack-exporter on and points the collector at the stack's Prometheus; lab: one processor, InfluxDB 2 GiB |
| Fixed upstream defects | Scoped deletes, policy of GET /v2/rating/modules, quotes with a flat desc, no unverified Keystone call, reprocessing and reset windows |
Tests, features left out and the API inventory are on the CloudKitty component page.
The rates are Kubernetes resources, OpenKeelTenant (CRD installed by okadm in both modes): the one named default applies to every project without its own. openkeel-pricing watches them in memory, with no database or bus.
| Resource | Unit | Rate |
|---|---|---|
| cpu | vCPU | cost and carbon per month |
| ram | GiB | cost and carbon per month |
| gpu | GPU | cost and carbon per month |
| disk | GiB | cost and carbon per month |
| s3 | GiB | cost and carbon per month |
| dns | domain | cost and carbon per month |
| vpn | VPN | cost and carbon per month |
API: GET /v1/rates (effective rates and the OpenKeelTenant each comes from) and POST /v1/quotes (a flavor, a count and resources: lines and totals of cost and carbon). Costs in € per month, carbon in kg CO₂e per month (× 12 for the year).
With CloudKitty selected, okadm install --demo pushes one rated frame per day for the demo project, from the first day of last month to yesterday (its VM, volume, load balancer, container and floating IPs with their real ids, a VM deleted last month, the base image), then creates the project's scope state so that the processor rates it from today on. The FinOps / GreenOps page shows both months at once.