(t *testing.T)
| 127 | } |
| 128 | |
| 129 | func TestMatcherCache(t *testing.T) { |
| 130 | limits := defaultLimitsTestConfig() |
| 131 | limits.EnableNativeHistograms = true |
| 132 | userID := "1" |
| 133 | tenantLimits := newMockTenantLimits(map[string]*validation.Limits{userID: &limits}) |
| 134 | registry := prometheus.NewRegistry() |
| 135 | |
| 136 | dir := t.TempDir() |
| 137 | chunksDir := filepath.Join(dir, "chunks") |
| 138 | blocksDir := filepath.Join(dir, "blocks") |
| 139 | require.NoError(t, os.Mkdir(chunksDir, os.ModePerm)) |
| 140 | require.NoError(t, os.Mkdir(blocksDir, os.ModePerm)) |
| 141 | cfg := defaultIngesterTestConfig(t) |
| 142 | cfg.MatchersCacheMaxItems = 50 |
| 143 | ing, err := prepareIngesterWithBlocksStorageAndLimits(t, cfg, limits, tenantLimits, blocksDir, registry) |
| 144 | require.NoError(t, err) |
| 145 | require.NoError(t, services.StartAndAwaitRunning(context.Background(), ing)) |
| 146 | |
| 147 | defer services.StopAndAwaitTerminated(context.Background(), ing) //nolint:errcheck |
| 148 | |
| 149 | // Wait until it's ACTIVE |
| 150 | test.Poll(t, time.Second, ring.ACTIVE, func() any { |
| 151 | return ing.lifecycler.GetState() |
| 152 | }) |
| 153 | ctx := user.InjectOrgID(context.Background(), userID) |
| 154 | // Lets have 1 key evicted |
| 155 | numberOfDifferentMatchers := cfg.MatchersCacheMaxItems + 1 |
| 156 | callPerMatcher := 10 |
| 157 | for j := range numberOfDifferentMatchers { |
| 158 | for range callPerMatcher { |
| 159 | s := &mockQueryStreamServer{ctx: ctx} |
| 160 | err = ing.QueryStream(&client.QueryRequest{ |
| 161 | StartTimestampMs: math.MinInt64, |
| 162 | EndTimestampMs: math.MaxInt64, |
| 163 | Matchers: []*client.LabelMatcher{{Type: client.REGEX_MATCH, Name: labels.MetricName, Value: fmt.Sprintf("%d", j)}}, |
| 164 | }, s) |
| 165 | require.NoError(t, err) |
| 166 | } |
| 167 | } |
| 168 | |
| 169 | require.NoError(t, testutil.GatherAndCompare(registry, bytes.NewBufferString(fmt.Sprintf(` |
| 170 | # HELP cortex_ingester_matchers_cache_evicted_total Total number of items evicted from the cache |
| 171 | # TYPE cortex_ingester_matchers_cache_evicted_total counter |
| 172 | cortex_ingester_matchers_cache_evicted_total 1 |
| 173 | # HELP cortex_ingester_matchers_cache_hits_total Total number of cache hits for series matchers |
| 174 | # TYPE cortex_ingester_matchers_cache_hits_total counter |
| 175 | cortex_ingester_matchers_cache_hits_total %v |
| 176 | # HELP cortex_ingester_matchers_cache_items Total number of cached items |
| 177 | # TYPE cortex_ingester_matchers_cache_items gauge |
| 178 | cortex_ingester_matchers_cache_items %v |
| 179 | # HELP cortex_ingester_matchers_cache_max_items Maximum number of items that can be cached |
| 180 | # TYPE cortex_ingester_matchers_cache_max_items gauge |
| 181 | cortex_ingester_matchers_cache_max_items 50 |
| 182 | # HELP cortex_ingester_matchers_cache_requests_total Total number of cache requests for series matchers |
| 183 | # TYPE cortex_ingester_matchers_cache_requests_total counter |
| 184 | cortex_ingester_matchers_cache_requests_total %v |
| 185 | `, callPerMatcher*numberOfDifferentMatchers-numberOfDifferentMatchers, cfg.MatchersCacheMaxItems, callPerMatcher*numberOfDifferentMatchers)), "ingester_matchers_cache_requests_total", "ingester_matchers_cache_hits_total", "ingester_matchers_cache_items", "ingester_matchers_cache_max_items", "ingester_matchers_cache_evicted_total")) |
| 186 | } |
nothing calls this directly
no test coverage detected