learning_go/rbd_exporter/metrics/metrics.go
2025-12-23 06:49:59 +03:00

79 lines
1.8 KiB
Go

package metrics
import (
"rbd_exporter/rbdfactory"
"rbd_exporter/mytypes"
"rbd_exporter/logger"
"time"
"github.com/prometheus/client_golang/prometheus"
)
func GetMetrics(cephConn mytypes.CephConnector) {
metrics := InitMetrics()
prometheus.MustRegister(
metrics.Total_rbd_requested_size_per_pool,
)
ticker := time.NewTicker(2 * time.Second)
defer ticker.Stop()
for range ticker.C {
var result []mytypes.Pool = []mytypes.Pool{}
poolList, err := cephConn.ListPools()
if err != nil {
logger.Logger.Error("Cannot get list of pools")
// do not exit but continue checking
continue
}
for _, v := range poolList {
x, _ := rbdfactory.PoolFactory(cephConn, v)
result = append(result, x)
}
metrics.Total_rbd_requested_size_per_pool.Reset()
for _,v := range result {
if !v.HasRBD {continue}
FillMetrics(v,metrics)
}
logger.Logger.Debug("====================")
// fmt.Println(result)
}
}
func InitMetrics() *mytypes.Metrics {
m := &mytypes.Metrics{
Total_rbd_requested_size_per_pool: prometheus.NewGaugeVec(
prometheus.GaugeOpts{
Name: "total_rbd_requested_size_per_pool",
Help: "total size of all requested RBDs in a specific pool",
},
[]string{"poolname"},
),
// total_rbd_requested_size: prometheus.NewGauge(
// prometheus.GaugeOpts{
// Name: "total_rbd_requested_size",
// Help: "total size of all RBDs in the cluster",
// },
// ),
}
return m
}
func FillMetrics(pool mytypes.Pool,metrics *mytypes.Metrics) {
var totalSizePerPool uint64 = 0
logger.Logger.Debugf("Processing pool %s",pool.Name)
for _,v := range pool.RBDlist {
totalSizePerPool += uint64(v.GetSize())
}
logger.Logger.Debugf("Total size of RBDs in pool %s is %d",pool.Name,totalSizePerPool)
metrics.Total_rbd_requested_size_per_pool.WithLabelValues(pool.Name,
).Set(
float64(totalSizePerPool))
}