This repository has been archived by the owner on Mar 1, 2023. It is now read-only.
/
query.go
80 lines (59 loc) · 1.97 KB
/
query.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package main
import (
"context"
"database/sql"
"strconv"
"time"
_ "github.com/go-sql-driver/mysql"
_ "github.com/lib/pq"
_ "github.com/sijms/go-ora/v2"
)
func execQuery(database *Database, query Query) {
if database.pool == nil {
return
}
defer func(begun time.Time) {
duration := time.Since(begun).Seconds()
durationGaugeVec.WithLabelValues(database.ID, database.Database, query.Name).Set(duration)
}(time.Now())
sugar.Infof("Start query `%v@%v`", database.connection, query.Name)
// query db
ctx, cancel := context.WithTimeout(context.Background(), time.Duration(query.Timeout)*time.Second)
defer cancel()
rows, err := database.pool.QueryContext(ctx, query.SQL)
if err != nil {
sugar.Errorf("Query '%v@%s' failed: %v", database.connection, query.Name, err)
errorGaugeVec.WithLabelValues(database.ID, database.Database, query.Name).Set(1)
return
}
defer func(rows *sql.Rows) {
if err := rows.Close(); err != nil {
sugar.Errorf("Cannot close rows: %v", err)
}
}(rows)
errorGaugeVec.WithLabelValues(database.ID, database.Database, query.Name).Set(0)
columns, _ := rows.Columns()
values := make([]interface{}, len(columns))
for i := range columns {
values[i] = new(sql.RawBytes)
}
for rows.Next() {
if err := rows.Scan(values...); err != nil {
sugar.Errorf("Error on scan: %v", err)
continue
}
for i, column := range columns {
float, errFloat := strconv.ParseFloat(string(*values[i].(*sql.RawBytes)), 64)
if errFloat != nil {
sugar.Errorf("Cannot convert value '%s' to float on query '%s': %v", string(*values[i].(*sql.RawBytes)), query.Name, err)
errorGaugeVec.WithLabelValues(database.ID, database.Database, query.Name).Set(1)
queryGaugeVec.DeleteLabelValues(database.ID, database.Database, query.Name, column)
continue
}
queryGaugeVec.WithLabelValues(database.ID, database.Database, query.Name, column).Set(float)
}
}
if err := rows.Close(); err != nil {
sugar.Errorf("Error on closing rows: %v", err)
}
}