From 6e776d0fec50375ffa89b01e299834b469227f27 Mon Sep 17 00:00:00 2001 From: Victor Marin <36818606+mdvictor@users.noreply.github.com> Date: Fri, 11 Nov 2022 21:04:08 +0200 Subject: [PATCH] MSSQL: Add connection timeout setting in configuration page (#58631) * MSSQL add connection timeout * add docs * Update docs and add min value to the timeout setting --- docs/sources/datasources/mssql/_index.md | 5 ++++ pkg/tsdb/mssql/mssql.go | 14 +++++++---- pkg/tsdb/sqleng/sql_engine.go | 1 + .../configuration/ConfigurationEditor.tsx | 24 +++++++++++++++++++ public/app/plugins/datasource/mssql/types.ts | 1 + 5 files changed, 41 insertions(+), 4 deletions(-) diff --git a/docs/sources/datasources/mssql/_index.md b/docs/sources/datasources/mssql/_index.md index dd5f08a3dcd..30ac2bb5f3d 100644 --- a/docs/sources/datasources/mssql/_index.md +++ b/docs/sources/datasources/mssql/_index.md @@ -77,6 +77,10 @@ For example, use `1m` if Microsoft SQL Server writes data every minute. You can also override this setting in a dashboard panel under its data source options. +### Connection timeout + +The **Connection timeout** setting defines the maximum number of seconds to wait for a connection to the database before timing out. Default is 0 for no timeout. + ### Database user permissions Grafana doesn't validate that a query is safe, and could include any SQL statement. @@ -119,6 +123,7 @@ datasources: maxOpenConns: 0 # Grafana v5.4+ maxIdleConns: 2 # Grafana v5.4+ connMaxLifetime: 14400 # Grafana v5.4+ + connectionTimeout: 0 # Grafana v9.3+ secureJsonData: password: 'Password!' ``` diff --git a/pkg/tsdb/mssql/mssql.go b/pkg/tsdb/mssql/mssql.go index f2312a822cd..adb90f85988 100644 --- a/pkg/tsdb/mssql/mssql.go +++ b/pkg/tsdb/mssql/mssql.go @@ -55,10 +55,11 @@ func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest) func newInstanceSettings(cfg *setting.Cfg) datasource.InstanceFactoryFunc { return func(settings backend.DataSourceInstanceSettings) (instancemgmt.Instance, error) { jsonData := sqleng.JsonData{ - MaxOpenConns: 0, - MaxIdleConns: 2, - ConnMaxLifetime: 14400, - Encrypt: "false", + MaxOpenConns: 0, + MaxIdleConns: 2, + ConnMaxLifetime: 14400, + Encrypt: "false", + ConnectionTimeout: 0, } err := json.Unmarshal(settings.JSONData, &jsonData) @@ -171,6 +172,11 @@ func generateConnectionString(dsInfo sqleng.DataSourceInfo) (string, error) { } else if encrypt == "disable" { connStr += fmt.Sprintf("encrypt=%s;", dsInfo.JsonData.Encrypt) } + + if dsInfo.JsonData.ConnectionTimeout != 0 { + connStr += fmt.Sprintf("connection timeout=%d;", dsInfo.JsonData.ConnectionTimeout) + } + return connStr, nil } diff --git a/pkg/tsdb/sqleng/sql_engine.go b/pkg/tsdb/sqleng/sql_engine.go index bce2ef26312..a837ec8bf63 100644 --- a/pkg/tsdb/sqleng/sql_engine.go +++ b/pkg/tsdb/sqleng/sql_engine.go @@ -54,6 +54,7 @@ type JsonData struct { MaxOpenConns int `json:"maxOpenConns"` MaxIdleConns int `json:"maxIdleConns"` ConnMaxLifetime int `json:"connMaxLifetime"` + ConnectionTimeout int `json:"connectionTimeout"` Timescaledb bool `json:"timescaledb"` Mode string `json:"sslmode"` ConfigurationMethod string `json:"tlsConfigurationMethod"` diff --git a/public/app/plugins/datasource/mssql/configuration/ConfigurationEditor.tsx b/public/app/plugins/datasource/mssql/configuration/ConfigurationEditor.tsx index 80f6a3c7ec7..c17468f45a5 100644 --- a/public/app/plugins/datasource/mssql/configuration/ConfigurationEditor.tsx +++ b/public/app/plugins/datasource/mssql/configuration/ConfigurationEditor.tsx @@ -21,6 +21,7 @@ import { Select, useStyles2, } from '@grafana/ui'; +import { NumberInput } from 'app/core/components/OptionsUI/NumberInput'; import { ConnectionLimits } from 'app/features/plugins/sql/components/configuration/ConnectionLimits'; import { MSSQLAuthenticationType, MSSQLEncryptOptions, MssqlOptions } from '../types'; @@ -60,6 +61,10 @@ export const ConfigurationEditor = (props: DataSourcePluginOptionsEditorProps { + updateDatasourcePluginJsonDataOption(props, 'connectionTimeout', connectionTimeout ?? 0); + }; + const authenticationOptions: Array> = [ { value: MSSQLAuthenticationType.sqlAuth, label: 'SQL Server Authentication' }, { value: MSSQLAuthenticationType.windowsAuth, label: 'Windows Authentication' }, @@ -74,6 +79,7 @@ export const ConfigurationEditor = (props: DataSourcePluginOptionsEditorProps @@ -233,6 +239,7 @@ export const ConfigurationEditor = (props: DataSourcePluginOptionsEditorProps } label="Min time interval" + labelWidth={labelWidthDetails} > + + The number of seconds to wait before canceling the request when connecting to the database. The default is{' '} + 0, meaning no timeout. + + } + label="Connection timeout" + labelWidth={labelWidthDetails} + > + + diff --git a/public/app/plugins/datasource/mssql/types.ts b/public/app/plugins/datasource/mssql/types.ts index 2f93dd07977..c44d0bda761 100644 --- a/public/app/plugins/datasource/mssql/types.ts +++ b/public/app/plugins/datasource/mssql/types.ts @@ -15,4 +15,5 @@ export interface MssqlOptions extends SQLOptions { encrypt?: MSSQLEncryptOptions; sslRootCertFile?: string; serverName?: string; + connectionTimeout?: number; }