Skip to content

Commit 5876163

Browse files
yeya24CharlieTLe
authored andcommitted
Put ingester disable chunk trimming a feature flag (cortexproject#6300)
1 parent 765f9fc commit 5876163

File tree

4 files changed

+42
-35
lines changed

4 files changed

+42
-35
lines changed

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
* [ENHANCEMENT] S3 Bucket Client: Add a list objects version configs to configure list api object version. #6280
1313
* [ENHANCEMENT] OpenStack Swift: Add application credential configs for Openstack swift object storage backend. #6255
1414
* [ENHANCEMENT] Query Frontend: Add new query stats metrics `cortex_query_samples_scanned_total` and `cortex_query_peak_samples` to track scannedSamples and peakSample per user. #6228
15-
* [ENHANCEMENT] Ingester: Disable chunk trimming. #6270
15+
* [ENHANCEMENT] Ingester: Add option `ingester.disable-chunk-trimming` to disable chunk trimming. #6300
1616
* [ENHANCEMENT] Ingester: Add `blocks-storage.tsdb.wal-compression-type` to support zstd wal compression type. #6232
1717
* [ENHANCEMENT] Query Frontend: Add info field to query response. #6207
1818
* [ENHANCEMENT] Query Frontend: Add peakSample in query stats response. #6188

docs/configuration/config-file-reference.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3073,6 +3073,13 @@ instance_limits:
30733073
# Experimental: Enable string interning for metrics labels.
30743074
# CLI flag: -ingester.labels-string-interning-enabled
30753075
[labels_string_interning_enabled: <boolean> | default = false]
3076+
3077+
# Disable trimming of matching series chunks based on query Start and End time.
3078+
# When disabled, the result may contain samples outside the queried time range
3079+
# but select performances may be improved. Note that certain query results might
3080+
# change by changing this option.
3081+
# CLI flag: -ingester.disable-chunk-trimming
3082+
[disable_chunk_trimming: <boolean> | default = false]
30763083
```
30773084

30783085
### `ingester_client_config`

integration/query_fuzz_test.go

Lines changed: 26 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"github.com/prometheus/common/model"
2323
"github.com/prometheus/prometheus/model/labels"
2424
"github.com/prometheus/prometheus/prompb"
25+
"github.com/prometheus/prometheus/promql/parser"
2526
"github.com/stretchr/testify/require"
2627
"github.com/thanos-io/thanos/pkg/block"
2728
"github.com/thanos-io/thanos/pkg/block/metadata"
@@ -37,7 +38,6 @@ import (
3738
)
3839

3940
func TestDisableChunkTrimmingFuzz(t *testing.T) {
40-
noneChunkTrimmingImage := "quay.io/cortexproject/cortex:v1.18.0"
4141
s, err := e2e.NewScenario(networkName)
4242
require.NoError(t, err)
4343
defer s.Close()
@@ -47,31 +47,7 @@ func TestDisableChunkTrimmingFuzz(t *testing.T) {
4747
consul2 := e2edb.NewConsulWithName("consul2")
4848
require.NoError(t, s.StartAndWaitReady(consul1, consul2))
4949

50-
flags1 := mergeFlags(
51-
AlertmanagerLocalFlags(),
52-
map[string]string{
53-
"-store.engine": blocksStorageEngine,
54-
"-blocks-storage.backend": "filesystem",
55-
"-blocks-storage.tsdb.head-compaction-interval": "4m",
56-
"-blocks-storage.tsdb.block-ranges-period": "2h",
57-
"-blocks-storage.tsdb.ship-interval": "1h",
58-
"-blocks-storage.bucket-store.sync-interval": "15m",
59-
"-blocks-storage.tsdb.retention-period": "2h",
60-
"-blocks-storage.bucket-store.index-cache.backend": tsdb.IndexCacheBackendInMemory,
61-
"-blocks-storage.bucket-store.bucket-index.enabled": "true",
62-
"-querier.query-store-for-labels-enabled": "true",
63-
// Ingester.
64-
"-ring.store": "consul",
65-
"-consul.hostname": consul1.NetworkHTTPEndpoint(),
66-
// Distributor.
67-
"-distributor.replication-factor": "1",
68-
// Store-gateway.
69-
"-store-gateway.sharding-enabled": "false",
70-
// alert manager
71-
"-alertmanager.web.external-url": "http://localhost/alertmanager",
72-
},
73-
)
74-
flags2 := mergeFlags(
50+
flags := mergeFlags(
7551
AlertmanagerLocalFlags(),
7652
map[string]string{
7753
"-store.engine": blocksStorageEngine,
@@ -85,8 +61,7 @@ func TestDisableChunkTrimmingFuzz(t *testing.T) {
8561
"-blocks-storage.bucket-store.bucket-index.enabled": "true",
8662
"-querier.query-store-for-labels-enabled": "true",
8763
// Ingester.
88-
"-ring.store": "consul",
89-
"-consul.hostname": consul2.NetworkHTTPEndpoint(),
64+
"-ring.store": "consul",
9065
// Distributor.
9166
"-distributor.replication-factor": "1",
9267
// Store-gateway.
@@ -95,17 +70,26 @@ func TestDisableChunkTrimmingFuzz(t *testing.T) {
9570
"-alertmanager.web.external-url": "http://localhost/alertmanager",
9671
},
9772
)
73+
9874
// make alert manager config dir
9975
require.NoError(t, writeFileToSharedDir(s, "alertmanager_configs", []byte{}))
10076

10177
path1 := path.Join(s.SharedDir(), "cortex-1")
10278
path2 := path.Join(s.SharedDir(), "cortex-2")
10379

104-
flags1 = mergeFlags(flags1, map[string]string{"-blocks-storage.filesystem.dir": path1})
105-
flags2 = mergeFlags(flags2, map[string]string{"-blocks-storage.filesystem.dir": path2})
80+
flags1 := mergeFlags(flags, map[string]string{
81+
"-blocks-storage.filesystem.dir": path1,
82+
"-consul.hostname": consul1.NetworkHTTPEndpoint(),
83+
})
84+
// Disable chunk trimming for Cortex 2.
85+
flags2 := mergeFlags(flags, map[string]string{
86+
"-blocks-storage.filesystem.dir": path2,
87+
"-consul.hostname": consul2.NetworkHTTPEndpoint(),
88+
"-ingester.disable-chunk-trimming": "true",
89+
})
10690
// Start Cortex replicas.
10791
cortex1 := e2ecortex.NewSingleBinary("cortex-1", flags1, "")
108-
cortex2 := e2ecortex.NewSingleBinary("cortex-2", flags2, noneChunkTrimmingImage)
92+
cortex2 := e2ecortex.NewSingleBinary("cortex-2", flags2, "")
10993
require.NoError(t, s.StartAndWaitReady(cortex1, cortex2))
11094

11195
// Wait until Cortex replicas have updated the ring state.
@@ -162,9 +146,18 @@ func TestDisableChunkTrimmingFuzz(t *testing.T) {
162146
queryEnd := time.Now().Add(-time.Minute * 20)
163147
cases := make([]*testCase, 0, 200)
164148
testRun := 500
149+
var (
150+
expr parser.Expr
151+
query string
152+
)
165153
for i := 0; i < testRun; i++ {
166-
expr := ps.WalkRangeQuery()
167-
query := expr.Pretty(0)
154+
for {
155+
expr = ps.WalkRangeQuery()
156+
query = expr.Pretty(0)
157+
if !strings.Contains(query, "timestamp") {
158+
break
159+
}
160+
}
168161
res1, err1 := c1.QueryRange(query, queryStart, queryEnd, scrapeInterval)
169162
res2, err2 := c2.QueryRange(query, queryStart, queryEnd, scrapeInterval)
170163
cases = append(cases, &testCase{

pkg/ingester/ingester.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,11 @@ type Config struct {
137137
AdminLimitMessage string `yaml:"admin_limit_message"`
138138

139139
LabelsStringInterningEnabled bool `yaml:"labels_string_interning_enabled"`
140+
141+
// DisableChunkTrimming allows to disable trimming of matching series chunks based on query Start and End time.
142+
// When disabled, the result may contain samples outside the queried time range but Select() performances
143+
// may be improved.
144+
DisableChunkTrimming bool `yaml:"disable_chunk_trimming"`
140145
}
141146

142147
// RegisterFlags adds the flags required to config this to the given FlagSet
@@ -163,6 +168,8 @@ func (cfg *Config) RegisterFlags(f *flag.FlagSet) {
163168
f.StringVar(&cfg.AdminLimitMessage, "ingester.admin-limit-message", "please contact administrator to raise it", "Customize the message contained in limit errors")
164169

165170
f.BoolVar(&cfg.LabelsStringInterningEnabled, "ingester.labels-string-interning-enabled", false, "Experimental: Enable string interning for metrics labels.")
171+
172+
f.BoolVar(&cfg.DisableChunkTrimming, "ingester.disable-chunk-trimming", false, "Disable trimming of matching series chunks based on query Start and End time. When disabled, the result may contain samples outside the queried time range but select performances may be improved. Note that certain query results might change by changing this option.")
166173
}
167174

168175
func (cfg *Config) Validate() error {
@@ -1985,7 +1992,7 @@ func (i *Ingester) queryStreamChunks(ctx context.Context, db *userTSDB, from, th
19851992
hints := &storage.SelectHints{
19861993
Start: from,
19871994
End: through,
1988-
DisableTrimming: true,
1995+
DisableTrimming: i.cfg.DisableChunkTrimming,
19891996
}
19901997
// It's not required to return sorted series because series are sorted by the Cortex querier.
19911998
ss := q.Select(ctx, false, hints, matchers...)

0 commit comments

Comments
 (0)