// Package metrics add by blacknc <blacknc@163.com> at 2023/03/03 11:45:36
package metrics

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

var (
	// Sql exec metrics
	SessionConnTotal      *prometheus.GaugeVec
	SessionCreateCounter  *prometheus.CounterVec
	SessionNotFound       prometheus.Counter
	SessionIdEmpty        *prometheus.CounterVec
	SessionConnChanged    *prometheus.CounterVec
	SessionRebuildCounter *prometheus.CounterVec
	SessionCacheCounter   *prometheus.CounterVec
	SessionCacheDuration  *prometheus.HistogramVec

	SqlExecCounter             *prometheus.CounterVec
	AccountIntergrationCounter *prometheus.CounterVec
	ClusterInfoCounter         *prometheus.CounterVec
	MeasureRequestCounter      *prometheus.CounterVec
	MeasureNetworkCounter      *prometheus.CounterVec
	BuildUserDBConnDuration    *prometheus.HistogramVec
	DatabaseConnDuration       *prometheus.HistogramVec
	GetUserMetaDuration        prometheus.Histogram
	GetUserAccountDuration     prometheus.Histogram
	SqlExecDuration            *prometheus.HistogramVec
	ExecSqlRequestDuration     *prometheus.HistogramVec
	PrepareStmtDuration        *prometheus.HistogramVec
	StmtExecuteDuration        *prometheus.HistogramVec
	ScanRowsDuration           prometheus.Histogram
	DBHubPoolCounter           *prometheus.GaugeVec
)

func sqlExecRegister(subsystem string) {

	SessionConnTotal = prometheus.NewGaugeVec(prometheus.GaugeOpts{
		Namespace: namespace,
		Subsystem: subsystem,
		Name:      "session_conn_total",
		Help:      "Total number of session_connect.",
	}, []string{"session"})

	SessionCreateCounter = prometheus.NewCounterVec(prometheus.CounterOpts{
		Namespace: namespace,
		Subsystem: subsystem,
		Name:      "session_create_counter",
		Help:      "Number of sessions created.",
	}, []string{"project", "cluster", "ok"})

	SessionNotFound = prometheus.NewCounter(prometheus.CounterOpts{
		Namespace: namespace,
		Subsystem: subsystem,
		Name:      "session_not_found",
		Help:      "Cumulative number of not found session.",
	})

	SessionIdEmpty = prometheus.NewCounterVec(prometheus.CounterOpts{
		Namespace: namespace,
		Subsystem: subsystem,
		Name:      "session_id_empty",
		Help:      "Cumulative number of empty session id.",
	}, nil)

	SqlExecCounter = prometheus.NewCounterVec(prometheus.CounterOpts{
		Namespace: namespace,
		Subsystem: subsystem,
		Name:      "sql_exec_counter",
		Help:      "Number of times sql is executed.",
	}, []string{"ok"})

	SessionConnChanged = prometheus.NewCounterVec(prometheus.CounterOpts{
		Namespace: namespace,
		Subsystem: subsystem,
		Name:      "session_conn_changed",
		Help:      "Cumulative number of session connection changed.",
	}, nil)

	SessionRebuildCounter = prometheus.NewCounterVec(prometheus.CounterOpts{
		Namespace: namespace,
		Subsystem: subsystem,
		Name:      "session_rebuild_counter",
		Help:      "Cumulative number of session rebuild.",
	}, []string{"ok"})

	SessionCacheCounter = prometheus.NewCounterVec(prometheus.CounterOpts{
		Namespace: namespace,
		Subsystem: subsystem,
		Name:      "session_cache_counter",
		Help:      "Cumulative number of session cache operation.",
	}, []string{"action", "ok"})

	SessionCacheDuration = prometheus.NewHistogramVec(prometheus.HistogramOpts{
		Namespace: namespace,
		Subsystem: subsystem,
		Name:      "session_cache_duration",
		Help:      "Session read/write milliseconds cost.",
	}, []string{"action", "ok"})

	AccountIntergrationCounter = prometheus.NewCounterVec(prometheus.CounterOpts{
		Namespace: namespace,
		Subsystem: subsystem,
		Name:      "account_intergration_counter",
		Help:      "Number of account intergration.",
	}, []string{"ok"})

	ClusterInfoCounter = prometheus.NewCounterVec(prometheus.CounterOpts{
		Namespace: namespace,
		Subsystem: subsystem,
		Name:      "cluster_info_counter",
		Help:      "Number of times cluster information was obtained.",
	}, []string{"project", "cluster", "ok"})

	BuildUserDBConnDuration = prometheus.NewHistogramVec(prometheus.HistogramOpts{
		Namespace: namespace,
		Subsystem: subsystem,
		Name:      "build_user_db_conn_duration",
		Help:      "Get endpoint latencies in second.",
		Buckets:   prometheus.ExponentialBuckets(0.001, 2, 20), // 1ms ~ 524s
	}, []string{"ok"})

	DatabaseConnDuration = prometheus.NewHistogramVec(prometheus.HistogramOpts{
		Namespace: namespace,
		Subsystem: subsystem,
		Name:      "database_conn_duration",
		Buckets:   prometheus.ExponentialBuckets(0.001, 2, 20), // 1ms ~ 524s
	}, []string{"ok"})

	PrepareStmtDuration = prometheus.NewHistogramVec(prometheus.HistogramOpts{
		Namespace: namespace,
		Subsystem: subsystem,
		Name:      "prepare_stmt_duration",
		Buckets:   prometheus.ExponentialBuckets(0.001, 2, 20), // 1ms ~ 524s
	}, []string{"ok"})

	StmtExecuteDuration = prometheus.NewHistogramVec(prometheus.HistogramOpts{
		Namespace: namespace,
		Subsystem: subsystem,
		Name:      "stmt_execute_duration",
		Buckets:   prometheus.ExponentialBuckets(0.001, 2, 20), // 1ms ~ 524s
	}, []string{"ok"})

	ScanRowsDuration = prometheus.NewHistogram(prometheus.HistogramOpts{
		Namespace: namespace,
		Subsystem: subsystem,
		Name:      "scan_rows_duration",
		Buckets:   prometheus.ExponentialBuckets(0.001, 2, 20), // 1ms ~ 524s
	})

	GetUserMetaDuration = prometheus.NewHistogram(prometheus.HistogramOpts{
		Namespace: namespace,
		Subsystem: subsystem,
		Name:      "get_user_meta_duration",
		Help:      "Get user cluster meta latencies in second.",
		Buckets:   prometheus.ExponentialBuckets(0.001, 2, 20), // 1ms ~ 524s
	})

	GetUserAccountDuration = prometheus.NewHistogram(prometheus.HistogramOpts{
		Namespace: namespace,
		Subsystem: subsystem,
		Name:      "get_user_account_duration",
		Help:      "Get user account latencies in second.",
		Buckets:   prometheus.ExponentialBuckets(0.001, 2, 20), // 1ms ~ 524s
	})

	SqlExecDuration = prometheus.NewHistogramVec(prometheus.HistogramOpts{
		Namespace: namespace,
		Subsystem: subsystem,
		Name:      "sql_exec_duration",
		Help:      "SQL execution latencies in second.",
		Buckets:   prometheus.ExponentialBuckets(0.001, 2, 20), // 1ms ~ 524s
	}, []string{"ok"})

	ExecSqlRequestDuration = prometheus.NewHistogramVec(prometheus.HistogramOpts{
		Namespace: namespace,
		Subsystem: subsystem,
		Name:      "exec_sql_request_duration",
		Buckets:   prometheus.ExponentialBuckets(0.001, 2, 20), // 1ms ~ 524s
	}, []string{"ok"})

	MeasureRequestCounter = prometheus.NewCounterVec(prometheus.CounterOpts{
		Namespace: namespace,
		Subsystem: subsystem,
		Name:      "measure_request_counter",
		Help:      "counter of request .",
	}, []string{"orgId", "appId", "endpoint", "appKey"})
	MeasureNetworkCounter = prometheus.NewCounterVec(prometheus.CounterOpts{
		Namespace: namespace,
		Subsystem: subsystem,
		Name:      "measure_network_counter",
		Help:      "network  usage.",
	}, []string{"orgId", "appId", "endpoint", "appKey"})

	DBHubPoolCounter = prometheus.NewGaugeVec(prometheus.GaugeOpts{
		Namespace: namespace,
		Subsystem: subsystem,
		Name:      "dbhubpool_counter",
	}, []string{"type"})

	prometheus.MustRegister(
		SessionConnTotal,
		SessionCreateCounter,
		SessionNotFound,
		SessionIdEmpty,
		SqlExecCounter,
		SessionConnChanged,
		SessionRebuildCounter,
		SessionCacheCounter,
		SessionCacheDuration,
		AccountIntergrationCounter,
		ClusterInfoCounter,
		BuildUserDBConnDuration,
		DatabaseConnDuration,
		GetUserMetaDuration,
		GetUserAccountDuration,
		SqlExecDuration,
		MeasureRequestCounter,
		MeasureNetworkCounter,
		PrepareStmtDuration,
		StmtExecuteDuration,
		ScanRowsDuration,
		ExecSqlRequestDuration,
		DBHubPoolCounter,
	)
}
