api/prometheus.go
2023-05-30 10:46:56 +08:00

103 lines
2.8 KiB
Go

package api
import (
"errors"
"fmt"
"net/http"
"strings"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
"github.com/prometheus/client_golang/prometheus/push"
"qoobing.com/gomod/log"
)
var (
MetricExporterPusher = func() error { return nil }
MetricExporterHandler Handler = nil
MetricRegistry *prometheus.Registry = nil
metricApiCounter *prometheus.CounterVec = nil
metricApiSummary *prometheus.SummaryVec = nil
instance string = "--unknown--"
)
type metricExporterHandler struct {
name string
promhttpHandler http.Handler
}
func (m *metricExporterHandler) ApiName() string {
return m.name
}
func (m *metricExporterHandler) HandlerFunc() HandlerFunc {
return func(c *Context) (err error) {
m.promhttpHandler.ServeHTTP(c.Writer, c.Request)
return nil
}
}
func dumpMetricExporterPusher() error {
return errors.New("not initilized, forgot call 'SetupMetricsExporterPusher'?")
}
func InitMetrics(instanceValue string) {
if instanceValue == "" {
instance = getInstanceIpAddress()
} else if ap := strings.Split(instanceValue, ":"); len(ap) == 2 &&
ap[0] == "0.0.0.0" || ap[0] == "" {
instance = getInstanceIpAddress() + ":" + ap[1]
}
log.Infof("self instance: [%s]", instance)
metricApiCounter = prometheus.NewCounterVec(
prometheus.CounterOpts{
Name: "api_requests_total",
Help: "How many HTTP requests processed",
//ConstLabels: prometheus.Labels{"instance": instance},
},
[]string{"api", "errcode", "appid"},
)
metricApiSummary = prometheus.NewSummaryVec(
prometheus.SummaryOpts{
Name: "api_requests_summary",
Help: "The api request summary of cost.",
Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001},
//ConstLabels: prometheus.Labels{"instance": instance},
},
[]string{"api", "errcode", "appid"},
)
MetricRegistry = prometheus.NewRegistry()
MetricRegistry.MustRegister(metricApiCounter)
MetricRegistry.MustRegister(metricApiSummary)
}
func SetupMetricsExporterHandler(apiname string) {
if apiname == "" {
apiname = "premetheus_metrics_exporter"
}
opt := promhttp.HandlerOpts{Registry: MetricRegistry}
MetricExporterHandler = &metricExporterHandler{
name: apiname,
promhttpHandler: promhttp.HandlerFor(MetricRegistry, opt),
}
}
func SetupMetricsExporterPusher(pushgateway string, jobname string) {
if jobname == "" {
jobname = fmt.Sprintf("api-metrics-job-%s", getExeFilename())
}
var pusher = push.
New(pushgateway, jobname).
Grouping("instance", instance).
Gatherer(MetricRegistry)
MetricExporterPusher = func() error {
RecordMetrics("push_metrics_to_prometheus", "0", "selfmonitoring", 1.0)
return pusher.Push()
}
}