github.com/grafana/synthetic-monitoring-agent@v0.64.2/internal/pusher/metrics.go (about)

     1  package pusher
     2  
     3  import (
     4  	"strconv"
     5  
     6  	"github.com/prometheus/client_golang/prometheus"
     7  )
     8  
     9  const (
    10  	LabelValueMetrics        = "metrics"
    11  	LabelValueLogs           = "logs"
    12  	LabelValueClient         = "client"
    13  	LabelValueRetryExhausted = "retry_exhausted"
    14  	LabelValueTenant         = "tenant"
    15  )
    16  
    17  const (
    18  	metricNamespace = "sm_agent"
    19  	metricSubsystem = "publisher"
    20  )
    21  
    22  // Metrics contains the prometheus Metrics for a publisher.
    23  type Metrics struct {
    24  	PushCounter    *prometheus.CounterVec
    25  	ErrorCounter   *prometheus.CounterVec
    26  	BytesOut       *prometheus.CounterVec
    27  	FailedCounter  *prometheus.CounterVec
    28  	RetriesCounter *prometheus.CounterVec
    29  
    30  	// For experimental publisher only
    31  	DroppedCounter  *prometheus.CounterVec
    32  	ResponseCounter *prometheus.CounterVec
    33  
    34  	InstalledHandlers prometheus.Gauge
    35  }
    36  
    37  var (
    38  	labelsWithTenantType       = []string{"regionID", "tenantID", "type"}
    39  	labelsWithTenantTypeStatus = []string{"regionID", "tenantID", "type", "status"}
    40  	labelsWithTenantTypeReason = []string{"regionID", "tenantID", "type", "reason"}
    41  )
    42  
    43  // NewMetrics returns a new set of publisher metrics registered in the given registerer.
    44  func NewMetrics(promRegisterer prometheus.Registerer) (m Metrics) {
    45  	m.PushCounter = prometheus.NewCounterVec(
    46  		prometheus.CounterOpts{
    47  			Namespace: metricNamespace,
    48  			Subsystem: metricSubsystem,
    49  			Name:      "push_total",
    50  			Help:      "Total number of push events by type.",
    51  		},
    52  		labelsWithTenantType)
    53  
    54  	promRegisterer.MustRegister(m.PushCounter)
    55  
    56  	m.ErrorCounter = prometheus.NewCounterVec(
    57  		prometheus.CounterOpts{
    58  			Namespace: metricNamespace,
    59  			Subsystem: metricSubsystem,
    60  			Name:      "push_errors_total",
    61  			Help:      "Total number of push errors by type and status.",
    62  		},
    63  		labelsWithTenantTypeStatus)
    64  
    65  	promRegisterer.MustRegister(m.ErrorCounter)
    66  
    67  	m.FailedCounter = prometheus.NewCounterVec(
    68  		prometheus.CounterOpts{
    69  			Namespace: metricNamespace,
    70  			Subsystem: metricSubsystem,
    71  			Name:      "push_failed_total",
    72  			Help:      "Total number of push failures by type.",
    73  		},
    74  		labelsWithTenantTypeReason)
    75  
    76  	promRegisterer.MustRegister(m.FailedCounter)
    77  
    78  	m.BytesOut = prometheus.NewCounterVec(
    79  		prometheus.CounterOpts{
    80  			Namespace: metricNamespace,
    81  			Subsystem: metricSubsystem,
    82  			Name:      "push_bytes",
    83  			Help:      "Total number of bytes pushed by type.",
    84  		},
    85  		labelsWithTenantType)
    86  
    87  	promRegisterer.MustRegister(m.BytesOut)
    88  
    89  	m.RetriesCounter = prometheus.NewCounterVec(
    90  		prometheus.CounterOpts{
    91  			Namespace: metricNamespace,
    92  			Subsystem: metricSubsystem,
    93  			Name:      "retries_total",
    94  			Help:      "Total number of retries performed by type.",
    95  		},
    96  		labelsWithTenantType)
    97  
    98  	promRegisterer.MustRegister(m.RetriesCounter)
    99  
   100  	m.DroppedCounter = prometheus.NewCounterVec(
   101  		prometheus.CounterOpts{
   102  			Namespace: metricNamespace,
   103  			Subsystem: metricSubsystem,
   104  			Name:      "drop_total",
   105  			Help:      "Total number of results dropped by type.",
   106  		},
   107  		labelsWithTenantType)
   108  
   109  	promRegisterer.MustRegister(m.DroppedCounter)
   110  
   111  	m.ResponseCounter = prometheus.NewCounterVec(
   112  		prometheus.CounterOpts{
   113  			Namespace: metricNamespace,
   114  			Subsystem: metricSubsystem,
   115  			Name:      "responses_total",
   116  			Help:      "Total number of responses received by type and status code.",
   117  		},
   118  		labelsWithTenantTypeStatus)
   119  
   120  	promRegisterer.MustRegister(m.ResponseCounter)
   121  
   122  	m.InstalledHandlers = prometheus.NewGauge(
   123  		prometheus.GaugeOpts{
   124  			Namespace: metricNamespace,
   125  			Subsystem: metricSubsystem,
   126  			Name:      "handlers_total",
   127  			Help:      "Total number of installed publisher handlers.",
   128  		},
   129  	)
   130  
   131  	promRegisterer.MustRegister(m.InstalledHandlers)
   132  
   133  	return m
   134  }
   135  
   136  // WithTenant returns a new set of Metrics with the local and region ID labels
   137  // already included.
   138  func (m Metrics) WithTenant(localID int64, regionID int) Metrics {
   139  	labels := prometheus.Labels{
   140  		"regionID": strconv.FormatInt(int64(regionID), 10),
   141  		"tenantID": strconv.FormatInt(localID, 10),
   142  	}
   143  
   144  	return Metrics{
   145  		PushCounter:       m.PushCounter.MustCurryWith(labels),
   146  		ErrorCounter:      m.ErrorCounter.MustCurryWith(labels),
   147  		BytesOut:          m.BytesOut.MustCurryWith(labels),
   148  		FailedCounter:     m.FailedCounter.MustCurryWith(labels),
   149  		RetriesCounter:    m.RetriesCounter.MustCurryWith(labels),
   150  		DroppedCounter:    m.DroppedCounter.MustCurryWith(labels),
   151  		ResponseCounter:   m.ResponseCounter.MustCurryWith(labels),
   152  		InstalledHandlers: m.InstalledHandlers,
   153  	}
   154  }
   155  
   156  // WithType returns a new set of Metrics with the given type label.
   157  func (m Metrics) WithType(t string) Metrics {
   158  	var typeLabels = prometheus.Labels{
   159  		"type": t,
   160  	}
   161  
   162  	return Metrics{
   163  		PushCounter:       m.PushCounter.MustCurryWith(typeLabels),
   164  		ErrorCounter:      m.ErrorCounter.MustCurryWith(typeLabels),
   165  		BytesOut:          m.BytesOut.MustCurryWith(typeLabels),
   166  		FailedCounter:     m.FailedCounter.MustCurryWith(typeLabels),
   167  		RetriesCounter:    m.RetriesCounter.MustCurryWith(typeLabels),
   168  		DroppedCounter:    m.DroppedCounter.MustCurryWith(typeLabels),
   169  		ResponseCounter:   m.ResponseCounter.MustCurryWith(typeLabels),
   170  		InstalledHandlers: m.InstalledHandlers,
   171  	}
   172  }