grafana/pkg/tsdb/elasticsearch/error_handling_test.go
Ivana Huckova a1718aafce
Elasticsearch: Add error source for DataQuery (#77386)
* WIP

* Refactor, plus update source of error in response_parser

* Adjust test

* Use methods and httpclient from errorsource

* Update pkg/tsdb/elasticsearch/data_query.go

Co-authored-by: Scott Lepper <scott.lepper@gmail.com>

* Return nil error

* Fix test

* Fix integration test

---------

Co-authored-by: Scott Lepper <scott.lepper@gmail.com>
2023-11-06 11:36:39 +01:00

151 lines
3.6 KiB
Go

package elasticsearch
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestErrorAvgMissingField(t *testing.T) {
query := []byte(`
[
{
"refId": "A",
"metrics": [
{ "type": "avg", "id": "1" }
],
"bucketAggs": [
{ "type": "date_histogram", "field": "@timestamp", "id": "2" }
]
}
]
`)
response := []byte(`
{
"error": {
"reason": "Required one of fields [field, script], but none were specified. ",
"root_cause": [
{
"reason": "Required one of fields [field, script], but none were specified. ",
"type": "illegal_argument_exception"
}
],
"type": "illegal_argument_exception"
},
"status": 400
}
`)
result, err := queryDataTestWithResponseCode(query, 400, response)
require.NoError(t, err)
// FIXME: we should return the received error message
require.Len(t, result.response.Responses, 0)
}
func TestErrorAvgMissingFieldNoDetailedErrors(t *testing.T) {
query := []byte(`
[
{
"refId": "A",
"metrics": [
{ "type": "avg", "id": "1" }
],
"bucketAggs": [
{ "type": "date_histogram", "field": "@timestamp", "id": "2" }
]
}
]
`)
// you can receive such an error if you configure elastic with:
// http.detailed_errors.enabled=false
response := []byte(`
{ "error": "No ElasticsearchException found", "status": 400 }
`)
result, err := queryDataTestWithResponseCode(query, 400, response)
require.NoError(t, err)
// FIXME: we should return the received error message
require.Len(t, result.response.Responses, 0)
}
func TestErrorTooManyDateHistogramBuckets(t *testing.T) {
query := []byte(`
[
{
"refId": "A",
"metrics": [
{ "type": "count", "id": "1" }
],
"bucketAggs": [
{ "type": "date_histogram", "field": "@timestamp", "settings": { "interval": "10s" }, "id": "2" }
]
}
]
`)
response := []byte(`
{
"responses": [
{
"error": {
"caused_by": {
"max_buckets": 65536,
"reason": "Trying to create too many buckets. Must be less than or equal to: [65536].",
"type": "too_many_buckets_exception"
},
"reason": "",
"root_cause": [],
"type": "search_phase_execution_exception"
},
"status": 503
}
]
}
`)
result, err := queryDataTestWithResponseCode(query, 200, response)
require.NoError(t, err)
require.Len(t, result.response.Responses, 1)
dataResponse, ok := result.response.Responses["A"]
require.True(t, ok)
require.Len(t, dataResponse.Frames, 0)
require.ErrorContains(t, dataResponse.Error, "Trying to create too many buckets. Must be less than or equal to: [65536].")
}
func TestNonElasticError(t *testing.T) {
query := []byte(`
[
{
"refId": "A",
"metrics": [
{ "type": "count", "id": "1" }
],
"bucketAggs": [
{ "type": "date_histogram", "field": "@timestamp", "settings": { "interval": "10s" }, "id": "2" }
]
}
]
`)
// this scenario is about an error-message that does not come directly from elastic,
// but from a middleware/proxy server that for example reports that it is forbidden
// to access the database for some reason.
response := []byte(`Access to the database is forbidden`)
res, err := queryDataTestWithResponseCode(query, 403, response)
// FIXME: we should return something better.
// currently it returns the error-message about being unable to decode JSON
// it is not 100% clear what we should return to the browser
// (and what to debug-log for example), we could return
// at least something like "unknown response, http status code 403"
require.NoError(t, err)
require.Contains(t, res.response.Responses["A"].Error.Error(), "invalid character")
}