Bewertung (FinOps): aus Prometheus gesammelte Nutzung, bepreist durch hashmap-Regeln und CEL-Skripte, bewertete Historie in InfluxDB; zusammen mit openkeel-pricing (Kosten- und CO₂-Angebote) speist es die FinOps-/GreenOps-Seite von Skyline.
Go Prometheus, InfluxDBopenkeel-cloudkitty
Das Modul
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
Auszug aus openkeel-cloudkitty/README.md (auf Englisch).
REST-API
66 Operationen der Original-REST-API (Routen und Body-Aktionen) und ihr Status in OpenKeel.
Die drei gabbi-Suiten von CloudKitty werden gegen den Go-Dienst wiederholt, mit hashmap-Vektoren aus den Python-Tests und einem über den Ingress zurückgelesenen Lab-Deployment.
Replay aufgezeichneter Austausche
E2E-Wiederholung der gabbi-Suiten
223 Austausche aus 19 gabbi-Dateien (v1, hashmap, pyscripts, v2) liefern denselben Status und denselben Body.
Ausführung
make e2e, auch auf MariaDB 11.4 (E2E_MYSQL_DSN); der strikte Modus besteht mit den aufgeführten bekannten Unterschieden.
Letztes Ergebnis 153 / 223 identisch; die 70 anderen sind erklärt (Fakes der Python-Tests, Storage v1, CORS, abgelehnte Python-Skripte).
Quelle: openkeel-cloudkitty/docs/CONFORMANCE.md
Unit- und Golden Tests
hashmap-Vektoren
24 hashmap-Bewertungsvektoren, aufgezeichnet aus cloudkitty.tests.test_hashmap, ergeben auf die Ziffer denselben Preis; Dezimalzahlen gegen CPython geprüft.
Ausführung
go test ./... (19 Pakete).
Letztes Ergebnis 24 / 24 identisch.
Quelle: openkeel-cloudkitty/docs/CONFORMANCE.md
End-to-End in einem Lab
Lab-Deployment
Katalogtyp rating, Module, hashmap-Regeln, Angebote, ein abgelehntes Python-Skript und ein akzeptiertes CEL-Skript, Dataframes geschrieben und über /v2/summary zurückgelesen; der Processor bewertet ab Monatsbeginn.
Ausführung
okadm install --mode lab mit cloudkitty, Aufrufe über den Ingress mit einem Admin-Token; FinOps-/GreenOps-Seite von Skyline.
Letztes Ergebnis Bestanden, 0 Bewertungsfehler.
Quelle: openkeel-cloudkitty/docs/CONFORMANCE.md
Client-Vertrag
Client-Erwartungen
python-cloudkittyclient, cloudkitty-dashboard und cloudkitty-tempest-plugin.
Ausführung
Noch nicht reverse-spezifiziert.
Letztes Ergebnis Nicht ausgeführt.
Quelle: openkeel-cloudkitty/docs/CONFORMANCE.md
Im Rewrite ausgelassen
CloudKitty behält seine 66 API-Operationen und seine Bewertung; es sammelt nur aus Prometheus und speichert nur in InfluxDB, und PyScripts werden zu CEL-Ausdrücken.
Vereinfachte interne Mechanik
PyScripts (vom Dienst ausgeführtes Python)
Übernommen von CEL
Warum es ausgelassen wurde
Python von Betreibern mit exec auszuführen ist beliebiger Code im Dienst; CEL hat keine Anweisungen und kein I/O, mit Kosten- und Zeitgrenzen.
Warum die Lösung nicht beeinträchtigt ist
Gleiche Bewertung pro Datenpunkt; Skripte nach dem dokumentierten Muster übersetzt tools/pyscript2cel.py, die anderen werden neu geschrieben.
Quelle: openkeel-cloudkitty/docs/CONFORMANCE.md
Von der Cloud-Native-Plattform übernommen
Gnocchi- und Aetos-Collectoren, Gnocchi-Fetcher
Übernommen von Prometheus
Warum es ausgelassen wurde
OpenKeel stellt kein Gnocchi bereit: Die Nutzung kommt aus Prometheus (kube-prometheus-stack, openstack-exporter).
Warum die Lösung nicht beeinträchtigt ist
Dieselben bewerteten Daten aus den Prometheus-Metriken; die Collectoren können bei Bedarf ergänzt werden.
Quelle: openkeel-cloudkitty/docs/CONFORMANCE.md
Von der Cloud-Native-Plattform übernommen
Elasticsearch, OpenSearch, Loki und Storage v1
Übernommen von InfluxDB
Warum es ausgelassen wurde
Die bewertete Historie geht nach InfluxDB 1.x oder 2.x; die anderen Backends werden nicht bereitgestellt.
Warum die Lösung nicht beeinträchtigt ist
Zusammenfassungen und Dataframes wie mit Storage v2; die Upstream-Fehler beim Scope-Filter dieser Backends können nicht auftreten.
Quelle: openkeel-cloudkitty/docs/CONFORMANCE.md
Vereinfachte interne Mechanik
RabbitMQ-RPC und tooz-Sperren
Übernommen von Kubernetes Leases
Warum es ausgelassen wurde
Angebote werden in der API mit demselben Bewertungscode berechnet; Scope-Resets gehen über die Datenbank an den Processor; ein einziger aktiver Processor hält ein Lease.
Warum die Lösung nicht beeinträchtigt ist
Gleiches API-Verhalten, eine Abhängigkeit weniger, korrekt auf mehreren Hosts.
Quelle: openkeel-cloudkitty/docs/CONFORMANCE.md
Hier ist nur aufgeführt, was bewusst ausgelassen wurde; noch nicht erledigte Arbeit steht in den Known gaps der docs/CONFORMANCE.md des Moduls. Alle Module