exporter/metric/prometheus/exporter.go (94 lines of code) (raw):

// Copyright 1999-2021 Alibaba Group Holding Ltd. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package prometheus import ( "net/http" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" ) var ( registry *prometheus.Registry httpHandler http.Handler ) func init() { registry = prometheus.NewRegistry() h := promhttp.HandlerFor(registry, promhttp.HandlerOpts{}) httpHandler = promhttp.InstrumentMetricHandler(registry, h) } type Counter struct { cv *prometheus.CounterVec } type Gauge struct { gv *prometheus.GaugeVec } type Histogram struct { hv *prometheus.HistogramVec } func NewCounter(name, namespace, desc string, labelNames []string, constLabels map[string]string) *Counter { return &Counter{ cv: prometheus.NewCounterVec(prometheus.CounterOpts{ Name: name, Namespace: namespace, Help: desc, ConstLabels: constLabels, }, labelNames), } } func (c *Counter) Add(value float64, labelValues ...string) { c.cv.WithLabelValues(labelValues...).Add(value) } func (c *Counter) Register() error { return registry.Register(c.cv) } func (c *Counter) Unregister() bool { return registry.Unregister(c.cv) } func (c *Counter) Reset() { c.cv.Reset() } func NewGauge(name, namespace, desc string, labelNames []string, constLabels map[string]string) *Gauge { return &Gauge{ gv: prometheus.NewGaugeVec(prometheus.GaugeOpts{ Name: name, Namespace: namespace, Help: desc, ConstLabels: constLabels, }, labelNames), } } func (g *Gauge) Set(value float64, labelValues ...string) { g.gv.WithLabelValues(labelValues...).Set(value) } func (g *Gauge) Register() error { return registry.Register(g.gv) } func (g *Gauge) Unregister() bool { return registry.Unregister(g.gv) } func (g *Gauge) Reset() { g.gv.Reset() } func NewHistogram(name, namespace, desc string, buckets []float64, labelNames []string, constLabels map[string]string) *Histogram { return &Histogram{ hv: prometheus.NewHistogramVec(prometheus.HistogramOpts{ Name: name, Namespace: namespace, Help: desc, Buckets: buckets, ConstLabels: constLabels, }, labelNames), } } func (h *Histogram) Observe(value float64, labelValues ...string) { h.hv.WithLabelValues(labelValues...).Observe(value) } func (h *Histogram) Register() error { return registry.Register(h.hv) } func (h *Histogram) Unregister() bool { return registry.Unregister(h.hv) } func (h *Histogram) Reset() { h.hv.Reset() } func HTTPHandler() http.Handler { return httpHandler }