-
Couldn't load subscription status.
- Fork 2.1k
Description
What would you like to be added:
As a developer, I would like the kube-state-metrics Custom Resource configuration to be automatically generated from the API code.
Thanks to @sbueringer and @fabriziopandini for helping in driving this efforts 👍
Why is this needed:
kube-state-metrics requires a configuration file for Custom Resources which could grow to a very large file and may be hard to maintain over long-term together with changing Custom Resource definitions.
Instead of writing the configuration file manually it would be awesome if the configuration could get generated from the code where the custom resource gets defined instead.
Describe the solution you'd like
Prior art:
Kubebuilder makes use of a tool called controller-gen to generate the yaml's for e.g. Custom Resource definitions from code.
To do that it makes heavy use of markers inside the go code, which are comments in the form of // +foo:bar:key1=value1,key2=value2.
Similar to controller-gen, kube-state-metrics could provide an additional tool to generate the custom resource metrics configuration file from pre-defined markers at the go code level.
Additional context
We already thought about adding a tool like this at the Cluster API project, but we think it would be a better fit for the kube-state-metrics project, as it could help authors of any custom resource and is not specific to Cluster API.
We also have an idea how the markers / design could look like, which builds on top of the currently manually written configuration in Cluster API: kubernetes-sigs/cluster-api#7158 (comment) .
I could also migrate the first implementation design idea over to this issue or however it would be decided to proceed.
If the maintainers of kube-state-metrics also think that the described idea would be worth to implement: I'd be of course happy to volunteer to help or contribute for this efforts.
Small example:
// +Metrics:namePrefix=capi_cluster
// +Metrics:labelFromPath:name=name,JSONPath=".metadata.name"
// +Metrics:labelFromPath:name=namespace,JSONPath=".metadata.namespace"
// +Metrics:labelFromPath:name=uid,JSONPath=".metadata.uid"
type Cluster struct {
metav1.ObjectMeta `json:"metadata,omitempty"`
...
Spec ClusterSpec `json:"spec"`
}
type ClusterSpec struct {
// +Metrics:gauge:name="spec_paused",nilIsZero=true,help="Whether the cluster is paused and any of its resources will not be processed by the controllers."
Paused bool `json:"paused,omitempty"`
}Could result in the following configuration file
kind: CustomResourceStateMetrics
spec:
resources:
- groupVersionKind:
group: cluster.x-k8s.io
kind: Cluster
version: v1beta1
labelsFromPath:
name:
- metadata
- name
namespace:
- metadata
- namespace
uid:
- metadata
- uid
metricNamePrefix: capi_cluster
metrics:
- name: spec_paused
help: Whether the cluster is paused and any of its resources will not be processed by the controllers.
each:
gauge:
nilIsZero: true
path:
- spec
- paused
type: Gauge