package metrics import ( "fmt" "time" "git.frostfs.info/TrueCloudLab/frostfs-observability/metrics" "github.com/prometheus/client_golang/prometheus" ) const ( wcSubsystem = "writecache" wcShardID = "shard_id" wcSuccess = "success" wcStorage = "storage" wcMode = "mode" wcMethod = "method" wcOperation = "operation" ) type WriteCacheMetrics interface { AddMethodDuration(shardID string, method string, success bool, d time.Duration, storageType string) IncActualCount(shardID string, storageType string) DecActualCount(shardID string, storageType string) SetActualCount(shardID string, count uint64, storageType string) SetEstimateSize(shardID string, size uint64, storageType string) SetMode(shardID string, mode string) IncOperationCounter(shardID string, operation string, success NullBool, storageType string) Close(shardID string) } type writeCacheMetrics struct { methodDuration *prometheus.HistogramVec operationCounter *prometheus.CounterVec actualCount *prometheus.GaugeVec estimatedSize *prometheus.GaugeVec mode *shardIDModeValue } func newWriteCacheMetrics() *writeCacheMetrics { return &writeCacheMetrics{ methodDuration: metrics.NewHistogramVec(prometheus.HistogramOpts{ Namespace: namespace, Subsystem: wcSubsystem, Name: "request_duration_seconds", Help: "Writecache request process duration", }, []string{wcShardID, wcSuccess, wcStorage, wcMethod}), operationCounter: metrics.NewCounterVec(prometheus.CounterOpts{ Namespace: namespace, Subsystem: wcSubsystem, Name: "operations_total", Help: "The number of writecache operations processed", }, []string{wcShardID, wcStorage, wcSuccess, wcOperation}), actualCount: newWCGaugeVec("actual_objects_total", "Actual objects count in writecache", []string{wcShardID, wcStorage}), estimatedSize: newWCGaugeVec("estimated_size_bytes", "Estimated writecache size", []string{wcShardID, wcStorage}), mode: newShardIDMode(wcSubsystem, "mode_info", "Writecache mode value"), } } func (m *writeCacheMetrics) AddMethodDuration(shardID string, method string, success bool, d time.Duration, storageType string) { m.methodDuration.With( prometheus.Labels{ wcShardID: shardID, wcSuccess: fmt.Sprintf("%v", success), wcStorage: storageType, wcMethod: method, }, ).Observe(d.Seconds()) } func (m *writeCacheMetrics) IncActualCount(shardID string, storageType string) { m.actualCount.With(prometheus.Labels{ wcShardID: shardID, wcStorage: storageType, }).Inc() } func (m *writeCacheMetrics) DecActualCount(shardID string, storageType string) { m.actualCount.With(prometheus.Labels{ wcShardID: shardID, wcStorage: storageType, }).Dec() } func (m *writeCacheMetrics) SetActualCount(shardID string, count uint64, storageType string) { m.actualCount.With(prometheus.Labels{ wcShardID: shardID, wcStorage: storageType, }).Set(float64(count)) } func (m *writeCacheMetrics) SetEstimateSize(shardID string, size uint64, storageType string) { m.estimatedSize.With(prometheus.Labels{ wcShardID: shardID, wcStorage: storageType, }).Set(float64(size)) } func (m *writeCacheMetrics) SetMode(shardID string, mode string) { m.mode.SetMode(shardID, mode) } func (m *writeCacheMetrics) IncOperationCounter(shardID string, operation string, success NullBool, storageType string) { m.operationCounter.With(prometheus.Labels{ wcShardID: shardID, wcStorage: storageType, wcOperation: operation, wcSuccess: success.String(), }).Inc() } func (m *writeCacheMetrics) Close(shardID string) { m.mode.Delete(shardID) m.methodDuration.DeletePartialMatch(prometheus.Labels{wcShardID: shardID}) m.operationCounter.DeletePartialMatch(prometheus.Labels{wcShardID: shardID}) m.actualCount.DeletePartialMatch(prometheus.Labels{wcShardID: shardID}) m.estimatedSize.DeletePartialMatch(prometheus.Labels{wcShardID: shardID}) } func newWCGaugeVec(name, help string, labels []string) *prometheus.GaugeVec { return metrics.NewGaugeVec(prometheus.GaugeOpts{ Namespace: namespace, Subsystem: wcSubsystem, Name: name, Help: help, }, labels) }