github.com/grafana/pyroscope@v1.18.0/pkg/segmentwriter/segment_metrics.go (about) 1 package segmentwriter 2 3 import ( 4 "time" 5 6 "github.com/prometheus/client_golang/prometheus" 7 ) 8 9 type segmentMetrics struct { 10 segmentIngestBytes *prometheus.HistogramVec 11 segmentSizeBytes *prometheus.HistogramVec 12 headSizeBytes *prometheus.HistogramVec 13 segmentFlushWaitDuration *prometheus.HistogramVec 14 segmentFlushTimeouts *prometheus.CounterVec 15 storeMetadataDuration *prometheus.HistogramVec 16 storeMetadataDLQ *prometheus.CounterVec 17 segmentUploadDuration *prometheus.HistogramVec 18 segmentHedgedUploadDuration *prometheus.HistogramVec 19 flushSegmentDuration *prometheus.HistogramVec 20 flushHeadsDuration *prometheus.HistogramVec 21 flushServiceHeadDuration *prometheus.HistogramVec 22 flushServiceHeadError *prometheus.CounterVec 23 } 24 25 var ( 26 networkTimingBuckets = prometheus.ExponentialBucketsRange(0.005, 4, 20) 27 dataTimingBuckets = prometheus.ExponentialBucketsRange(0.001, 1, 20) 28 segmentFlushWaitBuckets = []float64{.1, .2, .3, .4, .5, .6, .7, .8, .9, 1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2} 29 ) 30 31 func newSegmentMetrics(reg prometheus.Registerer) *segmentMetrics { 32 // TODO(kolesnikovae): 33 // - Use native histograms for all metrics 34 // - Remove unnecessary labels (e.g. shard) 35 // - Remove/merge/replace metrics 36 // - Rename to pyroscope_segment_writer_* 37 // - Add Help. 38 m := &segmentMetrics{ 39 segmentIngestBytes: prometheus.NewHistogramVec( 40 prometheus.HistogramOpts{ 41 Namespace: "pyroscope", 42 Subsystem: "segment_writer", 43 Name: "segment_ingest_bytes", 44 Buckets: prometheus.ExponentialBucketsRange(10*1024, 15*1024*1024, 20), 45 }, 46 []string{"shard", "tenant"}), 47 segmentSizeBytes: prometheus.NewHistogramVec( 48 prometheus.HistogramOpts{ 49 Namespace: "pyroscope", 50 Subsystem: "segment_writer", 51 Name: "segment_size_bytes", 52 Buckets: prometheus.ExponentialBucketsRange(100*1024, 100*1024*1024, 20), 53 }, 54 []string{"shard"}), 55 56 segmentUploadDuration: prometheus.NewHistogramVec(prometheus.HistogramOpts{ 57 Namespace: "pyroscope", 58 Subsystem: "segment_writer", 59 Name: "upload_duration_seconds", 60 Help: "Duration of segment upload requests.", 61 Buckets: prometheus.ExponentialBucketsRange(0.001, 10, 30), 62 NativeHistogramBucketFactor: 1.1, 63 NativeHistogramMaxBucketNumber: 32, 64 NativeHistogramMinResetDuration: time.Minute * 15, 65 }, []string{"status"}), 66 67 segmentHedgedUploadDuration: prometheus.NewHistogramVec(prometheus.HistogramOpts{ 68 Namespace: "pyroscope", 69 Subsystem: "segment_writer", 70 Name: "hedged_upload_duration_seconds", 71 Help: "Duration of hedged segment upload requests.", 72 Buckets: prometheus.ExponentialBucketsRange(0.001, 10, 30), 73 NativeHistogramBucketFactor: 1.1, 74 NativeHistogramMaxBucketNumber: 32, 75 NativeHistogramMinResetDuration: time.Minute * 15, 76 }, []string{"status"}), 77 78 storeMetadataDuration: prometheus.NewHistogramVec(prometheus.HistogramOpts{ 79 Namespace: "pyroscope", 80 Subsystem: "segment_writer", 81 Name: "store_metadata_duration_seconds", 82 Help: "Duration of store metadata requests.", 83 Buckets: prometheus.ExponentialBucketsRange(0.001, 10, 30), 84 NativeHistogramBucketFactor: 1.1, 85 NativeHistogramMaxBucketNumber: 32, 86 NativeHistogramMinResetDuration: time.Minute * 15, 87 }, []string{"status"}), 88 89 storeMetadataDLQ: prometheus.NewCounterVec(prometheus.CounterOpts{ 90 Namespace: "pyroscope", 91 Subsystem: "segment_writer", 92 Name: "store_metadata_dlq", 93 Help: "Number of store metadata entries that were sent to the DLQ.", 94 }, []string{"status"}), 95 96 segmentFlushWaitDuration: prometheus.NewHistogramVec(prometheus.HistogramOpts{ 97 Namespace: "pyroscope", 98 Name: "segment_ingester_wait_duration_seconds", 99 Buckets: segmentFlushWaitBuckets, 100 }, []string{"tenant"}), 101 segmentFlushTimeouts: prometheus.NewCounterVec( 102 prometheus.CounterOpts{ 103 Namespace: "pyroscope", 104 Name: "segment_ingester_wait_timeouts", 105 }, []string{"tenant"}), 106 flushHeadsDuration: prometheus.NewHistogramVec(prometheus.HistogramOpts{ 107 Namespace: "pyroscope", 108 Name: "segment_flush_heads_duration_seconds", 109 Buckets: dataTimingBuckets, 110 }, []string{"shard"}), 111 flushServiceHeadDuration: prometheus.NewHistogramVec(prometheus.HistogramOpts{ 112 Namespace: "pyroscope", 113 Name: "segment_flush_service_head_duration_seconds", 114 Buckets: dataTimingBuckets, 115 }, []string{"shard", "tenant"}), 116 flushSegmentDuration: prometheus.NewHistogramVec(prometheus.HistogramOpts{ 117 Namespace: "pyroscope", 118 Name: "segment_flush_segment_duration_seconds", 119 Buckets: networkTimingBuckets, 120 }, []string{"shard"}), 121 122 flushServiceHeadError: prometheus.NewCounterVec( 123 prometheus.CounterOpts{ 124 Namespace: "pyroscope", 125 Name: "segment_flush_service_head_errors", 126 }, []string{"shard", "tenant"}), 127 headSizeBytes: prometheus.NewHistogramVec( 128 prometheus.HistogramOpts{ 129 Namespace: "pyroscope", 130 Name: "segment_head_size_bytes", 131 Buckets: prometheus.ExponentialBucketsRange(10*1024, 100*1024*1024, 30), 132 }, []string{"shard", "tenant"}), 133 } 134 135 if reg != nil { 136 reg.MustRegister(m.segmentIngestBytes) 137 reg.MustRegister(m.segmentSizeBytes) 138 reg.MustRegister(m.storeMetadataDuration) 139 reg.MustRegister(m.segmentFlushWaitDuration) 140 reg.MustRegister(m.segmentFlushTimeouts) 141 reg.MustRegister(m.storeMetadataDLQ) 142 reg.MustRegister(m.segmentUploadDuration) 143 reg.MustRegister(m.segmentHedgedUploadDuration) 144 reg.MustRegister(m.flushHeadsDuration) 145 reg.MustRegister(m.flushServiceHeadDuration) 146 reg.MustRegister(m.flushServiceHeadError) 147 reg.MustRegister(m.flushSegmentDuration) 148 reg.MustRegister(m.headSizeBytes) 149 } 150 return m 151 } 152 153 func statusLabelValue(err error) string { 154 if err == nil { 155 return "success" 156 } 157 return "error" 158 }