karmada/pkg/metrics/cluster.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,
}
}