Elasticsearch: Run log context queries through backend (#65805)
* Elasticsearch: Run context queries trough backend * Fix typing * Update * Add possibility to run context query torugh backend and frontend * Correctly sort
This commit is contained in:
@@ -73,10 +73,21 @@ func (b *SearchRequestBuilder) Size(size int) *SearchRequestBuilder {
|
||||
return b
|
||||
}
|
||||
|
||||
// SortDesc adds a sort to the search request
|
||||
func (b *SearchRequestBuilder) SortDesc(field, unmappedType string) *SearchRequestBuilder {
|
||||
type SortOrder string
|
||||
|
||||
const (
|
||||
SortOrderAsc SortOrder = "asc"
|
||||
SortOrderDesc SortOrder = "desc"
|
||||
)
|
||||
|
||||
// Sort adds a "asc" | "desc" sort to the search request
|
||||
func (b *SearchRequestBuilder) Sort(order SortOrder, field string, unmappedType string) *SearchRequestBuilder {
|
||||
if order != SortOrderAsc && order != SortOrderDesc {
|
||||
return b
|
||||
}
|
||||
|
||||
props := map[string]string{
|
||||
"order": "desc",
|
||||
"order": string(order),
|
||||
}
|
||||
|
||||
if unmappedType != "" {
|
||||
@@ -110,6 +121,16 @@ func (b *SearchRequestBuilder) AddHighlight() *SearchRequestBuilder {
|
||||
return b
|
||||
}
|
||||
|
||||
func (b *SearchRequestBuilder) AddSearchAfter(value interface{}) *SearchRequestBuilder {
|
||||
if b.customProps["search_after"] == nil {
|
||||
b.customProps["search_after"] = []interface{}{value}
|
||||
} else {
|
||||
b.customProps["search_after"] = append(b.customProps["search_after"].([]interface{}), value)
|
||||
}
|
||||
|
||||
return b
|
||||
}
|
||||
|
||||
// Query creates and return a query builder
|
||||
func (b *SearchRequestBuilder) Query() *QueryBuilder {
|
||||
if b.queryBuilder == nil {
|
||||
|
||||
@@ -45,7 +45,7 @@ func TestSearchRequest(t *testing.T) {
|
||||
t.Run("When adding size, sort, filters", func(t *testing.T) {
|
||||
b := setup()
|
||||
b.Size(200)
|
||||
b.SortDesc(timeField, "boolean")
|
||||
b.Sort(SortOrderDesc, timeField, "boolean")
|
||||
filters := b.Query().Bool().Filter()
|
||||
filters.AddDateRangeFilter(timeField, 10, 5, DateFormatEpochMS)
|
||||
filters.AddQueryStringFilter("test", true)
|
||||
|
||||
@@ -317,12 +317,24 @@ func isRawDocumentQuery(query *Query) bool {
|
||||
|
||||
func processLogsQuery(q *Query, b *es.SearchRequestBuilder, from, to int64, defaultTimeField string) {
|
||||
metric := q.Metrics[0]
|
||||
b.SortDesc(defaultTimeField, "boolean")
|
||||
b.SortDesc("_doc", "")
|
||||
sort := es.SortOrderDesc
|
||||
if metric.Settings.Get("sortDirection").MustString() == "asc" {
|
||||
// This is currently used only for log context query
|
||||
sort = es.SortOrderAsc
|
||||
}
|
||||
b.Sort(sort, defaultTimeField, "boolean")
|
||||
b.Sort(sort, "_doc", "")
|
||||
b.AddDocValueField(defaultTimeField)
|
||||
b.Size(stringToIntWithDefaultValue(metric.Settings.Get("limit").MustString(), defaultSize))
|
||||
b.AddHighlight()
|
||||
|
||||
// This is currently used only for log context query to get
|
||||
// log lines before and after the selected log line
|
||||
searchAfter := metric.Settings.Get("searchAfter").MustArray()
|
||||
for _, value := range searchAfter {
|
||||
b.AddSearchAfter(value)
|
||||
}
|
||||
|
||||
// For log query, we add a date histogram aggregation
|
||||
aggBuilder := b.Agg()
|
||||
q.BucketAggs = append(q.BucketAggs, &BucketAgg{
|
||||
@@ -342,8 +354,8 @@ func processLogsQuery(q *Query, b *es.SearchRequestBuilder, from, to int64, defa
|
||||
|
||||
func processDocumentQuery(q *Query, b *es.SearchRequestBuilder, from, to int64, defaultTimeField string) {
|
||||
metric := q.Metrics[0]
|
||||
b.SortDesc(defaultTimeField, "boolean")
|
||||
b.SortDesc("_doc", "")
|
||||
b.Sort(es.SortOrderDesc, defaultTimeField, "boolean")
|
||||
b.Sort(es.SortOrderDesc, "_doc", "")
|
||||
b.AddDocValueField(defaultTimeField)
|
||||
b.Size(stringToIntWithDefaultValue(metric.Settings.Get("size").MustString(), defaultSize))
|
||||
}
|
||||
|
||||
@@ -1354,6 +1354,25 @@ func TestExecuteElasticsearchDataQuery(t *testing.T) {
|
||||
})
|
||||
})
|
||||
|
||||
t.Run("With log context query with sortDirection and searchAfter should return correct query", func(t *testing.T) {
|
||||
c := newFakeClient()
|
||||
_, err := executeElasticsearchDataQuery(c, `{
|
||||
"metrics": [{ "type": "logs", "id": "1", "settings": { "limit": "1000", "sortDirection": "asc", "searchAfter": [1, "2"] }}]
|
||||
}`, from, to)
|
||||
require.NoError(t, err)
|
||||
sr := c.multisearchRequests[0].Requests[0]
|
||||
require.Equal(t, sr.Sort["@timestamp"], map[string]string{"order": "asc", "unmapped_type": "boolean"})
|
||||
require.Equal(t, sr.Sort["_doc"], map[string]string{"order": "asc"})
|
||||
|
||||
searchAfter := sr.CustomProps["search_after"].([]interface{})
|
||||
firstSearchAfter, err := searchAfter[0].(json.Number).Int64()
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, firstSearchAfter, int64(1))
|
||||
secondSearchAfter := searchAfter[1].(string)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, secondSearchAfter, "2")
|
||||
})
|
||||
|
||||
t.Run("With invalid query should return error", (func(t *testing.T) {
|
||||
c := newFakeClient()
|
||||
_, err := executeElasticsearchDataQuery(c, `{
|
||||
|
||||
Reference in New Issue
Block a user