github.com/yankunsam/loki/v2@v2.6.3-0.20220817130409-389df5235c27/pkg/ruler/storage/wal/metrics.go (about) 1 // This directory was copied and adapted from https://github.com/grafana/agent/tree/main/pkg/metrics. 2 // We cannot vendor the agent in since the agent vendors loki in, which would cause a cyclic dependency. 3 // NOTE: many changes have been made to the original code for our use-case. 4 package wal 5 6 import "github.com/prometheus/client_golang/prometheus" 7 8 type Metrics struct { 9 r prometheus.Registerer 10 11 NumActiveSeries prometheus.Gauge 12 NumDeletedSeries prometheus.Gauge 13 TotalCreatedSeries prometheus.Counter 14 TotalRemovedSeries prometheus.Counter 15 TotalAppendedSamples prometheus.Counter 16 TotalAppendedExemplars prometheus.Counter 17 TotalCorruptions prometheus.Counter 18 TotalFailedRepairs prometheus.Counter 19 TotalSucceededRepairs prometheus.Counter 20 ReplayDuration prometheus.Histogram 21 DiskSize prometheus.Gauge 22 } 23 24 func NewMetrics(r prometheus.Registerer) *Metrics { 25 m := Metrics{r: r} 26 m.NumActiveSeries = prometheus.NewGauge(prometheus.GaugeOpts{ 27 Name: "storage_active_series", 28 Help: "Current number of active series being tracked by a tenant's WAL storage", 29 }) 30 31 m.NumDeletedSeries = prometheus.NewGauge(prometheus.GaugeOpts{ 32 Name: "storage_deleted_series", 33 Help: "Current number of series marked for deletion from memory", 34 }) 35 36 m.TotalCreatedSeries = prometheus.NewCounter(prometheus.CounterOpts{ 37 Name: "storage_created_series_total", 38 Help: "Total number of created series appended to a tenant's WAL", 39 }) 40 41 m.TotalRemovedSeries = prometheus.NewCounter(prometheus.CounterOpts{ 42 Name: "storage_removed_series_total", 43 Help: "Total number of created series removed from a tenant's WAL", 44 }) 45 46 m.TotalAppendedSamples = prometheus.NewCounter(prometheus.CounterOpts{ 47 Name: "samples_appended_total", 48 Help: "Total number of samples appended to a tenant's WAL", 49 }) 50 51 m.TotalAppendedExemplars = prometheus.NewCounter(prometheus.CounterOpts{ 52 Name: "exemplars_appended_total", 53 Help: "Total number of exemplars appended to a tenant's WAL", 54 }) 55 56 m.TotalCorruptions = prometheus.NewCounter(prometheus.CounterOpts{ 57 Name: "corruptions_total", 58 Help: "Total number of corruptions observed in a tenant's WAL", 59 }) 60 61 m.TotalFailedRepairs = prometheus.NewCounter(prometheus.CounterOpts{ 62 Name: "corruptions_repair_failed_total", 63 Help: "Total number of corruptions unsuccessfully repaired in a tenant's WAL", 64 }) 65 66 m.TotalSucceededRepairs = prometheus.NewCounter(prometheus.CounterOpts{ 67 Name: "corruptions_repair_succeeded_total", 68 Help: "Total number of corruptions successfully repaired in a tenant's WAL", 69 }) 70 71 m.ReplayDuration = prometheus.NewHistogram(prometheus.HistogramOpts{ 72 Name: "replay_duration", 73 Help: "Total duration in seconds it took to replay a tenant's WAL", 74 Buckets: prometheus.ExponentialBuckets(0.01, 4, 6), 75 }) 76 77 m.DiskSize = prometheus.NewGauge(prometheus.GaugeOpts{ 78 Name: "disk_size", 79 Help: "Size of each tenant's WAL on disk", 80 }) 81 82 // why do the metrics not show up? 83 // are the metrics for the wal indexed by the config name? 84 // don't think so -> add 85 if r != nil { 86 r.MustRegister( 87 m.NumActiveSeries, 88 m.NumDeletedSeries, 89 m.TotalCreatedSeries, 90 m.TotalRemovedSeries, 91 m.TotalAppendedSamples, 92 m.TotalAppendedExemplars, 93 m.TotalCorruptions, 94 m.TotalFailedRepairs, 95 m.TotalSucceededRepairs, 96 m.ReplayDuration, 97 m.DiskSize, 98 ) 99 } 100 101 return &m 102 } 103 104 func (m *Metrics) Unregister() { 105 if m.r == nil { 106 return 107 } 108 cs := []prometheus.Collector{ 109 m.NumActiveSeries, 110 m.NumDeletedSeries, 111 m.TotalCreatedSeries, 112 m.TotalRemovedSeries, 113 m.TotalAppendedSamples, 114 m.TotalAppendedExemplars, 115 m.TotalCorruptions, 116 m.TotalFailedRepairs, 117 m.TotalSucceededRepairs, 118 m.ReplayDuration, 119 m.DiskSize, 120 } 121 for _, c := range cs { 122 m.r.Unregister(c) 123 } 124 }