mirror of
https://github.com/grafana/grafana.git
synced 2025-07-29 23:22:32 +08:00
Postgres/MySQL/MSSQL: Add setting to limit maximum amount of rows processed (#38986)
Adds a new setting dataproxy.row_limit that allows an operator to limit the amount of rows being processed/accepted in response to database queries originating from SQL data sources. Closes #38975 Ref #39095 Co-authored-by: achatterjee-grafana <70489351+achatterjee-grafana@users.noreply.github.com>
This commit is contained in:

committed by
GitHub

parent
5b7dc16c06
commit
1c892a2fc4
@ -68,6 +68,7 @@ func TestMySQL(t *testing.T) {
|
||||
DSInfo: dsInfo,
|
||||
TimeColumnNames: []string{"time", "time_sec"},
|
||||
MetricColumnTypes: []string{"CHAR", "VARCHAR", "TINYTEXT", "TEXT", "MEDIUMTEXT", "LONGTEXT"},
|
||||
RowLimit: 1000000,
|
||||
}
|
||||
|
||||
rowTransformer := mysqlQueryResultTransformer{
|
||||
@ -1151,6 +1152,85 @@ func TestMySQL(t *testing.T) {
|
||||
require.Equal(t, data.FieldTypeNullableTime, frames[0].Fields[0].Type())
|
||||
require.Equal(t, data.FieldTypeNullableTime, frames[0].Fields[1].Type())
|
||||
})
|
||||
|
||||
t.Run("When row limit set to 1", func(t *testing.T) {
|
||||
dsInfo := sqleng.DataSourceInfo{}
|
||||
config := sqleng.DataPluginConfiguration{
|
||||
DriverName: "mysql",
|
||||
ConnectionString: "",
|
||||
DSInfo: dsInfo,
|
||||
TimeColumnNames: []string{"time", "time_sec"},
|
||||
MetricColumnTypes: []string{"CHAR", "VARCHAR", "TINYTEXT", "TEXT", "MEDIUMTEXT", "LONGTEXT"},
|
||||
RowLimit: 1,
|
||||
}
|
||||
|
||||
queryResultTransformer := mysqlQueryResultTransformer{
|
||||
log: logger,
|
||||
}
|
||||
|
||||
handler, err := sqleng.NewQueryDataHandler(config, &queryResultTransformer, newMysqlMacroEngine(logger), logger)
|
||||
require.NoError(t, err)
|
||||
|
||||
t.Run("When doing a table query that returns 2 rows should limit the result to 1 row", func(t *testing.T) {
|
||||
query := &backend.QueryDataRequest{
|
||||
Queries: []backend.DataQuery{
|
||||
{
|
||||
JSON: []byte(`{
|
||||
"rawSql": "SELECT 1 as value UNION ALL select 2 as value",
|
||||
"format": "table"
|
||||
}`),
|
||||
RefID: "A",
|
||||
TimeRange: backend.TimeRange{
|
||||
From: time.Now(),
|
||||
To: time.Now(),
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
resp, err := handler.QueryData(context.Background(), query)
|
||||
require.NoError(t, err)
|
||||
queryResult := resp.Responses["A"]
|
||||
require.NoError(t, queryResult.Error)
|
||||
frames := queryResult.Frames
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, 1, len(frames))
|
||||
require.Equal(t, 1, len(frames[0].Fields))
|
||||
require.Equal(t, 1, frames[0].Rows())
|
||||
require.Len(t, frames[0].Meta.Notices, 1)
|
||||
require.Equal(t, data.NoticeSeverityWarning, frames[0].Meta.Notices[0].Severity)
|
||||
})
|
||||
|
||||
t.Run("When doing a time series that returns 2 rows should limit the result to 1 row", func(t *testing.T) {
|
||||
query := &backend.QueryDataRequest{
|
||||
Queries: []backend.DataQuery{
|
||||
{
|
||||
JSON: []byte(`{
|
||||
"rawSql": "SELECT 1 as time, 1 as value UNION ALL select 2 as time, 2 as value",
|
||||
"format": "time_series"
|
||||
}`),
|
||||
RefID: "A",
|
||||
TimeRange: backend.TimeRange{
|
||||
From: time.Now(),
|
||||
To: time.Now(),
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
resp, err := handler.QueryData(context.Background(), query)
|
||||
require.NoError(t, err)
|
||||
queryResult := resp.Responses["A"]
|
||||
require.NoError(t, queryResult.Error)
|
||||
frames := queryResult.Frames
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, 1, len(frames))
|
||||
require.Equal(t, 2, len(frames[0].Fields))
|
||||
require.Equal(t, 1, frames[0].Rows())
|
||||
require.Len(t, frames[0].Meta.Notices, 1)
|
||||
require.Equal(t, data.NoticeSeverityWarning, frames[0].Meta.Notices[0].Severity)
|
||||
})
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user