diff --git a/pkg/tsdb/elasticsearch/client/client.go b/pkg/tsdb/elasticsearch/client/client.go index 1b4457cd087..2f840796531 100644 --- a/pkg/tsdb/elasticsearch/client/client.go +++ b/pkg/tsdb/elasticsearch/client/client.go @@ -308,12 +308,20 @@ func (c *baseClientImpl) createMultiSearchRequests(searchRequests []*SearchReque } func (c *baseClientImpl) getMultiSearchQueryParameters() string { + var qs []string + if c.version >= 70 { maxConcurrentShardRequests := c.getSettings().Get("maxConcurrentShardRequests").MustInt(5) - return fmt.Sprintf("max_concurrent_shard_requests=%d", maxConcurrentShardRequests) + qs = append(qs, fmt.Sprintf("max_concurrent_shard_requests=%d", maxConcurrentShardRequests)) + + includeFrozen := c.getSettings().Get("includeFrozen").MustBool(false) + + if includeFrozen { + qs = append(qs, "ignore_throttled=false") + } } - return "" + return strings.Join(qs, "&") } func (c *baseClientImpl) MultiSearch() *MultiSearchRequestBuilder { diff --git a/pkg/tsdb/elasticsearch/client/client_test.go b/pkg/tsdb/elasticsearch/client/client_test.go index 993310d6beb..222272a33f1 100644 --- a/pkg/tsdb/elasticsearch/client/client_test.go +++ b/pkg/tsdb/elasticsearch/client/client_test.go @@ -250,6 +250,7 @@ func TestClient(t *testing.T) { "maxConcurrentShardRequests": 100, "timeField": "@timestamp", "interval": "Daily", + "includeFrozen": true, }), }, func(sc *scenarioContext) { sc.responseBody = `{ @@ -271,6 +272,7 @@ func TestClient(t *testing.T) { So(sc.request, ShouldNotBeNil) So(sc.request.Method, ShouldEqual, http.MethodPost) So(sc.request.URL.Path, ShouldEqual, "/_msearch") + So(sc.request.URL.RawQuery, ShouldNotContainSubstring, "ignore_throttled=") So(sc.requestBody, ShouldNotBeNil) @@ -312,6 +314,7 @@ func TestClient(t *testing.T) { "maxConcurrentShardRequests": 6, "timeField": "@timestamp", "interval": "Daily", + "includeFrozen": true, }), }, func(sc *scenarioContext) { sc.responseBody = `{ @@ -333,7 +336,8 @@ func TestClient(t *testing.T) { So(sc.request, ShouldNotBeNil) So(sc.request.Method, ShouldEqual, http.MethodPost) So(sc.request.URL.Path, ShouldEqual, "/_msearch") - So(sc.request.URL.RawQuery, ShouldEqual, "max_concurrent_shard_requests=6") + So(sc.request.URL.RawQuery, ShouldContainSubstring, "max_concurrent_shard_requests=6") + So(sc.request.URL.RawQuery, ShouldContainSubstring, "ignore_throttled=false") So(sc.requestBody, ShouldNotBeNil) @@ -350,6 +354,7 @@ func TestClient(t *testing.T) { So(jHeader.Get("index").MustString(), ShouldEqual, "metrics-2018.05.15") So(jHeader.Get("ignore_unavailable").MustBool(false), ShouldEqual, true) So(jHeader.Get("search_type").MustString(), ShouldEqual, "query_then_fetch") + So(jHeader.Get("ignore_throttled").MustBool(), ShouldBeFalse) Convey("and replace $__interval variable", func() { So(jBody.GetPath("aggs", "2", "aggs", "1", "avg", "script").MustString(), ShouldEqual, "15000*@hostname") diff --git a/public/app/plugins/datasource/elasticsearch/configuration/ConfigEditor.tsx b/public/app/plugins/datasource/elasticsearch/configuration/ConfigEditor.tsx index 9d6e87e8f72..328d0696b81 100644 --- a/public/app/plugins/datasource/elasticsearch/configuration/ConfigEditor.tsx +++ b/public/app/plugins/datasource/elasticsearch/configuration/ConfigEditor.tsx @@ -18,6 +18,7 @@ export const ConfigEditor = (props: Props) => { jsonData: { ...options.jsonData, timeField: options.jsonData.timeField || '@timestamp', + includeFrozen: options.jsonData.includeFrozen ?? false, esVersion, maxConcurrentShardRequests: options.jsonData.maxConcurrentShardRequests || defaultMaxConcurrentShardRequests(esVersion), diff --git a/public/app/plugins/datasource/elasticsearch/configuration/ElasticDetails.tsx b/public/app/plugins/datasource/elasticsearch/configuration/ElasticDetails.tsx index 2c26f3007db..7cf35144874 100644 --- a/public/app/plugins/datasource/elasticsearch/configuration/ElasticDetails.tsx +++ b/public/app/plugins/datasource/elasticsearch/configuration/ElasticDetails.tsx @@ -1,8 +1,8 @@ import React from 'react'; import { EventsWithValidation, regexValidation, LegacyForms } from '@grafana/ui'; -const { Select, Input, FormField } = LegacyForms; +const { Select, Input, FormField, Switch } = LegacyForms; import { ElasticsearchOptions } from '../types'; -import { DataSourceSettings, SelectableValue } from '@grafana/data'; +import { DataSourceSettings, onUpdateDatasourceJsonDataOptionChecked, SelectableValue } from '@grafana/data'; const indexPatternTypes = [ { label: 'No pattern', value: 'none' }, @@ -144,11 +144,29 @@ export const ElasticDetails = (props: Props) => { /> + {value.jsonData.esVersion >= 70 && ( +