Datasources: Refactor mixed datasource support to improve concurrency and error handling (#58163)

* recover from panic inside mixed ds query loop

* remove accidental commit

* add messages from panics and errors to the query response

* refactor based on PR comments

* quick update to unit test to verify mixed errors and successes

* reduce concurrency limit
This commit is contained in:
Michael Mandrus
2022-11-28 10:21:54 -05:00
committed by GitHub
parent 958aadd54a
commit 40d87d9d40
2 changed files with 62 additions and 19 deletions
+15 -8
View File
@@ -406,7 +406,8 @@ func TestQueryDataMultipleSources(t *testing.T) {
"datasource": {
"type": "mysql",
"uid": "ds1"
}
},
"refId": "A"
}
`))
require.NoError(t, err)
@@ -415,7 +416,8 @@ func TestQueryDataMultipleSources(t *testing.T) {
"datasource": {
"type": "mysql",
"uid": "ds2"
}
},
"refId": "B"
}
`))
require.NoError(t, err)
@@ -436,7 +438,6 @@ func TestQueryDataMultipleSources(t *testing.T) {
t.Run("can query multiple datasources with an expression present", func(t *testing.T) {
tc := setup(t)
// refId does get set if not included, but better to include it explicitly here
query1, err := simplejson.NewJson([]byte(`
{
"datasource": {
@@ -452,7 +453,8 @@ func TestQueryDataMultipleSources(t *testing.T) {
"datasource": {
"type": "mysql",
"uid": "ds2"
}
},
"refId": "B"
}
`))
require.NoError(t, err)
@@ -493,7 +495,7 @@ func TestQueryDataMultipleSources(t *testing.T) {
require.NoError(t, err)
})
t.Run("error is returned when one of the queries fails", func(t *testing.T) {
t.Run("error is returned in query when one of the queries fails", func(t *testing.T) {
tc := setup(t)
query1, _ := simplejson.NewJson([]byte(`
@@ -501,7 +503,8 @@ func TestQueryDataMultipleSources(t *testing.T) {
"datasource": {
"type": "mysql",
"uid": "ds1"
}
},
"refId": "A"
}
`))
query2, _ := simplejson.NewJson([]byte(`
@@ -510,6 +513,7 @@ func TestQueryDataMultipleSources(t *testing.T) {
"type": "prometheus",
"uid": "ds2"
},
"refId": "B",
"queryType": "FAIL"
}
`))
@@ -525,9 +529,12 @@ func TestQueryDataMultipleSources(t *testing.T) {
HTTPRequest: nil,
}
_, err := tc.queryService.QueryData(context.Background(), tc.signedInUser, true, reqDTO)
res, err := tc.queryService.QueryData(context.Background(), tc.signedInUser, true, reqDTO)
require.Error(t, err)
require.NoError(t, err)
require.Error(t, res.Responses["B"].Error)
// Responses aren't mocked, so a "healthy" query will just return an empty response
require.NotContains(t, res.Responses, "A")
})
}