package metrics

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

const (
	DataflowNamespace = "dataflow"
)

const (
	NextGen = "nextgen"

	ResultLabel       = "result"
	StatusLabel       = "status"
	ClusterIDLabel    = "cluster_id"
	ClusterNameLabel  = "cluster_name"
	ProviderTypeLabel = "provider_type"
	ChangefeedIDLabel = "changefeed_id"
	MessageLabel      = "message"
	FunctionLabel     = "function"
	HttpMethodLabel   = "http_method"
	CodeLabel         = "code"
	ErrTypeLabel      = "err_type"
	SharedPoolIDLabel = "shared_pool_id"
)

// metric for changefeed
var (
	ChangefeedCreateResultCounter = prometheus.NewCounterVec(
		prometheus.CounterOpts{
			Namespace: DataflowNamespace,
			Subsystem: "ticdc",
			Name:      "changefeed_create_result",
			Help:      "count of changefeed create result.",
		}, []string{ClusterIDLabel, ClusterNameLabel, ChangefeedIDLabel, ProviderTypeLabel, ResultLabel, MessageLabel, ErrTypeLabel})

	ChangefeedStatusFailedCounter = prometheus.NewCounterVec(
		prometheus.CounterOpts{
			Namespace: DataflowNamespace,
			Subsystem: "ticdc",
			Name:      "changefeed_status_failed",
			Help:      "count of changefeed failed status.",
		}, []string{ClusterIDLabel, ClusterNameLabel, ChangefeedIDLabel, ProviderTypeLabel, StatusLabel, MessageLabel})

	SinkEndpointUsedAfterResourcePoolDeletionCounter = prometheus.NewCounterVec(
		prometheus.CounterOpts{
			Namespace: DataflowNamespace,
			Subsystem: "sink_endpoint",
			Name:      "used_after_resource_pool_deletion",
			Help:      "count of sink endpoints still referenced after their resource pool was deleted.",
		}, []string{SharedPoolIDLabel})
)

var (
	HttpErrorResultCounter = prometheus.NewCounterVec(
		prometheus.CounterOpts{
			Namespace: DataflowNamespace,
			Subsystem: "http",
			Name:      "request_error",
			Help:      "count of http request error",
		}, []string{FunctionLabel, HttpMethodLabel, CodeLabel})
)

func RegisterMetrics() {
	prometheus.MustRegister(ChangefeedCreateResultCounter)
	prometheus.MustRegister(ChangefeedStatusFailedCounter)
	prometheus.MustRegister(SinkEndpointUsedAfterResourcePoolDeletionCounter)
	prometheus.MustRegister(HttpRequestDuration)
	prometheus.MustRegister(DownstreamRequestDuration)
	prometheus.MustRegister(ChangefeedCounter)
	prometheus.MustRegister(GoroutineCounter)
}
