Valorisation (FinOps) : usage collecté depuis Prometheus, valorisé par des règles hashmap et des scripts CEL, historique valorisé dans InfluxDB ; avec openkeel-pricing (devis de coût et de carbone), il alimente la page FinOps / GreenOps de Skyline.
Go Prometheus, InfluxDBopenkeel-cloudkitty
Le module
OpenKeel implementation in Go of OpenStack CloudKitty, the rating service (cloudkitty-api and cloudkitty-processor), generated from the reverse-specification of branch stable/2026.2 (reverse-spec-cloudkitty/, files 00–07 and _rewrite/) by the generate-go-from-spec skill. It replaces the Python service without its clients noticing (python-cloudkittyclient, cloudkitty-dashboard): same routes (66 operations of v1, hashmap, pyscripts and v2), status codes, WSME and flask-restful error bodies, and policies.
What it does: the processor lists the scopes (Keystone projects with the rating role, Prometheus label values or a static list), collects their usage from Prometheus every period, prices it with the enabled rating modules (hashmap rules, CEL scripts in place of PyScripts), and stores the rated data in InfluxDB (1.x or 2.x); the API manages the rules and returns summaries, rated data frames and instant quotes.
OpenKeel decisions (details and reasons in docs/CONFORMANCE.md):
PyScripts are CEL expressions, evaluated per data point, never Python (exec); tools/pyscript2cel.py translates the scripts written in the documented pattern; skip_datapoints_expression is CEL too.
Collector: Prometheus only (kube-prometheus-stack); storage: InfluxDB only; no RabbitMQ: quotes are computed in the API, scope resets go to the processor through the database; one active processor elected with a Kubernetes Lease.
Fixed upstream defects: scoped deletes, unprotected GET /v2/rating/modules, quotes with a flat desc, InfluxQL built from escaped literals, no unverified Keystone call, reprocessing and reset windows. What is reproduced and what differs is in docs/CONFORMANCE.md; the security checklist is in docs/SECURITY.md.
Go module: github.com/openkeel/openkeel-cloudkitty
Binaries: cloudkitty-api (API on port 8889, health and metrics on 9090) and cloudkitty-processor (health on 9090)
Configuration: YAML, see config/config.example.yaml
Setting up a development environment, the database and the tests: docs/GETTING-STARTED.md
Database schema, migrations and upgrades: docs/DATABASE.md
Extrait de openkeel-cloudkitty/README.md (en anglais).
API REST
66 opérations de l'API REST d'origine (routes et actions de corps), et leur état dans OpenKeel.
Les trois suites gabbi de CloudKitty sont rejouées contre le service Go, avec des vecteurs hashmap enregistrés depuis les tests Python et un déploiement en lab relu à travers l'ingress.
Rejeu des échanges enregistrés
Rejeu E2E des suites gabbi
223 échanges de 19 fichiers gabbi (v1, hashmap, pyscripts, v2) donnent le même statut et le même corps.
Exécution
make e2e, aussi sur MariaDB 11.4 (E2E_MYSQL_DSN) ; le mode strict passe avec les différences connues listées.
Dernier résultat 153 / 223 identiques ; les 70 autres sont expliqués (faux objets des tests Python, stockage v1, CORS, scripts Python refusés).
Source : openkeel-cloudkitty/docs/CONFORMANCE.md
Tests unitaires et golden tests
Vecteurs hashmap
24 vecteurs de valorisation hashmap enregistrés depuis cloudkitty.tests.test_hashmap donnent le même prix au chiffre près, les décimaux vérifiés avec CPython.
Exécution
go test ./... (19 paquets).
Dernier résultat 24 / 24 identiques.
Source : openkeel-cloudkitty/docs/CONFORMANCE.md
De bout en bout sur un lab
Déploiement en lab
Type de catalogue rating, modules, règles hashmap, devis, un script Python refusé et un script CEL accepté, dataframes poussées puis relues par /v2/summary ; le processor valorise depuis le début du mois.
Exécution
okadm install --mode lab avec cloudkitty, appels à travers l'ingress avec un jeton admin ; page FinOps / GreenOps de Skyline.
Dernier résultat Réussi, 0 échec de valorisation.
Source : openkeel-cloudkitty/docs/CONFORMANCE.md
Contrat client
Attentes des clients
python-cloudkittyclient, cloudkitty-dashboard et cloudkitty-tempest-plugin.
Exécution
Pas encore rétro-spécifiés.
Dernier résultat Non exécuté.
Source : openkeel-cloudkitty/docs/CONFORMANCE.md
Écarté de la réécriture
CloudKitty garde ses 66 opérations d'API et sa valorisation ; il collecte depuis Prometheus et stocke dans InfluxDB uniquement, et les PyScripts deviennent des expressions CEL.
Mécanique interne simplifiée
PyScripts (Python exécuté par le service)
Repris par CEL
Pourquoi c'est écarté
Exécuter le Python des opérateurs avec exec, c'est du code arbitraire dans le service ; CEL n'a ni instructions ni E/S, avec des limites de coût et de temps.
Pourquoi la solution n'est pas affectée
Même valorisation par point de donnée ; les scripts écrits selon le modèle documenté sont traduits par tools/pyscript2cel.py, les autres sont réécrits.
Source : openkeel-cloudkitty/docs/CONFORMANCE.md
Assuré par la plateforme Cloud Native
Collecteurs Gnocchi et Aetos, fetcher Gnocchi
Repris par Prometheus
Pourquoi c'est écarté
OpenKeel ne déploie pas Gnocchi : l'usage vient de Prometheus (kube-prometheus-stack, openstack-exporter).
Pourquoi la solution n'est pas affectée
Mêmes données valorisées à partir des métriques Prometheus ; les collecteurs peuvent être ajoutés à la demande.
Source : openkeel-cloudkitty/docs/CONFORMANCE.md
Assuré par la plateforme Cloud Native
Elasticsearch, OpenSearch, Loki et stockage v1
Repris par InfluxDB
Pourquoi c'est écarté
L'historique valorisé va dans InfluxDB 1.x ou 2.x ; les autres backends ne sont pas déployés.
Pourquoi la solution n'est pas affectée
Résumés et dataframes comme avec le stockage v2 ; les défauts amont de filtre de scope de ces backends ne peuvent pas se produire.
Source : openkeel-cloudkitty/docs/CONFORMANCE.md
Mécanique interne simplifiée
RPC RabbitMQ et verrous tooz
Repris par Kubernetes Leases
Pourquoi c'est écarté
Les devis sont calculés dans l'API avec le même code de valorisation ; les remises à zéro de scope passent au processor par la base de données ; un seul processor actif détient un Lease.
Pourquoi la solution n'est pas affectée
Même comportement d'API, une dépendance de moins, correct sur plusieurs hôtes.
Source : openkeel-cloudkitty/docs/CONFORMANCE.md
Seul ce qui a été écarté par choix de conception figure ici ; le travail pas encore fait se trouve dans les Known gaps du docs/CONFORMANCE.md du module. Tous les modules