# README
resource-state-metrics
Summary
resource-state-metrics
is a Kubernetes controller that builds on Kube-State-Metrics' Custom Resource State's ideology and generates metrics for custom resources based on the configuration specified in its managed resource, ResourceMetricsMonitor
.
The project's conformance benchmarking shows 3x faster RTT for resource-state-metrics
as compared to Kube-State-Metrics' Custom Resource Definition Metrics (ea5826a) feature-set:
Thu Nov 21 05:06:09 IST 2024
[RESOURCESTATEMETRICS]
BUILD: 1059ms
RTT: 1107ms
[CUSTOMRESOURCESTATE]
BUILD: 1116ms
RTT: 3196ms
Development
Start developing by following these steps:
- Set up dependencies with
make setup
. - Test out your changes with
make apply apply-testdata local
.- Telemetry metrics, by default, are exposed on
:9998/metrics
. - Resource metrics, by default, are exposed on
:9999/metrics
.
- Telemetry metrics, by default, are exposed on
- Start a
pprof
interactive session withmake pprof
.
For more details, take a look at the Makefile targets.
Notes
- Garbage in, garbage out: Invalid configurations will generate invalid metrics. The exception to this being that certain checks that ensure metric structure are still present (for e.g.,
value
should be afloat64
). - Library support: The module is never intended to be used as a library, and as such, does not export any functions or types, with
pkg/
being an exception (for managed types and such). - Metrics stability: There are no metrics stability guarantees, as the metrics are user-generated.
- No middle-ware: The configuration is
unmarshal
led into a set of stores that the codebase directly operates on. There is no middle-ware that processes the configuration before it is used, in order to avoid unnecessary complexity. However, the expression(s) within thevalue
andlabelValues
may need to be evaluated before being used, and as such, are exceptions.
- The managed resource,
ResourceMetricsMonitor
is namespace-scoped, but, to keep in accordance with Kube-State-Metrics'CustomResourceState
, which allows for collecting metrics from cluster-wide resources, it is possible to omit anyfield
orlabel
selectors to achieve that result. Similarly, to isolate metrics between namespaces (or teams), the selectors may be levied, and a utility such asprom-label-proxy
to enforce selective namespace(s) or custom label(s).- Enforce namespaced-collection behind a flag (for cluster admins)?
TODO
In the order of priority:
- CEL expressions for metric generation (or *unstructured.Unstructured, if that suffices).
- Conformance test(s) for Kube-State-Metrics' Custom Resource State API.
- Benchmark(s) for Kube-State-Metrics' Custom Resource State API.
- E2E tests covering the controller's basic functionality.
-
s/CRSM/CRDMetrics
. - Draft out a KEP.
-
s/CRDMetrics/ResourceStateMetrics
. - Make
ResourceMetricsMonitor
namespaced-scope. This allows for:- per-namespace configuration (separate configurations between teams), and,
- garbage collection (without
finalizers
), since currently the namespace-scoped deployment manages its cluster-scoped resources.
- Meta-metrics for metric generation failures.
- Dynamic admission control for
ResourceMetricsMonitor
CRD.