Skip to content

Commit 20354f1

Browse files
authored
fix: sqlserver panic and add labels for sqlserver metrics (#874)
1 parent 65f9808 commit 20354f1

File tree

1 file changed

+23
-7
lines changed

1 file changed

+23
-7
lines changed

inputs/sqlserver/sqlserver.go

+23-7
Original file line numberDiff line numberDiff line change
@@ -224,16 +224,17 @@ func (s *Instance) Gather(slist *types.SampleList) {
224224
var wg sync.WaitGroup
225225
var mutex sync.Mutex
226226
var healthMetrics = make(map[string]*HealthMetric)
227-
tags := map[string]string{}
228227
for i, pool := range s.pools {
229228
wg.Add(1)
230229
query_up := Query{ScriptName: "SQLServerUp", Script: sqlServerUp, ResultByRow: false}
231230
go func(pool *sql.DB, query Query, serverIndex int) {
232231
defer wg.Done()
232+
tags := map[string]string{}
233233
connectionString := s.Servers[serverIndex]
234234
serverName, databaseName := getConnectionIdentifiers(connectionString)
235235
tags["serverName"] = serverName
236236
tags["databaseName"] = databaseName
237+
tags[healthMetricInstanceTag] = serverName
237238
rows, err := pool.Query(query.Script)
238239
if err != nil {
239240
slist.PushSample(inputName, "up", 0, tags)
@@ -271,11 +272,11 @@ func (s *Instance) Gather(slist *types.SampleList) {
271272
}
272273

273274
func (s *Instance) gatherServer(pool *sql.DB, query Query, slist *types.SampleList, connectionString string) error {
275+
serverName, databaseName := getConnectionIdentifiers(connectionString)
276+
274277
// execute query
275278
rows, err := pool.Query(query.Script)
276279
if err != nil {
277-
serverName, databaseName := getConnectionIdentifiers(connectionString)
278-
279280
// Error msg based on the format in SSMS. SQLErrorClass() is another term for severity/level: http://msdn.microsoft.com/en-us/library/dd304156.aspx
280281
if sqlerr, ok := err.(mssql.Error); ok {
281282
return fmt.Errorf("query %s failed for server: %s and database: %s with Msg %d, Level %d, State %d:, Line %d, Error: %w", query.ScriptName,
@@ -287,22 +288,28 @@ func (s *Instance) gatherServer(pool *sql.DB, query Query, slist *types.SampleLi
287288

288289
defer rows.Close()
289290

291+
tags := map[string]string{
292+
"serverName": serverName,
293+
"databaseName": databaseName,
294+
healthMetricInstanceTag: serverName,
295+
}
296+
290297
// grab the column information from the result
291298
query.OrderedColumns, err = rows.Columns()
292299
if err != nil {
293300
return err
294301
}
295302

296303
for rows.Next() {
297-
err = s.accRow(query, slist, rows)
304+
err = s.accRow(query, slist, rows, tags)
298305
if err != nil {
299306
return err
300307
}
301308
}
302309
return rows.Err()
303310
}
304311

305-
func (s *Instance) accRow(query Query, slist *types.SampleList, row scanner) error {
312+
func (s *Instance) accRow(query Query, slist *types.SampleList, row scanner, labels map[string]string) error {
306313
var columnVars []interface{}
307314
var fields = make(map[string]interface{})
308315

@@ -324,6 +331,10 @@ func (s *Instance) accRow(query Query, slist *types.SampleList, row scanner) err
324331
// measurement: identified by the header
325332
// tags: all other fields of type string
326333
tags := map[string]string{}
334+
for k, v := range labels {
335+
tags[k] = v
336+
}
337+
327338
var measurement string
328339
for header, val := range columnMap {
329340
if str, ok := (*val).(string); ok {
@@ -343,7 +354,7 @@ func (s *Instance) accRow(query Query, slist *types.SampleList, row scanner) err
343354
if strings.HasPrefix(measurement, inputName) {
344355
slist.PushSample("", measurement+"_value", *columnMap["value"], tags)
345356
} else {
346-
slist.PushSample("", measurement+"_value", *columnMap["value"], tags)
357+
slist.PushSample(inputName, measurement+"_value", *columnMap["value"], tags)
347358
}
348359

349360
} else {
@@ -383,7 +394,12 @@ func (s *Instance) gatherHealth(healthMetrics map[string]*HealthMetric, serv str
383394
func (s *Instance) accHealth(healthMetrics map[string]*HealthMetric, slist *types.SampleList) {
384395
for connectionString, connectionStats := range healthMetrics {
385396
sqlInstance, databaseName := getConnectionIdentifiers(connectionString)
386-
tags := map[string]string{healthMetricInstanceTag: sqlInstance, healthMetricDatabaseTag: databaseName}
397+
tags := map[string]string{
398+
healthMetricInstanceTag: sqlInstance,
399+
healthMetricDatabaseTag: databaseName,
400+
"serverName": sqlInstance,
401+
"databaseName": databaseName,
402+
}
387403
fields := map[string]interface{}{
388404
healthMetricAttemptedQueries: connectionStats.AttemptedQueries,
389405
healthMetricSuccessfulQueries: connectionStats.SuccessfulQueries,

0 commit comments

Comments
 (0)