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  }