Add metrics of RunnerDeployment and HRA (#408)
* Add metrics of RunnerDeployment and HRA * Use kube-state-metrics-style label names
This commit is contained in:
		
							parent
							
								
									f6ab66c55b
								
							
						
					
					
						commit
						3a0332dfdc
					
				| 
						 | 
					@ -34,6 +34,7 @@ import (
 | 
				
			||||||
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
						metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/summerwind/actions-runner-controller/api/v1alpha1"
 | 
						"github.com/summerwind/actions-runner-controller/api/v1alpha1"
 | 
				
			||||||
 | 
						"github.com/summerwind/actions-runner-controller/controllers/metrics"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
| 
						 | 
					@ -73,6 +74,8 @@ func (r *HorizontalRunnerAutoscalerReconciler) Reconcile(req ctrl.Request) (ctrl
 | 
				
			||||||
		return ctrl.Result{}, nil
 | 
							return ctrl.Result{}, nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						metrics.SetHorizontalRunnerAutoscalerSpec(hra.ObjectMeta, hra.Spec)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var rd v1alpha1.RunnerDeployment
 | 
						var rd v1alpha1.RunnerDeployment
 | 
				
			||||||
	if err := r.Get(ctx, types.NamespacedName{
 | 
						if err := r.Get(ctx, types.NamespacedName{
 | 
				
			||||||
		Namespace: req.Namespace,
 | 
							Namespace: req.Namespace,
 | 
				
			||||||
| 
						 | 
					@ -145,6 +148,8 @@ func (r *HorizontalRunnerAutoscalerReconciler) Reconcile(req ctrl.Request) (ctrl
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if updated != nil {
 | 
						if updated != nil {
 | 
				
			||||||
 | 
							metrics.SetHorizontalRunnerAutoscalerStatus(updated.ObjectMeta, updated.Status)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if err := r.Status().Patch(ctx, updated, client.MergeFrom(&hra)); err != nil {
 | 
							if err := r.Status().Patch(ctx, updated, client.MergeFrom(&hra)); err != nil {
 | 
				
			||||||
			return ctrl.Result{}, fmt.Errorf("patching horizontalrunnerautoscaler status to add cache entry: %w", err)
 | 
								return ctrl.Result{}, fmt.Errorf("patching horizontalrunnerautoscaler status to add cache entry: %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,67 @@
 | 
				
			||||||
 | 
					package metrics
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"github.com/prometheus/client_golang/prometheus"
 | 
				
			||||||
 | 
						"github.com/summerwind/actions-runner-controller/api/v1alpha1"
 | 
				
			||||||
 | 
						metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						hraName      = "horizontalrunnerautoscaler"
 | 
				
			||||||
 | 
						hraNamespace = "namespace"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var (
 | 
				
			||||||
 | 
						horizontalRunnerAutoscalerMetrics = []prometheus.Collector{
 | 
				
			||||||
 | 
							horizontalRunnerAutoscalerMinReplicas,
 | 
				
			||||||
 | 
							horizontalRunnerAutoscalerMaxReplicas,
 | 
				
			||||||
 | 
							horizontalRunnerAutoscalerDesiredReplicas,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var (
 | 
				
			||||||
 | 
						horizontalRunnerAutoscalerMinReplicas = prometheus.NewGaugeVec(
 | 
				
			||||||
 | 
							prometheus.GaugeOpts{
 | 
				
			||||||
 | 
								Name: "horizontalrunnerautoscaler_spec_min_replicas",
 | 
				
			||||||
 | 
								Help: "minReplicas of HorizontalRunnerAutoscaler",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							[]string{hraName, hraNamespace},
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
						horizontalRunnerAutoscalerMaxReplicas = prometheus.NewGaugeVec(
 | 
				
			||||||
 | 
							prometheus.GaugeOpts{
 | 
				
			||||||
 | 
								Name: "horizontalrunnerautoscaler_spec_max_replicas",
 | 
				
			||||||
 | 
								Help: "maxReplicas of HorizontalRunnerAutoscaler",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							[]string{hraName, hraNamespace},
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
						horizontalRunnerAutoscalerDesiredReplicas = prometheus.NewGaugeVec(
 | 
				
			||||||
 | 
							prometheus.GaugeOpts{
 | 
				
			||||||
 | 
								Name: "horizontalrunnerautoscaler_status_desired_replicas",
 | 
				
			||||||
 | 
								Help: "desiredReplicas of HorizontalRunnerAutoscaler",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							[]string{hraName, hraNamespace},
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func SetHorizontalRunnerAutoscalerSpec(o metav1.ObjectMeta, spec v1alpha1.HorizontalRunnerAutoscalerSpec) {
 | 
				
			||||||
 | 
						labels := prometheus.Labels{
 | 
				
			||||||
 | 
							hraName:      o.Name,
 | 
				
			||||||
 | 
							hraNamespace: o.Namespace,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if spec.MaxReplicas != nil {
 | 
				
			||||||
 | 
							horizontalRunnerAutoscalerMaxReplicas.With(labels).Set(float64(*spec.MaxReplicas))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if spec.MinReplicas != nil {
 | 
				
			||||||
 | 
							horizontalRunnerAutoscalerMinReplicas.With(labels).Set(float64(*spec.MinReplicas))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func SetHorizontalRunnerAutoscalerStatus(o metav1.ObjectMeta, status v1alpha1.HorizontalRunnerAutoscalerStatus) {
 | 
				
			||||||
 | 
						labels := prometheus.Labels{
 | 
				
			||||||
 | 
							hraName:      o.Name,
 | 
				
			||||||
 | 
							hraNamespace: o.Namespace,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if status.DesiredReplicas != nil {
 | 
				
			||||||
 | 
							horizontalRunnerAutoscalerDesiredReplicas.With(labels).Set(float64(*status.DesiredReplicas))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,14 @@
 | 
				
			||||||
 | 
					// Package metrics provides the metrics of custom resources such as HRA.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// This depends on the metrics exporter of kubebuilder.
 | 
				
			||||||
 | 
					// See https://book.kubebuilder.io/reference/metrics.html for details.
 | 
				
			||||||
 | 
					package metrics
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"sigs.k8s.io/controller-runtime/pkg/metrics"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						metrics.Registry.MustRegister(runnerDeploymentMetrics...)
 | 
				
			||||||
 | 
						metrics.Registry.MustRegister(horizontalRunnerAutoscalerMetrics...)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,37 @@
 | 
				
			||||||
 | 
					package metrics
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"github.com/prometheus/client_golang/prometheus"
 | 
				
			||||||
 | 
						"github.com/summerwind/actions-runner-controller/api/v1alpha1"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						rdName      = "runnerdeployment"
 | 
				
			||||||
 | 
						rdNamespace = "namespace"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var (
 | 
				
			||||||
 | 
						runnerDeploymentMetrics = []prometheus.Collector{
 | 
				
			||||||
 | 
							runnerDeploymentReplicas,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var (
 | 
				
			||||||
 | 
						runnerDeploymentReplicas = prometheus.NewGaugeVec(
 | 
				
			||||||
 | 
							prometheus.GaugeOpts{
 | 
				
			||||||
 | 
								Name: "runnerdeployment_spec_replicas",
 | 
				
			||||||
 | 
								Help: "replicas of RunnerDeployment",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							[]string{rdName, rdNamespace},
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func SetRunnerDeployment(rd v1alpha1.RunnerDeployment) {
 | 
				
			||||||
 | 
						labels := prometheus.Labels{
 | 
				
			||||||
 | 
							rdName:      rd.Name,
 | 
				
			||||||
 | 
							rdNamespace: rd.Namespace,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if rd.Spec.Replicas != nil {
 | 
				
			||||||
 | 
							runnerDeploymentReplicas.With(labels).Set(float64(*rd.Spec.Replicas))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -38,6 +38,7 @@ import (
 | 
				
			||||||
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
						metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/summerwind/actions-runner-controller/api/v1alpha1"
 | 
						"github.com/summerwind/actions-runner-controller/api/v1alpha1"
 | 
				
			||||||
 | 
						"github.com/summerwind/actions-runner-controller/controllers/metrics"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
| 
						 | 
					@ -77,6 +78,8 @@ func (r *RunnerDeploymentReconciler) Reconcile(req ctrl.Request) (ctrl.Result, e
 | 
				
			||||||
		return ctrl.Result{}, nil
 | 
							return ctrl.Result{}, nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						metrics.SetRunnerDeployment(rd)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var myRunnerReplicaSetList v1alpha1.RunnerReplicaSetList
 | 
						var myRunnerReplicaSetList v1alpha1.RunnerReplicaSetList
 | 
				
			||||||
	if err := r.List(ctx, &myRunnerReplicaSetList, client.InNamespace(req.Namespace), client.MatchingFields{runnerSetOwnerKey: req.Name}); err != nil {
 | 
						if err := r.List(ctx, &myRunnerReplicaSetList, client.InNamespace(req.Namespace), client.MatchingFields{runnerSetOwnerKey: req.Name}); err != nil {
 | 
				
			||||||
		return ctrl.Result{}, err
 | 
							return ctrl.Result{}, err
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue