123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- package server
- import (
- "github.com/prometheus/client_golang/prometheus"
- "github.com/prometheus/client_golang/prometheus/promhttp"
- "net/http"
- )
- var rpcCallCnt = &Metric{
- ID: "rpcCallCnt",
- Name: "rpc_call_total",
- Description: "HOW MANY RPC CALL",
- Type: "counter_vec",
- Args: []string{"service"},
- }
- var rpcCallDur = &Metric{
- ID: "rpc_call_duration",
- Name: "rpc_call_duration_seconds",
- Description: "rpc call duration seconds",
- Type: "histogram_vec",
- Args: []string{"client", "server", "method"},
- }
- var standardMetrics = []*Metric{
- rpcCallCnt,
- rpcCallDur,
- }
- type Metric struct {
- MetricCollector prometheus.Collector
- ID string
- Name string
- Description string
- Type string
- Args []string
- }
- type Prometheus struct {
- MetricsList []*Metric
- MetricsPath string
- CallCnt *prometheus.CounterVec
- CallDur *prometheus.HistogramVec
- }
- func NewPrometheus(subsystem string, customMetricsList ...*Metric) *Prometheus {
- var metricsList []*Metric
- for _, v := range customMetricsList {
- metricsList = append(metricsList, v)
- }
- for _, metric := range standardMetrics {
- metricsList = append(metricsList, metric)
- }
- p := &Prometheus{
- MetricsList: metricsList,
- MetricsPath: "/metrics",
- }
- p.registerMetrics(subsystem)
- return p
- }
- func (p *Prometheus) Start(addr string) error {
- http.Handle(p.MetricsPath, promhttp.Handler())
- return http.ListenAndServe(addr, nil)
- }
- func (p *Prometheus) RegisterMetrics(sub string, metrics ...*Metric) {
- for _, m := range metrics {
- metric := NewMetric(m, sub)
- if err := prometheus.Register(metric); err != nil {
- Log.Errorf("%s could not be registered in prometheus", m.Name)
- }
- m.MetricCollector = metric
- }
- }
- // NewMetric associates prometheus.Collector based on Metric.Type
- func NewMetric(m *Metric, subsystem string) prometheus.Collector {
- var metric prometheus.Collector
- switch m.Type {
- case "counter_vec":
- metric = prometheus.NewCounterVec(
- prometheus.CounterOpts{
- Name: m.Name,
- Help: m.Description,
- },
- m.Args,
- )
- case "counter":
- metric = prometheus.NewCounter(
- prometheus.CounterOpts{
- Name: m.Name,
- Help: m.Description,
- },
- )
- case "gauge_vec":
- metric = prometheus.NewGaugeVec(
- prometheus.GaugeOpts{
- Name: m.Name,
- Help: m.Description,
- },
- m.Args,
- )
- case "gauge":
- metric = prometheus.NewGauge(
- prometheus.GaugeOpts{
- Name: m.Name,
- Help: m.Description,
- },
- )
- case "histogram_vec":
- metric = prometheus.NewHistogramVec(
- prometheus.HistogramOpts{
- Name: m.Name,
- Help: m.Description,
- },
- m.Args,
- )
- case "histogram":
- metric = prometheus.NewHistogram(
- prometheus.HistogramOpts{
- Name: m.Name,
- Help: m.Description,
- },
- )
- case "summary_vec":
- metric = prometheus.NewSummaryVec(
- prometheus.SummaryOpts{
- Name: m.Name,
- Help: m.Description,
- },
- m.Args,
- )
- case "summary":
- metric = prometheus.NewSummary(
- prometheus.SummaryOpts{
- Name: m.Name,
- Help: m.Description,
- },
- )
- }
- return metric
- }
- func (p *Prometheus) registerMetrics(sub string) {
- for _, metricDef := range p.MetricsList {
- metric := NewMetric(metricDef, sub)
- if err := prometheus.Register(metric); err != nil {
- Log.Errorf("%s could not be registered in prometheus", metricDef.Name)
- }
- switch metricDef {
- case rpcCallCnt:
- p.CallCnt = metric.(*prometheus.CounterVec)
- case rpcCallDur:
- p.CallDur = metric.(*prometheus.HistogramVec)
- }
- metricDef.MetricCollector = metric
- }
- }
|