From ef03a32276e12b760ae9a9b2442be1b0095346a3 Mon Sep 17 00:00:00 2001 From: Jimmiehan Date: Mon, 20 Sep 2021 02:03:18 +0800 Subject: [PATCH 1/3] Query: add exemplar.partial-response flag to control partial response (#4676) (#4680) --- CHANGELOG.md | 3 +++ cmd/thanos/query.go | 6 ++++++ pkg/api/query/v1.go | 2 ++ 3 files changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e9c97adf51..18445979a5f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,9 @@ We use *breaking :warning:* to mark changes that are not backward compatible (re ## Unreleased +### 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 ### Added diff --git a/cmd/thanos/query.go b/cmd/thanos/query.go index 797ff8c019a..4d893f212ed 100644 --- a/cmd/thanos/query.go +++ b/cmd/thanos/query.go @@ -146,6 +146,9 @@ 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() + 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."). @@ -254,6 +257,7 @@ func registerQuery(app *extkingpin.App) { *enableRulePartialResponse, *enableTargetPartialResponse, *enableMetricMetadataPartialResponse, + *enableExemplarPartialResponse, fileSD, time.Duration(*dnsSDInterval), *dnsSDResolver, @@ -316,6 +320,7 @@ func runQuery( enableRulePartialResponse bool, enableTargetPartialResponse bool, enableMetricMetadataPartialResponse bool, + enableExemplarPartialResponse bool, fileSD *file.Discovery, dnsSDInterval time.Duration, dnsSDResolver string, @@ -554,6 +559,7 @@ func runQuery( enableRulePartialResponse, enableTargetPartialResponse, enableMetricMetadataPartialResponse, + enableExemplarPartialResponse, queryReplicaLabels, flagsMap, defaultRangeQueryStep, 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, From 2d4d140d7af63ad77ecf8ac1e76cae46e0a64368 Mon Sep 17 00:00:00 2001 From: Jimmiehan Date: Mon, 20 Sep 2021 03:51:17 +0800 Subject: [PATCH 2/3] Query: Fix (*exemplarsStream).receive/(*metricMetadataStream).receive/(*targetsStreamStream).receive infinite loop when target response Unimplemented error (#4676) (#4681) Signed-off-by: hanjm --- pkg/exemplars/proxy.go | 4 ++-- pkg/metadata/proxy.go | 3 ++- pkg/targets/proxy.go | 4 ++-- 3 files changed, 6 insertions(+), 5 deletions(-) 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 != "" { From b894fd6537c8b445aa9d907867e492bb26cebcd5 Mon Sep 17 00:00:00 2001 From: Aditi Ahuja <48997495+metonymic-smokey@users.noreply.github.com> Date: Mon, 20 Sep 2021 11:29:51 +0530 Subject: [PATCH 3/3] minor fix in example (#4678) Signed-off-by: metonymic-smokey --- examples/interactive/interactive_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/interactive/interactive_test.go b/examples/interactive/interactive_test.go index 4080af6a585..2bd00579bc4 100644 --- a/examples/interactive/interactive_test.go +++ b/examples/interactive/interactive_test.go @@ -89,7 +89,7 @@ func createData() (perr error) { // TestReadOnlyThanosSetup runs read only Thanos setup that has data from `maxTimeFresh - 2w` to `maxTimeOld`, with extra monitoring and tracing for full playground experience. // Run with test args `-test.timeout 9999m`. func TestReadOnlyThanosSetup(t *testing.T) { - t.Skip("This is interactive test - it will until you will kill it or curl 'finish' endpoint. Comment and run as normal test to use it!") + t.Skip("This is interactive test - it will run until you will kill it or curl 'finish' endpoint. Comment and run as normal test to use it!") // Create 20k series for 2w of TSDB blocks. Cache them to 'data' dir so we don't need to re-create on every run (it takes ~5m). _, err := os.Stat(data)