exporter/metric/exporter.go (95 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 metric
import (
"net/http"
"os"
"strconv"
"github.com/alibaba/sentinel-golang/core/config"
"github.com/alibaba/sentinel-golang/exporter/metric/prometheus"
)
var (
exporter Exporter
host string
app string
pid string
namespace string
)
func init() {
if config.MetricExportHTTPAddr() != "" {
exporter = newPrometheusExporter()
} else {
exporter = newEmptyExporter()
}
host, _ = os.Hostname()
if host == "" {
host = "unknown"
}
app = config.AppName()
pid = strconv.Itoa(os.Getpid())
namespace = "sentinel_go"
}
// Metric models basic operations of metric being exported.
// Implementations of Metric in this package are Counter, Gauge and Histogram.
type Metric interface {
// Register registers the Metric.
Register() error
// Unregister unregisters the Metric.
Unregister() bool
// Reset deletes all values of the Metric.
Reset()
}
// Counter is a Metric that represents a single numerical value that only ever goes up.
type Counter interface {
Metric
Add(value float64, labelValues ...string)
}
// Gauge is a Metric that represents a single numerical value that can arbitrarily go up and down.
type Gauge interface {
Metric
Set(value float64, labelValues ...string)
}
// Histogram counts individual observations from an event or sample stream in configurable buckets.
type Histogram interface {
Metric
Observe(value float64, labelValues ...string)
}
// Exporter creates all kinds Metric, and return the http.Handler used to export metrics.
type Exporter interface {
// NewCounter creates a Counter metric partitioned by the given label names.
NewCounter(name, desc string, labelNames []string) Counter
// NewGauge creates a Gauge metric partitioned by the given label names.
NewGauge(name, desc string, labelNames []string) Gauge
// NewHistogram creates a histogram metric partitioned by the given label names.
NewHistogram(name, desc string, buckets []float64, labelNames []string) Histogram
// HTTPHandler returns http.Handler used to export metrics.
HTTPHandler() http.Handler
}
// prometheusExporter is the exporter of prometheus implementation.
type prometheusExporter struct{}
func newPrometheusExporter() *prometheusExporter {
return &prometheusExporter{}
}
func (e *prometheusExporter) NewCounter(name, desc string, labelNames []string) Counter {
return prometheus.NewCounter(name, namespace, desc, labelNames, newConstLabels())
}
func (e *prometheusExporter) NewGauge(name, desc string, labelNames []string) Gauge {
return prometheus.NewGauge(name, namespace, desc, labelNames, newConstLabels())
}
func (e *prometheusExporter) NewHistogram(name, desc string, buckets []float64, labelNames []string) Histogram {
return prometheus.NewHistogram(name, namespace, desc, buckets, labelNames, newConstLabels())
}
func (e *prometheusExporter) HTTPHandler() http.Handler {
return prometheus.HTTPHandler()
}
func newConstLabels() map[string]string {
return map[string]string{
"host": host,
"app": app,
"pid": pid,
}
}
// NewCounter creates a Counter metric partitioned by the given label names.
func NewCounter(name, desc string, labelNames []string) Counter {
return exporter.NewCounter(name, desc, labelNames)
}
// NewGauge creates a Gauge metric partitioned by the given label names.
func NewGauge(name, desc string, labelNames []string) Gauge {
return exporter.NewGauge(name, desc, labelNames)
}
// NewHistogram creates a histogram metric partitioned by the given label names.
func NewHistogram(name, desc string, buckets []float64, labelNames []string) Histogram {
return exporter.NewHistogram(name, desc, buckets, labelNames)
}
// HTTPHandler returns http.Handler used to export metrics.
func HTTPHandler() http.Handler {
return exporter.HTTPHandler()
}
// Register registers the provided Metric.
func Register(m Metric) error {
return m.Register()
}
// MustRegister registers the provided Metric and panics if any error occurs.
func MustRegister(m Metric) {
if err := m.Register(); err != nil {
panic(err)
}
}