feat(inputs.sqlserver): introduce timeout for query execution (#12319)

This commit is contained in:
goswamisandeep 2022-12-06 19:54:19 +05:30 committed by GitHub
parent 41c9af5bb8
commit e44129869c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 21 additions and 1 deletions

View File

@ -134,6 +134,11 @@ See the [CONFIGURATION.md][CONFIGURATION.md] for more details.
"Server=192.168.1.10;Port=1433;User Id=<user>;Password=<pw>;app name=telegraf;log=1;",
]
## Timeout for query execution operation
## Note that the timeout for queries is per query not per gather.
## 0 value means no timeout
# query_timeout = "0s"
## Authentication method
## valid methods: "connection_string", "AAD"
# auth_method = "connection_string"

View File

@ -11,6 +11,11 @@
"Server=192.168.1.10;Port=1433;User Id=<user>;Password=<pw>;app name=telegraf;log=1;",
]
## Timeout for query execution operation
## Note that the timeout for queries is per query not per gather.
## 0 value means no timeout
# query_timeout = "0s"
## Authentication method
## valid methods: "connection_string", "AAD"
# auth_method = "connection_string"

View File

@ -2,6 +2,7 @@
package sqlserver
import (
"context"
"database/sql"
_ "embed"
"errors"
@ -14,6 +15,7 @@ import (
mssql "github.com/denisenkom/go-mssqldb"
"github.com/influxdata/telegraf"
"github.com/influxdata/telegraf/config"
"github.com/influxdata/telegraf/filter"
"github.com/influxdata/telegraf/plugins/inputs"
)
@ -24,6 +26,7 @@ var sampleConfig string
// SQLServer struct
type SQLServer struct {
Servers []string `toml:"servers"`
QueryTimeout config.Duration `toml:"query_timeout"`
AuthMethod string `toml:"auth_method"`
QueryVersion int `toml:"query_version" deprecated:"1.16.0;use 'database_type' instead"`
AzureDB bool `toml:"azuredb" deprecated:"1.16.0;use 'database_type' instead"`
@ -294,7 +297,14 @@ func (s *SQLServer) Stop() {
func (s *SQLServer) gatherServer(pool *sql.DB, query Query, acc telegraf.Accumulator, connectionString string) error {
// execute query
rows, err := pool.Query(query.Script)
ctx := context.Background()
// Use the query timeout if any
if s.QueryTimeout > 0 {
var cancel context.CancelFunc
ctx, cancel = context.WithTimeout(ctx, time.Duration(s.QueryTimeout))
defer cancel()
}
rows, err := pool.QueryContext(ctx, query.Script)
if err != nil {
serverName, databaseName := getConnectionIdentifiers(connectionString)