diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e9c97adf51..a13e001e367 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,10 @@ NOTE: As semantic versioning states all 0.y.z releases can contain breaking chan We use *breaking :warning:* to mark changes that are not backward compatible (relates only to v0.y.z releases.) ## Unreleased +- [#4679](https://github.com/thanos-io/thanos/pull/4679) Added `enable-feature` flag to enable negative offsets and @ modifier, similar to Prometheus. + +### Added +- [#4680](https://github.com/thanos-io/thanos/pull/4680) Query: add `exemplar.partial-response` flag to control partial response. ## v0.23.0 - In Progress diff --git a/cmd/thanos/query.go b/cmd/thanos/query.go index 797ff8c019a..c83403597a6 100644 --- a/cmd/thanos/query.go +++ b/cmd/thanos/query.go @@ -146,6 +146,11 @@ func registerQuery(app *extkingpin.App) { enableMetricMetadataPartialResponse := cmd.Flag("metric-metadata.partial-response", "Enable partial response for metric metadata endpoint. --no-metric-metadata.partial-response for disabling."). Hidden().Default("true").Bool() + featureList := cmd.Flag("enable-feature", "Comma separated experimental feature names to enable.The current list of features is promql-negative-offset and promql-at-modifier.").Default("").Strings() + + enableExemplarPartialResponse := cmd.Flag("exemplar.partial-response", "Enable partial response for exemplar endpoint. --no-exemplar.partial-response for disabling."). + Hidden().Default("true").Bool() + defaultEvaluationInterval := extkingpin.ModelDuration(cmd.Flag("query.default-evaluation-interval", "Set default evaluation interval for sub queries.").Default("1m")) defaultRangeQueryStep := extkingpin.ModelDuration(cmd.Flag("query.default-step", "Set default step for range queries. Default step is only used when step is not set in UI. In such cases, Thanos UI will use default step to calculate resolution (resolution = max(rangeSeconds / 250, defaultStep)). This will not work from Grafana, but Grafana has __step variable which can be used."). @@ -160,6 +165,16 @@ func registerQuery(app *extkingpin.App) { return errors.Wrap(err, "parse federation labels") } + var enableNegativeOffset, enableAtModifier bool + for _, feature := range *featureList { + if feature == "promql-negative-offset" { + enableNegativeOffset = true + } + if feature == "promql-at-modifier" { + enableAtModifier = true + } + } + if dup := firstDuplicate(*stores); dup != "" { return errors.Errorf("Address %s is duplicated for --store flag.", dup) } @@ -254,6 +269,7 @@ func registerQuery(app *extkingpin.App) { *enableRulePartialResponse, *enableTargetPartialResponse, *enableMetricMetadataPartialResponse, + *enableExemplarPartialResponse, fileSD, time.Duration(*dnsSDInterval), *dnsSDResolver, @@ -262,6 +278,8 @@ func registerQuery(app *extkingpin.App) { *defaultMetadataTimeRange, *strictStores, *webDisableCORS, + enableAtModifier, + enableNegativeOffset, component.Query, ) }) @@ -316,6 +334,7 @@ func runQuery( enableRulePartialResponse bool, enableTargetPartialResponse bool, enableMetricMetadataPartialResponse bool, + enableExemplarPartialResponse bool, fileSD *file.Discovery, dnsSDInterval time.Duration, dnsSDResolver string, @@ -324,6 +343,8 @@ func runQuery( defaultMetadataTimeRange time.Duration, strictStores []string, disableCORS bool, + enableAtModifier bool, + enableNegativeOffset bool, comp component.Component, ) error { // TODO(bplotka in PR #513 review): Move arguments into struct. @@ -451,6 +472,14 @@ func runQuery( cancelRun() }) + if enableAtModifier { + engineOpts.EnableAtModifier = true + } + + if enableNegativeOffset { + engineOpts.EnableNegativeOffset = true + } + ctxUpdate, cancelUpdate := context.WithCancel(context.Background()) g.Add(func() error { for { @@ -554,6 +583,7 @@ func runQuery( enableRulePartialResponse, enableTargetPartialResponse, enableMetricMetadataPartialResponse, + enableExemplarPartialResponse, queryReplicaLabels, flagsMap, defaultRangeQueryStep, diff --git a/docs/components/query.md b/docs/components/query.md index 63f7dd0a2cf..cfebbb35cfe 100644 --- a/docs/components/query.md +++ b/docs/components/query.md @@ -252,6 +252,9 @@ Query node exposing PromQL enabled Query API with data retrieved from multiple store nodes. Flags: + --enable-feature=... Comma separated experimental feature names + to enable.The current list of features is + promql-negative-offset and promql-at-modifier. --grpc-address="0.0.0.0:10901" Listen ip:port address for gRPC endpoints (StoreAPI). Make sure this address is routable diff --git a/pkg/api/query/v1.go b/pkg/api/query/v1.go index 6126125278d..4f3866b62b7 100644 --- a/pkg/api/query/v1.go +++ b/pkg/api/query/v1.go @@ -118,6 +118,7 @@ func NewQueryAPI( enableRulePartialResponse bool, enableTargetPartialResponse bool, enableMetricMetadataPartialResponse bool, + enableExemplarPartialResponse bool, replicaLabels []string, flagsMap map[string]string, defaultRangeQueryStep time.Duration, @@ -143,6 +144,7 @@ func NewQueryAPI( enableRulePartialResponse: enableRulePartialResponse, enableTargetPartialResponse: enableTargetPartialResponse, enableMetricMetadataPartialResponse: enableMetricMetadataPartialResponse, + enableExemplarPartialResponse: enableExemplarPartialResponse, replicaLabels: replicaLabels, endpointSet: endpointSet, defaultRangeQueryStep: defaultRangeQueryStep, diff --git a/pkg/exemplars/proxy.go b/pkg/exemplars/proxy.go index b0f23b229e4..9bd3b433bcf 100644 --- a/pkg/exemplars/proxy.go +++ b/pkg/exemplars/proxy.go @@ -191,8 +191,8 @@ func (stream *exemplarsStream) receive(ctx context.Context) error { if err := stream.server.Send(exemplarspb.NewWarningExemplarsResponse(err)); err != nil { return errors.Wrapf(err, "sending exemplars error to server %v", stream.server) } - - continue + // Not an error if response strategy is warning. + return nil } if w := exemplar.GetWarning(); w != "" { diff --git a/pkg/metadata/proxy.go b/pkg/metadata/proxy.go index 80d0c8a0471..2bf1a4a276c 100644 --- a/pkg/metadata/proxy.go +++ b/pkg/metadata/proxy.go @@ -135,7 +135,8 @@ func (stream *metricMetadataStream) receive(ctx context.Context) error { return errors.Wrapf(err, "sending metadata error to server %v", stream.server) } - continue + // Not an error if response strategy is warning. + return nil } if w := resp.GetWarning(); w != "" { diff --git a/pkg/targets/proxy.go b/pkg/targets/proxy.go index d92ffa6c026..dd33b8cc303 100644 --- a/pkg/targets/proxy.go +++ b/pkg/targets/proxy.go @@ -119,8 +119,8 @@ func (stream *targetsStream) receive(ctx context.Context) error { if err := stream.server.Send(targetspb.NewWarningTargetsResponse(err)); err != nil { return errors.Wrapf(err, "sending targets error to server %v", stream.server) } - - continue + // Not an error if response strategy is warning. + return nil } if w := target.GetWarning(); w != "" {