package metrics

import (
	"github.com/prometheus/client_golang/prometheus"
	"sigs.k8s.io/controller-runtime/pkg/metrics"
)

var (
	RunnerCounter = prometheus.NewCounterVec(
		prometheus.CounterOpts{
			Namespace: "tidb_worker",
			Subsystem: "scaler",
			Name:      "runner_counter",
			Help:      "Total number of runner created",
		},
		[]string{"type"},
	)

	CurrentTaskCounter = prometheus.NewGaugeVec(
		prometheus.GaugeOpts{
			Namespace: "tidb_worker",
			Subsystem: "scaler",
			Name:      "current_task_counter",
			Help:      "Current number of tasks in each state",
		},
		[]string{"type", "state"},
	)

	taskDurationBucket = prometheus.ExponentialBuckets(30, 2, 8) //nolint:mnd // 30s to 2h

	TaskCompleteDuration = prometheus.NewHistogramVec(
		prometheus.HistogramOpts{
			Namespace: "tidb_worker",
			Subsystem: "scaler",
			Name:      "task_complete_duration_second",
			Help:      "How long does it take for a task to complete from registration",
			Buckets:   taskDurationBucket,
		},
		[]string{"type"},
	)
	TaskQueueDuration = prometheus.NewHistogramVec(
		prometheus.HistogramOpts{
			Namespace: "tidb_worker",
			Subsystem: "scaler",
			Name:      "task_queue_duration_second",
			Help:      "How long does task stay in the queue before being picked up by a runner",
			Buckets:   taskDurationBucket,
		},
		[]string{"type"},
	)
)

func init() {
	metrics.Registry.MustRegister(RunnerCounter)
	metrics.Registry.MustRegister(CurrentTaskCounter)
	metrics.Registry.MustRegister(TaskCompleteDuration)
	metrics.Registry.MustRegister(TaskQueueDuration)
}
