package metrics import ( "strconv" "time" "git.frostfs.info/TrueCloudLab/frostfs-observability/metrics" "github.com/prometheus/client_golang/prometheus" ) type BlobobvnizcaMetrics interface { SetBlobobvnizcaTreeMode(shardID, path string, readOnly bool) CloseBlobobvnizcaTree(shardID, path string) BlobobvnizcaTreeMethodDuration(shardID, path string, method string, d time.Duration, success bool, withStorageID NullBool) AddBlobobvnizcaTreePut(shardID, path string, size int) AddBlobobvnizcaTreeGet(shardID, path string, size int) AddOpenBlobovniczaSize(shardID, path string, size uint64) SubOpenBlobovniczaSize(shardID, path string, size uint64) IncOpenBlobovniczaCount(shardID, path string) DecOpenBlobovniczaCount(shardID, path string) } type blobovnicza struct { treeMode *shardIDPathModeValue treeReqDuration *prometheus.HistogramVec treePut *prometheus.CounterVec treeGet *prometheus.CounterVec treeOpenSize *prometheus.GaugeVec treeOpenCounter *prometheus.GaugeVec } func newBlobovnicza() *blobovnicza { return &blobovnicza{ treeMode: newShardIDPathMode(blobovniczaTreeSubSystem, "mode", "Blobovnicza tree mode"), treeReqDuration: metrics.NewHistogramVec(prometheus.HistogramOpts{ Namespace: namespace, Subsystem: blobovniczaTreeSubSystem, Name: "request_duration_seconds", Help: "Accumulated Blobovnicza tree request process duration", }, []string{shardIDLabel, pathLabel, successLabel, methodLabel, withStorageIDLabel}), treePut: metrics.NewCounterVec(prometheus.CounterOpts{ Namespace: namespace, Subsystem: blobovniczaTreeSubSystem, Name: "put_bytes", Help: "Accumulated payload size written to Blobovnicza tree", }, []string{shardIDLabel, pathLabel}), treeGet: metrics.NewCounterVec(prometheus.CounterOpts{ Namespace: namespace, Subsystem: blobovniczaTreeSubSystem, Name: "get_bytes", Help: "Accumulated payload size read from Blobovnicza tree", }, []string{shardIDLabel, pathLabel}), treeOpenSize: metrics.NewGaugeVec(prometheus.GaugeOpts{ Namespace: namespace, Subsystem: blobovniczaTreeSubSystem, Name: "open_blobovnicza_size_bytes", Help: "Size of opened blobovniczas of Blobovnicza tree", }, []string{shardIDLabel, pathLabel}), treeOpenCounter: metrics.NewGaugeVec(prometheus.GaugeOpts{ Namespace: namespace, Subsystem: blobovniczaTreeSubSystem, Name: "open_blobovnicza_count", Help: "Count of opened blobovniczas of Blobovnicza tree", }, []string{shardIDLabel, pathLabel}), } } func (b *blobovnicza) SetBlobobvnizcaTreeMode(shardID, path string, readOnly bool) { b.treeMode.SetMode(shardID, path, modeFromBool(readOnly)) } func (b *blobovnicza) CloseBlobobvnizcaTree(shardID, path string) { b.treeMode.SetMode(shardID, path, closedMode) b.treeReqDuration.DeletePartialMatch(prometheus.Labels{ shardIDLabel: shardID, pathLabel: path, }) b.treeGet.DeletePartialMatch(prometheus.Labels{ shardIDLabel: shardID, pathLabel: path, }) b.treePut.DeletePartialMatch(prometheus.Labels{ shardIDLabel: shardID, pathLabel: path, }) } func (b *blobovnicza) BlobobvnizcaTreeMethodDuration(shardID, path string, method string, d time.Duration, success bool, withStorageID NullBool) { b.treeReqDuration.With(prometheus.Labels{ shardIDLabel: shardID, pathLabel: path, successLabel: strconv.FormatBool(success), methodLabel: method, withStorageIDLabel: withStorageID.String(), }).Observe(d.Seconds()) } func (b *blobovnicza) AddBlobobvnizcaTreePut(shardID, path string, size int) { b.treePut.With(prometheus.Labels{ shardIDLabel: shardID, pathLabel: path, }).Add(float64(size)) } func (b *blobovnicza) AddBlobobvnizcaTreeGet(shardID, path string, size int) { b.treeGet.With(prometheus.Labels{ shardIDLabel: shardID, pathLabel: path, }).Add(float64(size)) } func (b *blobovnicza) AddOpenBlobovniczaSize(shardID, path string, size uint64) { b.treeOpenSize.With(prometheus.Labels{ shardIDLabel: shardID, pathLabel: path, }).Add(float64(size)) } func (b *blobovnicza) SubOpenBlobovniczaSize(shardID, path string, size uint64) { b.treeOpenSize.With(prometheus.Labels{ shardIDLabel: shardID, pathLabel: path, }).Sub(float64(size)) } func (b *blobovnicza) IncOpenBlobovniczaCount(shardID, path string) { b.treeOpenCounter.With(prometheus.Labels{ shardIDLabel: shardID, pathLabel: path, }).Inc() } func (b *blobovnicza) DecOpenBlobovniczaCount(shardID, path string) { b.treeOpenCounter.With(prometheus.Labels{ shardIDLabel: shardID, pathLabel: path, }).Dec() }