Tariffazione (FinOps): utilizzo raccolto da Prometheus, tariffato con regole hashmap e script CEL, storico tariffato in InfluxDB; con openkeel-pricing (preventivi di costo e di carbonio), alimenta la pagina FinOps / GreenOps di Skyline.
Go Prometheus, InfluxDBopenkeel-cloudkitty
Il modulo
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
Estratto da openkeel-cloudkitty/README.md (in inglese).
API REST
66 operazioni dell'API REST originale (route e azioni nel corpo) e il loro stato in OpenKeel.
Le tre suite gabbi di CloudKitty vengono rieseguite contro il servizio Go, con vettori hashmap registrati dai test Python e un deployment in lab riletto attraverso l'ingress.
Replay degli scambi registrati
Riesecuzione E2E delle suite gabbi
223 scambi di 19 file gabbi (v1, hashmap, pyscripts, v2) danno lo stesso stato e lo stesso corpo.
Esecuzione
make e2e, anche su MariaDB 11.4 (E2E_MYSQL_DSN); la modalità strict passa con le differenze note elencate.
Ultimo risultato 153 / 223 identici; gli altri 70 sono spiegati (fake dei test Python, storage v1, CORS, script Python rifiutati).
Fonte: openkeel-cloudkitty/docs/CONFORMANCE.md
Test unitari e golden test
Vettori hashmap
24 vettori di tariffazione hashmap registrati da cloudkitty.tests.test_hashmap danno lo stesso prezzo alla cifra, decimali verificati con CPython.
Esecuzione
go test ./... (19 pacchetti).
Ultimo risultato 24 / 24 identici.
Fonte: openkeel-cloudkitty/docs/CONFORMANCE.md
End-to-end su un laboratorio
Deployment in lab
Tipo di catalogo rating, moduli, regole hashmap, preventivi, uno script Python rifiutato e uno CEL accettato, dataframe inviati e riletti con /v2/summary; il processor tariffa dall'inizio del mese.
Esecuzione
okadm install --mode lab con cloudkitty, chiamate attraverso l'ingress con un token di amministratore; pagina FinOps / GreenOps di Skyline.
Ultimo risultato Superato, 0 errori di tariffazione.
Fonte: openkeel-cloudkitty/docs/CONFORMANCE.md
Contratto client
Aspettative dei client
python-cloudkittyclient, cloudkitty-dashboard e cloudkitty-tempest-plugin.
Esecuzione
Non ancora retro-specificati.
Ultimo risultato Non eseguito.
Fonte: openkeel-cloudkitty/docs/CONFORMANCE.md
Escluso dal rewrite
CloudKitty mantiene le sue 66 operazioni API e la sua tariffazione; raccoglie solo da Prometheus e memorizza solo in InfluxDB, e i PyScripts diventano espressioni CEL.
Meccanismi interni semplificati
PyScripts (Python eseguito dal servizio)
Gestito da CEL
Perché è stato escluso
Eseguire il Python degli operatori con exec è codice arbitrario nel servizio; CEL non ha istruzioni né I/O, con limiti di costo e di tempo.
Perché la soluzione non ne risente
Stessa tariffazione per punto dati; gli script scritti secondo lo schema documentato sono tradotti da tools/pyscript2cel.py, gli altri vengono riscritti.
Fonte: openkeel-cloudkitty/docs/CONFORMANCE.md
Gestito dalla piattaforma Cloud Native
Collector Gnocchi e Aetos, fetcher Gnocchi
Gestito da Prometheus
Perché è stato escluso
OpenKeel non distribuisce Gnocchi: l'utilizzo viene da Prometheus (kube-prometheus-stack, openstack-exporter).
Perché la soluzione non ne risente
Gli stessi dati tariffati dalle metriche Prometheus; i collector possono essere aggiunti su richiesta.
Fonte: openkeel-cloudkitty/docs/CONFORMANCE.md
Gestito dalla piattaforma Cloud Native
Elasticsearch, OpenSearch, Loki e storage v1
Gestito da InfluxDB
Perché è stato escluso
Lo storico tariffato va in InfluxDB 1.x o 2.x; gli altri backend non sono distribuiti.
Perché la soluzione non ne risente
Riepiloghi e dataframe come con lo storage v2; i difetti upstream del filtro di scope di quei backend non possono verificarsi.
Fonte: openkeel-cloudkitty/docs/CONFORMANCE.md
Meccanismi interni semplificati
RPC RabbitMQ e lock tooz
Gestito da Kubernetes Leases
Perché è stato escluso
I preventivi sono calcolati nell'API con lo stesso codice di tariffazione; i reset di scope arrivano al processor tramite il database; un solo processor attivo detiene un Lease.
Perché la soluzione non ne risente
Stesso comportamento dell'API, una dipendenza in meno, corretto su più host.
Fonte: openkeel-cloudkitty/docs/CONFORMANCE.md
Qui è elencato solo ciò che è stato escluso per scelta progettuale; il lavoro non ancora svolto si trova nei Known gaps del docs/CONFORMANCE.md del modulo. Tutti i moduli