package metrics

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

	"github.com/tidbcloud/tidb-management-service/serverless-global-service/domain/constant"
)

var (
	ClusterInitializedFailedTotal = prometheus.NewCounter(prometheus.CounterOpts{
		Namespace: constant.MetricsNamespace,
		Subsystem: "cluster",
		Name:      "initialized_failed_total",
		Help:      "cluster initialized failed count",
	})

	ClusterInitializedTotalTime = prometheus.NewHistogram(prometheus.HistogramOpts{
		Namespace: constant.MetricsNamespace,
		Subsystem: "cluster",
		Name:      "initialized_cost_time_seconds",
		Help:      "cluster initialized cost time",
	})

	ClusterInitializedLongTime = prometheus.NewCounter(prometheus.CounterOpts{
		Namespace: constant.MetricsNamespace,
		Subsystem: "cluster",
		Name:      "initialized_cost_long_time",
		Help:      "regional request total time",
	})

	RequestListClusterCount = prometheus.NewCounter(prometheus.CounterOpts{
		Namespace: constant.MetricsNamespace,
		Subsystem: "cluster",
		Name:      "request_list_cluster_total",
		Help:      "query large cluster result",
	})

	RequestClusterResultCount = prometheus.NewCounter(prometheus.CounterOpts{
		Namespace: constant.MetricsNamespace,
		Subsystem: "cluster",
		Name:      "list_cluster_response_count_total",
		Help:      "query large cluster result",
	})

	LargeClusterQueryResultRequestCount = prometheus.NewCounter(prometheus.CounterOpts{
		Namespace: constant.MetricsNamespace,
		Subsystem: "cluster",
		Name:      "query_large_result_request_total",
		Help:      "query large cluster result",
	})

	ClusterQueryWithoutFilterCount = prometheus.NewCounter(prometheus.CounterOpts{
		Namespace: constant.MetricsNamespace,
		Subsystem: "cluster",
		Name:      "query_without_filter_total",
		Help:      "query large cluster result",
	})

	QueryPerRegionClusterCostTime = prometheus.NewHistogramVec(prometheus.HistogramOpts{
		Namespace: constant.MetricsNamespace,
		Subsystem: "cluster",
		Name:      "per_regional_query_seconds",
		Help:      "query per regional cluster total time",
	}, []string{"region"})

	QueryAllRegionClusterCostTime = prometheus.NewHistogram(prometheus.HistogramOpts{
		Namespace: constant.MetricsNamespace,
		Subsystem: "cluster",
		Name:      "regional_query_seconds",
		Help:      "query regional cluster total time",
	})

	QueryRegionFailedCount = prometheus.NewCounterVec(prometheus.CounterOpts{
		Namespace: constant.MetricsNamespace,
		Subsystem: "cluster",
		Name:      "query_regional_failed_total",
		Help:      "query regional failed count",
	}, []string{"region"})

	QueryRegionLongTimeCount = prometheus.NewCounter(prometheus.CounterOpts{
		Namespace: constant.MetricsNamespace,
		Subsystem: "cluster",
		Name:      "query_regional_long_time_total",
		Help:      "query regional long time count",
	})
)

func init() {
	prometheus.MustRegister(ClusterInitializedFailedTotal)
	prometheus.MustRegister(ClusterInitializedTotalTime)
	prometheus.MustRegister(ClusterInitializedLongTime)
	prometheus.MustRegister(LargeClusterQueryResultRequestCount)
	prometheus.MustRegister(ClusterQueryWithoutFilterCount)
	prometheus.MustRegister(RequestListClusterCount)
	prometheus.MustRegister(RequestClusterResultCount)
	prometheus.MustRegister(QueryPerRegionClusterCostTime)
	prometheus.MustRegister(QueryAllRegionClusterCostTime)
	prometheus.MustRegister(QueryRegionFailedCount)
	prometheus.MustRegister(QueryRegionLongTimeCount)
}
