github.com/grafana/pyroscope@v1.18.0/pkg/compactor/syncer_metrics_test.go (about)

     1  // SPDX-License-Identifier: AGPL-3.0-only
     2  // Provenance-includes-location: https://github.com/grafana/mimir/blob/main/pkg/compactor/syncer_metrics_test.go
     3  // Provenance-includes-license: Apache-2.0
     4  // Provenance-includes-copyright: The Cortex Authors.
     5  
     6  package compactor
     7  
     8  import (
     9  	"bytes"
    10  	"testing"
    11  
    12  	"github.com/prometheus/client_golang/prometheus"
    13  	"github.com/prometheus/client_golang/prometheus/promauto"
    14  	"github.com/prometheus/client_golang/prometheus/testutil"
    15  	"github.com/stretchr/testify/require"
    16  )
    17  
    18  func TestSyncerMetrics(t *testing.T) {
    19  	reg := prometheus.NewPedanticRegistry()
    20  
    21  	sm := newAggregatedSyncerMetrics(reg)
    22  	sm.gatherThanosSyncerMetrics(generateTestData(12345))
    23  	sm.gatherThanosSyncerMetrics(generateTestData(76543))
    24  	sm.gatherThanosSyncerMetrics(generateTestData(22222))
    25  	// total base = 111110
    26  
    27  	err := testutil.GatherAndCompare(reg, bytes.NewBufferString(`
    28  			# HELP pyroscope_compactor_meta_syncs_total Total blocks metadata synchronization attempts.
    29  			# TYPE pyroscope_compactor_meta_syncs_total counter
    30  			pyroscope_compactor_meta_syncs_total 111110
    31  
    32  			# HELP pyroscope_compactor_meta_sync_failures_total Total blocks metadata synchronization failures.
    33  			# TYPE pyroscope_compactor_meta_sync_failures_total counter
    34  			pyroscope_compactor_meta_sync_failures_total 222220
    35  
    36  			# HELP pyroscope_compactor_meta_sync_duration_seconds Duration of the blocks metadata synchronization in seconds.
    37  			# TYPE pyroscope_compactor_meta_sync_duration_seconds histogram
    38  			# Observed values: 3.7035, 22.9629, 6.6666 (seconds)
    39  			pyroscope_compactor_meta_sync_duration_seconds_bucket{le="0.01"} 0
    40  			pyroscope_compactor_meta_sync_duration_seconds_bucket{le="0.1"} 0
    41  			pyroscope_compactor_meta_sync_duration_seconds_bucket{le="0.3"} 0
    42  			pyroscope_compactor_meta_sync_duration_seconds_bucket{le="0.6"} 0
    43  			pyroscope_compactor_meta_sync_duration_seconds_bucket{le="1"} 0
    44  			pyroscope_compactor_meta_sync_duration_seconds_bucket{le="3"} 0
    45  			pyroscope_compactor_meta_sync_duration_seconds_bucket{le="6"} 1
    46  			pyroscope_compactor_meta_sync_duration_seconds_bucket{le="9"} 2
    47  			pyroscope_compactor_meta_sync_duration_seconds_bucket{le="20"} 2
    48  			pyroscope_compactor_meta_sync_duration_seconds_bucket{le="30"} 3
    49  			pyroscope_compactor_meta_sync_duration_seconds_bucket{le="60"} 3
    50  			pyroscope_compactor_meta_sync_duration_seconds_bucket{le="90"} 3
    51  			pyroscope_compactor_meta_sync_duration_seconds_bucket{le="120"} 3
    52  			pyroscope_compactor_meta_sync_duration_seconds_bucket{le="240"} 3
    53  			pyroscope_compactor_meta_sync_duration_seconds_bucket{le="360"} 3
    54  			pyroscope_compactor_meta_sync_duration_seconds_bucket{le="720"} 3
    55  			pyroscope_compactor_meta_sync_duration_seconds_bucket{le="+Inf"} 3
    56  			# rounding error
    57  			pyroscope_compactor_meta_sync_duration_seconds_sum 33.333000000000006
    58  			pyroscope_compactor_meta_sync_duration_seconds_count 3
    59  
    60  			# HELP pyroscope_compactor_garbage_collection_total Total number of garbage collection operations.
    61  			# TYPE pyroscope_compactor_garbage_collection_total counter
    62  			pyroscope_compactor_garbage_collection_total 555550
    63  
    64  			# HELP pyroscope_compactor_garbage_collection_failures_total Total number of failed garbage collection operations.
    65  			# TYPE pyroscope_compactor_garbage_collection_failures_total counter
    66  			pyroscope_compactor_garbage_collection_failures_total 666660
    67  
    68  			# HELP pyroscope_compactor_garbage_collection_duration_seconds Time it took to perform garbage collection iteration.
    69  			# TYPE pyroscope_compactor_garbage_collection_duration_seconds histogram
    70  			# Observed values: 8.6415, 53.5801, 15.5554
    71  			pyroscope_compactor_garbage_collection_duration_seconds_bucket{le="0.01"} 0
    72  			pyroscope_compactor_garbage_collection_duration_seconds_bucket{le="0.1"} 0
    73  			pyroscope_compactor_garbage_collection_duration_seconds_bucket{le="0.3"} 0
    74  			pyroscope_compactor_garbage_collection_duration_seconds_bucket{le="0.6"} 0
    75  			pyroscope_compactor_garbage_collection_duration_seconds_bucket{le="1"} 0
    76  			pyroscope_compactor_garbage_collection_duration_seconds_bucket{le="3"} 0
    77  			pyroscope_compactor_garbage_collection_duration_seconds_bucket{le="6"} 0
    78  			pyroscope_compactor_garbage_collection_duration_seconds_bucket{le="9"} 1
    79  			pyroscope_compactor_garbage_collection_duration_seconds_bucket{le="20"} 2
    80  			pyroscope_compactor_garbage_collection_duration_seconds_bucket{le="30"} 2
    81  			pyroscope_compactor_garbage_collection_duration_seconds_bucket{le="60"} 3
    82  			pyroscope_compactor_garbage_collection_duration_seconds_bucket{le="90"} 3
    83  			pyroscope_compactor_garbage_collection_duration_seconds_bucket{le="120"} 3
    84  			pyroscope_compactor_garbage_collection_duration_seconds_bucket{le="240"} 3
    85  			pyroscope_compactor_garbage_collection_duration_seconds_bucket{le="360"} 3
    86  			pyroscope_compactor_garbage_collection_duration_seconds_bucket{le="720"} 3
    87  			pyroscope_compactor_garbage_collection_duration_seconds_bucket{le="+Inf"} 3
    88  			pyroscope_compactor_garbage_collection_duration_seconds_sum 77.777
    89  			pyroscope_compactor_garbage_collection_duration_seconds_count 3
    90  	`))
    91  	require.NoError(t, err)
    92  }
    93  
    94  func generateTestData(base float64) *prometheus.Registry {
    95  	r := prometheus.NewRegistry()
    96  	m := newTestSyncerMetrics(r)
    97  	m.metaSync.Add(1 * base)
    98  	m.metaSyncFailures.Add(2 * base)
    99  	m.metaSyncDuration.Observe(3 * base / 10000)
   100  	m.garbageCollections.Add(5 * base)
   101  	m.garbageCollectionFailures.Add(6 * base)
   102  	m.garbageCollectionDuration.Observe(7 * base / 10000)
   103  	return r
   104  }
   105  
   106  // directly copied from Thanos (and renamed syncerMetrics to testSyncerMetrics to avoid conflict)
   107  type testSyncerMetrics struct {
   108  	metaSync                  prometheus.Counter
   109  	metaSyncFailures          prometheus.Counter
   110  	metaSyncDuration          prometheus.Histogram
   111  	garbageCollections        prometheus.Counter
   112  	garbageCollectionFailures prometheus.Counter
   113  	garbageCollectionDuration prometheus.Histogram
   114  }
   115  
   116  func newTestSyncerMetrics(reg prometheus.Registerer) *testSyncerMetrics {
   117  	var m testSyncerMetrics
   118  
   119  	m.metaSync = promauto.With(reg).NewCounter(prometheus.CounterOpts{
   120  		Name: "blocks_meta_syncs_total",
   121  		Help: "Total blocks metadata synchronization attempts.",
   122  	})
   123  	m.metaSyncFailures = promauto.With(reg).NewCounter(prometheus.CounterOpts{
   124  		Name: "blocks_meta_sync_failures_total",
   125  		Help: "Total blocks metadata synchronization failures.",
   126  	})
   127  	m.metaSyncDuration = promauto.With(reg).NewHistogram(prometheus.HistogramOpts{
   128  		Name:    "blocks_meta_sync_duration_seconds",
   129  		Help:    "Duration of the blocks metadata synchronization in seconds.",
   130  		Buckets: []float64{0.01, 0.1, 0.3, 0.6, 1, 3, 6, 9, 20, 30, 60, 90, 120, 240, 360, 720},
   131  	})
   132  
   133  	m.garbageCollections = promauto.With(reg).NewCounter(prometheus.CounterOpts{
   134  		Name: "thanos_compact_garbage_collection_total",
   135  		Help: "Total number of garbage collection operations.",
   136  	})
   137  	m.garbageCollectionFailures = promauto.With(reg).NewCounter(prometheus.CounterOpts{
   138  		Name: "thanos_compact_garbage_collection_failures_total",
   139  		Help: "Total number of failed garbage collection operations.",
   140  	})
   141  	m.garbageCollectionDuration = promauto.With(reg).NewHistogram(prometheus.HistogramOpts{
   142  		Name:    "thanos_compact_garbage_collection_duration_seconds",
   143  		Help:    "Time it took to perform garbage collection iteration.",
   144  		Buckets: []float64{0.01, 0.1, 0.3, 0.6, 1, 3, 6, 9, 20, 30, 60, 90, 120, 240, 360, 720},
   145  	})
   146  
   147  	return &m
   148  }