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 }