153 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			153 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Go
		
	
	
	
/*
 | 
						|
Copyright 2022 The Karmada Authors.
 | 
						|
 | 
						|
Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
you may not use this file except in compliance with the License.
 | 
						|
You may obtain a copy of the License at
 | 
						|
 | 
						|
    http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
 | 
						|
Unless required by applicable law or agreed to in writing, software
 | 
						|
distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
See the License for the specific language governing permissions and
 | 
						|
limitations under the License.
 | 
						|
*/
 | 
						|
 | 
						|
package metrics
 | 
						|
 | 
						|
import (
 | 
						|
	"time"
 | 
						|
 | 
						|
	"github.com/prometheus/client_golang/prometheus"
 | 
						|
 | 
						|
	"github.com/karmada-io/karmada/pkg/apis/cluster/v1alpha1"
 | 
						|
	"github.com/karmada-io/karmada/pkg/util"
 | 
						|
	utilmetrics "github.com/karmada-io/karmada/pkg/util/metrics"
 | 
						|
)
 | 
						|
 | 
						|
const (
 | 
						|
	clusterReadyMetricsName              = "cluster_ready_state"
 | 
						|
	clusterTotalNodeNumberMetricsName    = "cluster_node_number"
 | 
						|
	clusterReadyNodeNumberMetricsName    = "cluster_ready_node_number"
 | 
						|
	clusterMemoryAllocatableMetricsName  = "cluster_memory_allocatable_bytes"
 | 
						|
	clusterCPUAllocatableMetricsName     = "cluster_cpu_allocatable_number"
 | 
						|
	clusterPodAllocatableMetricsName     = "cluster_pod_allocatable_number"
 | 
						|
	clusterMemoryAllocatedMetricsName    = "cluster_memory_allocated_bytes"
 | 
						|
	clusterCPUAllocatedMetricsName       = "cluster_cpu_allocated_number"
 | 
						|
	clusterPodAllocatedMetricsName       = "cluster_pod_allocated_number"
 | 
						|
	clusterSyncStatusDurationMetricsName = "cluster_sync_status_duration_seconds"
 | 
						|
)
 | 
						|
 | 
						|
var (
 | 
						|
	// clusterReadyGauge reports if the cluster is ready.
 | 
						|
	clusterReadyGauge = prometheus.NewGaugeVec(prometheus.GaugeOpts{
 | 
						|
		Name: clusterReadyMetricsName,
 | 
						|
		Help: "State of the cluster(1 if ready, 0 otherwise).",
 | 
						|
	}, []string{"cluster_name"})
 | 
						|
 | 
						|
	// clusterTotalNodeNumberGauge reports the number of nodes in the given cluster.
 | 
						|
	clusterTotalNodeNumberGauge = prometheus.NewGaugeVec(prometheus.GaugeOpts{
 | 
						|
		Name: clusterTotalNodeNumberMetricsName,
 | 
						|
		Help: "Number of nodes in the cluster.",
 | 
						|
	}, []string{"cluster_name"})
 | 
						|
 | 
						|
	// clusterReadyNodeNumberGauge reports the number of ready nodes in the given cluster.
 | 
						|
	clusterReadyNodeNumberGauge = prometheus.NewGaugeVec(prometheus.GaugeOpts{
 | 
						|
		Name: clusterReadyNodeNumberMetricsName,
 | 
						|
		Help: "Number of ready nodes in the cluster.",
 | 
						|
	}, []string{"cluster_name"})
 | 
						|
 | 
						|
	// clusterMemoryAllocatableGauge reports the allocatable memory in the given cluster.
 | 
						|
	clusterMemoryAllocatableGauge = prometheus.NewGaugeVec(prometheus.GaugeOpts{
 | 
						|
		Name: clusterMemoryAllocatableMetricsName,
 | 
						|
		Help: "Allocatable cluster memory resource in bytes.",
 | 
						|
	}, []string{"cluster_name"})
 | 
						|
 | 
						|
	// clusterCPUAllocatableGauge reports the allocatable CPU in the given cluster.
 | 
						|
	clusterCPUAllocatableGauge = prometheus.NewGaugeVec(prometheus.GaugeOpts{
 | 
						|
		Name: clusterCPUAllocatableMetricsName,
 | 
						|
		Help: "Number of allocatable CPU in the cluster.",
 | 
						|
	}, []string{"cluster_name"})
 | 
						|
 | 
						|
	// clusterPodAllocatableGauge reports the allocatable Pod number in the given cluster.
 | 
						|
	clusterPodAllocatableGauge = prometheus.NewGaugeVec(prometheus.GaugeOpts{
 | 
						|
		Name: clusterPodAllocatableMetricsName,
 | 
						|
		Help: "Number of allocatable pods in the cluster.",
 | 
						|
	}, []string{"cluster_name"})
 | 
						|
 | 
						|
	// clusterMemoryAllocatedGauge reports the allocated memory in the given cluster.
 | 
						|
	clusterMemoryAllocatedGauge = prometheus.NewGaugeVec(prometheus.GaugeOpts{
 | 
						|
		Name: clusterMemoryAllocatedMetricsName,
 | 
						|
		Help: "Allocated cluster memory resource in bytes.",
 | 
						|
	}, []string{"cluster_name"})
 | 
						|
 | 
						|
	// clusterCPUAllocatedGauge reports the allocated CPU in the given cluster.
 | 
						|
	clusterCPUAllocatedGauge = prometheus.NewGaugeVec(prometheus.GaugeOpts{
 | 
						|
		Name: clusterCPUAllocatedMetricsName,
 | 
						|
		Help: "Number of allocated CPU in the cluster.",
 | 
						|
	}, []string{"cluster_name"})
 | 
						|
 | 
						|
	// clusterPodAllocatedGauge reports the allocated Pod number in the given cluster.
 | 
						|
	clusterPodAllocatedGauge = prometheus.NewGaugeVec(prometheus.GaugeOpts{
 | 
						|
		Name: clusterPodAllocatedMetricsName,
 | 
						|
		Help: "Number of allocated pods in the cluster.",
 | 
						|
	}, []string{"cluster_name"})
 | 
						|
 | 
						|
	// clusterSyncStatusDuration reports the duration of the given cluster syncing status.
 | 
						|
	clusterSyncStatusDuration = prometheus.NewHistogramVec(prometheus.HistogramOpts{
 | 
						|
		Name: clusterSyncStatusDurationMetricsName,
 | 
						|
		Help: "Duration in seconds for syncing the status of the cluster once.",
 | 
						|
	}, []string{"cluster_name"})
 | 
						|
)
 | 
						|
 | 
						|
// RecordClusterStatus records the status of the given cluster.
 | 
						|
func RecordClusterStatus(cluster *v1alpha1.Cluster) {
 | 
						|
	clusterReadyGauge.WithLabelValues(cluster.Name).Set(func() float64 {
 | 
						|
		if util.IsClusterReady(&cluster.Status) {
 | 
						|
			return 1
 | 
						|
		}
 | 
						|
		return 0
 | 
						|
	}())
 | 
						|
 | 
						|
	if cluster.Status.NodeSummary != nil {
 | 
						|
		clusterTotalNodeNumberGauge.WithLabelValues(cluster.Name).Set(float64(cluster.Status.NodeSummary.TotalNum))
 | 
						|
		clusterReadyNodeNumberGauge.WithLabelValues(cluster.Name).Set(float64(cluster.Status.NodeSummary.ReadyNum))
 | 
						|
	}
 | 
						|
 | 
						|
	if cluster.Status.ResourceSummary != nil {
 | 
						|
		if cluster.Status.ResourceSummary.Allocatable != nil {
 | 
						|
			clusterMemoryAllocatableGauge.WithLabelValues(cluster.Name).Set(cluster.Status.ResourceSummary.Allocatable.Memory().AsApproximateFloat64())
 | 
						|
			clusterCPUAllocatableGauge.WithLabelValues(cluster.Name).Set(cluster.Status.ResourceSummary.Allocatable.Cpu().AsApproximateFloat64())
 | 
						|
			clusterPodAllocatableGauge.WithLabelValues(cluster.Name).Set(cluster.Status.ResourceSummary.Allocatable.Pods().AsApproximateFloat64())
 | 
						|
		}
 | 
						|
 | 
						|
		if cluster.Status.ResourceSummary.Allocated != nil {
 | 
						|
			clusterMemoryAllocatedGauge.WithLabelValues(cluster.Name).Set(cluster.Status.ResourceSummary.Allocated.Memory().AsApproximateFloat64())
 | 
						|
			clusterCPUAllocatedGauge.WithLabelValues(cluster.Name).Set(cluster.Status.ResourceSummary.Allocated.Cpu().AsApproximateFloat64())
 | 
						|
			clusterPodAllocatedGauge.WithLabelValues(cluster.Name).Set(cluster.Status.ResourceSummary.Allocated.Pods().AsApproximateFloat64())
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// RecordClusterSyncStatusDuration records the duration of the given cluster syncing status
 | 
						|
func RecordClusterSyncStatusDuration(cluster *v1alpha1.Cluster, startTime time.Time) {
 | 
						|
	clusterSyncStatusDuration.WithLabelValues(cluster.Name).Observe(utilmetrics.DurationInSeconds(startTime))
 | 
						|
}
 | 
						|
 | 
						|
// ClusterCollectors returns the collectors about clusters.
 | 
						|
func ClusterCollectors() []prometheus.Collector {
 | 
						|
	return []prometheus.Collector{
 | 
						|
		clusterReadyGauge,
 | 
						|
		clusterTotalNodeNumberGauge,
 | 
						|
		clusterReadyNodeNumberGauge,
 | 
						|
		clusterMemoryAllocatableGauge,
 | 
						|
		clusterCPUAllocatableGauge,
 | 
						|
		clusterPodAllocatableGauge,
 | 
						|
		clusterMemoryAllocatedGauge,
 | 
						|
		clusterCPUAllocatedGauge,
 | 
						|
		clusterPodAllocatedGauge,
 | 
						|
		clusterSyncStatusDuration,
 | 
						|
	}
 | 
						|
}
 |