package slprober

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

var (
	ProbeDuration = prometheus.NewHistogramVec(
		prometheus.HistogramOpts{
			Namespace: "reporter",
			Subsystem: "service_level",
			Name:      "probe_seconds",
			Help:      "Service level probe operation duration",
			Buckets:   prometheus.ExponentialBuckets(0.01, 2, 15), // 10ms ~ 5min
		}, []string{"status"})

	// FIXME: When user creates hundreds of thousands of clusters and then destroys them, the in-memory metrics label
	// will not be cleared which causes memory leak.
	ProbeClusterCounter = prometheus.NewCounterVec(
		prometheus.CounterOpts{
			Namespace: "reporter",
			Subsystem: "service_level",
			Name:      "probe_cluster_counter",
			Help:      "Service level probe operations count for each cluster",
		}, []string{"status", "ns", "tenant_id", "cluster_id"})

	ProbeClusterDuration = prometheus.NewHistogramVec(
		prometheus.HistogramOpts{
			Namespace: "reporter",
			Subsystem: "service_level",
			Name:      "probe_cluster_seconds",
			Help:      "Service level probe operations duration for each cluster",
			Buckets:   prometheus.ExponentialBuckets(0.01, 2, 15), // 10ms ~ 5min
		}, []string{"status", "cluster_id"})

	ProbeClusterSuccessCounter = prometheus.NewCounterVec(
		prometheus.CounterOpts{
			Namespace: "reporter",
			Subsystem: "service_level",
			Name:      "probe_cluster_respond_counter",
			Help:      "Successful service level probe operations count for each cluster. Also includes detailed server responses.",
		}, []string{"cluster_id", "respond_version"})
)

func RegisterMetrics() {
	prometheus.MustRegister(
		ProbeDuration,
		ProbeClusterCounter,
		ProbeClusterDuration,
		ProbeClusterSuccessCounter)
}
