// Copyright (C) The Arvados Authors. All rights reserved.
//
// SPDX-License-Identifier: AGPL-3.0

package keepstore

import (
	"github.com/prometheus/client_golang/prometheus"
)

type volumeMetricsVecs struct {
	ioBytes     *prometheus.CounterVec
	errCounters *prometheus.CounterVec
	opsCounters *prometheus.CounterVec
}

func newVolumeMetricsVecs(reg *prometheus.Registry) *volumeMetricsVecs {
	m := &volumeMetricsVecs{}
	m.opsCounters = prometheus.NewCounterVec(
		prometheus.CounterOpts{
			Namespace: "arvados",
			Subsystem: "keepstore",
			Name:      "volume_operations",
			Help:      "Number of volume operations",
		},
		[]string{"device_id", "operation"},
	)
	reg.MustRegister(m.opsCounters)
	m.errCounters = prometheus.NewCounterVec(
		prometheus.CounterOpts{
			Namespace: "arvados",
			Subsystem: "keepstore",
			Name:      "volume_errors",
			Help:      "Number of volume errors",
		},
		[]string{"device_id", "error_type"},
	)
	reg.MustRegister(m.errCounters)
	m.ioBytes = prometheus.NewCounterVec(
		prometheus.CounterOpts{
			Namespace: "arvados",
			Subsystem: "keepstore",
			Name:      "volume_io_bytes",
			Help:      "Volume I/O traffic in bytes",
		},
		[]string{"device_id", "direction"},
	)
	reg.MustRegister(m.ioBytes)

	return m
}

func (vm *volumeMetricsVecs) getCounterVecsFor(lbls prometheus.Labels) (opsCV, errCV, ioCV *prometheus.CounterVec) {
	opsCV = vm.opsCounters.MustCurryWith(lbls)
	errCV = vm.errCounters.MustCurryWith(lbls)
	ioCV = vm.ioBytes.MustCurryWith(lbls)
	return
}