package metrics

import (
	"sync"

	"github.com/prometheus/client_golang/prometheus"
	"github.com/tidbcloud/devops/pkg/infra/metrics"
	k8smetrics "k8s.io/client-go/tools/metrics"
)

const (
	namespace         = "jump_gateway"
	proxySubsystem    = "proxy"
	clientGoSubsystem = "k8s_client_go"
)

var (
	registerMetricsOnce sync.Once

	Gin = metrics.Gin(namespace)
)

func RegisterMetrics() {
	registerMetricsOnce.Do(func() {
		prometheus.MustRegister(
			// Gin
			Gin.ReqDur,
			Gin.RespSize,
			// Proxy
			Proxy.RequestsTotal,
			Proxy.RequestDuration,
			// Client go
			ClientGo.TransportCacheEntries,
			ClientGo.TransportCreateCallsTotal,
			ClientGo.RequestLatency,
			ClientGo.RateLimiterLatency,
			ClientGo.RequestResultTotal,
		)

		k8smetrics.Register(k8smetrics.RegisterOpts{
			TransportCacheEntries: transportCacheEntriesAdapter{},
			TransportCreateCalls:  transportCreateCallsAdapter{},
			RequestLatency:        latencyAdapter{metric: ClientGo.RequestLatency},
			RateLimiterLatency:    latencyAdapter{metric: ClientGo.RateLimiterLatency},
			RequestResult:         requestResultAdapter{},
		})
	})
}
