package metrics import ( "fmt" "time" "github.com/prometheus/client_golang/prometheus" ) const ( gcSubsystem = "garbage_collector" gcShardID = "shard_id" gcSuccess = "success" gcStatus = "status" gcDeleted = "deleted" gcFailed = "failed_to_delete" gcObjectType = "object_type" ) type GCMetrics interface { AddRunDuration(shardID string, d time.Duration, success bool) AddDeletedCount(shardID string, deleted, failed uint64) AddExpiredObjectCollectionDuration(shardID string, d time.Duration, success bool, objectType string) AddInhumedObjectCount(shardID string, count uint64, objectType string) } type gcMetrics struct { runDuration metric[*prometheus.CounterVec] deletedCounter metric[*prometheus.CounterVec] expCollectDuration metric[*prometheus.CounterVec] inhumedCounter metric[*prometheus.CounterVec] } func (m *gcMetrics) register() { mustRegister(m.runDuration) mustRegister(m.deletedCounter) mustRegister(m.expCollectDuration) mustRegister(m.inhumedCounter) } func newGCMetrics() *gcMetrics { return &gcMetrics{ runDuration: newCounterVec(prometheus.CounterOpts{ Namespace: namespace, Subsystem: gcSubsystem, Name: "delete_duration_seconds", Help: "The total time of GC runs to delete objects from disk", }, []string{gcShardID, gcSuccess}), deletedCounter: newCounterVec(prometheus.CounterOpts{ Namespace: namespace, Subsystem: gcSubsystem, Name: "deleted_objects_count", Help: "Total count of objects GC deleted or failed to delete from disk", }, []string{gcShardID, gcStatus}), expCollectDuration: newCounterVec(prometheus.CounterOpts{ Namespace: namespace, Subsystem: gcSubsystem, Name: "marking_duration_seconds", Help: "The total time of GC runs to mark expired objects as removed", }, []string{gcShardID, gcSuccess, gcObjectType}), inhumedCounter: newCounterVec(prometheus.CounterOpts{ Namespace: namespace, Subsystem: gcSubsystem, Name: "marked_for_removal_objects_count", Help: "Total count of expired objects GC marked to remove", }, []string{gcShardID, gcObjectType}), } } func (m *gcMetrics) AddRunDuration(shardID string, d time.Duration, success bool) { m.runDuration.value.With(prometheus.Labels{ gcShardID: shardID, gcSuccess: fmt.Sprintf("%v", success), }).Add(d.Seconds()) } func (m *gcMetrics) AddDeletedCount(shardID string, deleted, failed uint64) { m.deletedCounter.value.With( prometheus.Labels{ gcShardID: shardID, gcStatus: gcDeleted, }).Add(float64(deleted)) m.deletedCounter.value.With( prometheus.Labels{ gcShardID: shardID, gcStatus: gcFailed, }).Add(float64(failed)) } func (m *gcMetrics) AddExpiredObjectCollectionDuration(shardID string, d time.Duration, success bool, objectType string) { m.expCollectDuration.value.With(prometheus.Labels{ gcShardID: shardID, gcSuccess: fmt.Sprintf("%v", success), gcObjectType: objectType, }).Add(d.Seconds()) } func (m *gcMetrics) AddInhumedObjectCount(shardID string, count uint64, objectType string) { m.inhumedCounter.value.With( prometheus.Labels{ gcShardID: shardID, gcObjectType: objectType, }).Add(float64(count)) }