package metrics import ( "net/http" "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/pool" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" ) const namespace = "frostfs_s3_gw" type StatisticScraper interface { Statistic() pool.Statistic } type GateMetrics struct { State *StateMetrics Pool poolMetricsCollector Billing *billingMetrics Stats *APIStatMetrics } func NewGateMetrics(scraper StatisticScraper) *GateMetrics { stateMetric := newStateMetrics() stateMetric.register() poolMetric := newPoolMetricsCollector(scraper) poolMetric.register() billingMetric := newBillingMetrics() billingMetric.register() statsMetric := newAPIStatMetrics() statsMetric.register() return &GateMetrics{ State: stateMetric, Pool: *poolMetric, Billing: billingMetric, Stats: statsMetric, } } func (g *GateMetrics) Unregister() { g.State.unregister() prometheus.Unregister(&g.Pool) g.Billing.unregister() g.Stats.unregister() } func (g *GateMetrics) Handler() http.Handler { handler := http.NewServeMux() handler.Handle("/", promhttp.Handler()) handler.Handle("/metrics/billing", promhttp.HandlerFor(g.Billing.registry, promhttp.HandlerOpts{})) return handler }