Skip to content

Commit 7f8681b

Browse files
authored
make row limit configurable (#165)
* make row limit configurable * add environment variable support
1 parent 35ae785 commit 7f8681b

File tree

3 files changed

+356
-10
lines changed

3 files changed

+356
-10
lines changed

datasource.go

Lines changed: 57 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,23 @@ import (
77
"errors"
88
"fmt"
99
"net/http"
10+
"os"
11+
"strconv"
1012
"sync"
1113
"time"
1214

1315
"github.com/grafana/grafana-plugin-sdk-go/data/sqlutil"
1416

1517
"github.com/grafana/grafana-plugin-sdk-go/backend"
1618
"github.com/grafana/grafana-plugin-sdk-go/backend/instancemgmt"
19+
"github.com/grafana/grafana-plugin-sdk-go/backend/log"
1720
"github.com/grafana/grafana-plugin-sdk-go/backend/resource/httpadapter"
1821
"github.com/grafana/grafana-plugin-sdk-go/data"
1922
)
2023

2124
const defaultKeySuffix = "default"
2225
const defaultRowLimit = int64(-1)
26+
const envRowLimit = "GF_DATAPROXY_ROW_LIMIT"
2327

2428
var (
2529
ErrorMissingMultipleConnectionsConfig = backend.PluginError(errors.New("received connection arguments but the feature is not enabled"))
@@ -68,6 +72,7 @@ func (ds *SQLDatasource) NewDatasource(ctx context.Context, settings backend.Dat
6872
if err != nil {
6973
return nil, backend.DownstreamError(err)
7074
}
75+
7176
ds.connector = conn
7277
mux := http.NewServeMux()
7378
err = ds.registerRoutes(mux)
@@ -78,16 +83,7 @@ func (ds *SQLDatasource) NewDatasource(ctx context.Context, settings backend.Dat
7883
ds.CallResourceHandler = httpadapter.New(mux)
7984
ds.metrics = NewMetrics(settings.Name, settings.Type, EndpointQuery)
8085

81-
config := backend.GrafanaConfigFromContext(ctx)
82-
ds.rowLimit = defaultRowLimit
83-
if ds.EnableRowLimit && config != nil {
84-
sqlConfig, err := config.SQL()
85-
if err != nil {
86-
backend.Logger.Error(fmt.Sprintf("failed setting row limit from sql config: %s", err))
87-
} else {
88-
ds.rowLimit = sqlConfig.RowLimit
89-
}
90-
}
86+
ds.rowLimit = ds.newRowLimit(ctx, conn)
9187

9288
return ds, nil
9389
}
@@ -309,3 +305,54 @@ func (ds *SQLDatasource) errors(response *Response) error {
309305
func (ds *SQLDatasource) GetRowLimit() int64 {
310306
return ds.rowLimit
311307
}
308+
309+
func (ds *SQLDatasource) SetDefaultRowLimit(limit int64) {
310+
ds.EnableRowLimit = true
311+
ds.rowLimit = limit
312+
}
313+
314+
// newRowLimit returns the row limit for the datasource
315+
// It checks in the following order:
316+
// 1. set in the datasource configuration page
317+
// 2. set via the environment variable
318+
// 3. set is set on grafana_ini and passed via grafana context
319+
// 4. default row limit set by SetDefaultRowLimit
320+
func (ds *SQLDatasource) newRowLimit(ctx context.Context, conn *Connector) int64 {
321+
if !ds.EnableRowLimit {
322+
return defaultRowLimit
323+
}
324+
325+
// Handles when row limit is set in the datasource configuration page
326+
settingsLimit := conn.driverSettings.RowLimit
327+
if settingsLimit != 0 {
328+
return settingsLimit
329+
}
330+
331+
// Handles when row limit is set via environment variable
332+
envLimit := os.Getenv(envRowLimit)
333+
if envLimit != "" {
334+
l, err := strconv.ParseInt(envLimit, 10, 64)
335+
if err == nil && l >= 0 {
336+
return l
337+
}
338+
log.DefaultLogger.Error(fmt.Sprintf("failed setting row limit from environment variable: %s", err))
339+
}
340+
341+
// Handles row limit from sql config from grafana instance
342+
config := backend.GrafanaConfigFromContext(ctx)
343+
if ds.EnableRowLimit && config != nil {
344+
sqlConfig, err := config.SQL()
345+
if err != nil {
346+
backend.Logger.Error(fmt.Sprintf("failed setting row limit from sql config: %s", err))
347+
} else {
348+
return sqlConfig.RowLimit
349+
}
350+
}
351+
352+
// handles SetDefaultRowLimit where it is set before the datasource is initialized
353+
if ds.rowLimit != 0 {
354+
return ds.rowLimit
355+
}
356+
357+
return defaultRowLimit
358+
}

0 commit comments

Comments
 (0)