Expose custom CRD fields as prometheus metrics
Disclaimer: this is my very first kubernetes focused project, so be gentle please :)
This is an initial proposal to expose Kubernetes' Custom Resource Definitions (CRD) as Prometheus metrics endpoints. The aim is to monitore and alert on whatever an Custom Resource (CR) exposes, by using a simple property -> metric mapping model.
Supose we have the following Velero Schedule CR (incomplete for readability):
apiVersion: velero.io/v1
kind: Schedule
metadata:
name: shopping
namespace: megastore
spec:
schedule: 0 3 * * *
template:
includeClusterResources: true
includedNamespaces:
- webapp
- database
includedResources:
- deployments
- cronjobsIn order to expose metrics regarding includedNamespaces, one could define the following config:
customResourceDefinitions:
- apiVersion: velero.io/v1
kind: Schedule
inspect:
- included_namespaces: spec.template.includedNamespacesor maybe:
customResourceDefinitions:
- apiVersion: velero.io/v1
kind: Schedule
spec:
template:
includedNamespaces:
- webapp
- database
- non-existingWhich will generate the following prometheus metrics:
crd_exporter_velero_io_v1_included_namespaces_webapp{namespace="megastore", name="shopping"} 1
crd_exporter_velero_io_v1_included_namespaces_database{namespace="megastore" ,name="shopping"} 1
or maybe
crd_exporter_schedule_velero_io_included_namespaces_webapp{namespace="megastore", name="shopping", crd="schedule", api_group="velero.io", api_version="v1"} 1
crd_exporter_schedule_velero_included_namespaces_database{namespace="megastore", name="shopping", crd="schedule", api_group="velero.io", api_version="v1"} 1
or maybe
crd_exporter_schedule_velero_io{namespace="megastore", name="shopping", crd="schedule", api_group="velero.io", api_version="v1", path="spec.template.includedNamespace[0].webapp"} 1
crd_exporter_schedule_velero_io{namespace="megastore", name="shopping", crd="schedule", api_group="velero.io", api_version="v1", path="spec.template.includedNamespace[1].database"} 1
crd_exporter_schedule_velero_io{namespace="megastore", name="shopping", crd="schedule", api_group="velero.io", api_version="v1", path="spec.template.includedNamespace[2].non-existing"} 0