1
1
package collector
2
2
3
3
import (
4
+ "context"
4
5
"database/sql"
5
6
"regexp"
6
7
"strconv"
@@ -32,16 +33,21 @@ var (
32
33
)
33
34
)
34
35
36
+ // Verify if Exporter implements prometheus.Collector
37
+ var _ prometheus.Collector = (* Exporter )(nil )
38
+
35
39
// Exporter collects MySQL metrics. It implements prometheus.Collector.
36
40
type Exporter struct {
41
+ ctx context.Context
37
42
db * sql.DB
38
43
scrapers []Scraper
39
44
metrics Metrics
40
45
}
41
46
42
47
// New returns a new MySQL exporter for the provided DSN.
43
- func New (db * sql.DB , metrics Metrics , scrapers []Scraper ) * Exporter {
48
+ func New (ctx context. Context , db * sql.DB , metrics Metrics , scrapers []Scraper ) * Exporter {
44
49
return & Exporter {
50
+ ctx : ctx ,
45
51
db : db ,
46
52
scrapers : scrapers ,
47
53
metrics : metrics ,
@@ -58,21 +64,21 @@ func (e *Exporter) Describe(ch chan<- *prometheus.Desc) {
58
64
59
65
// Collect implements prometheus.Collector.
60
66
func (e * Exporter ) Collect (ch chan <- prometheus.Metric ) {
61
- e .scrape (ch )
67
+ e .scrape (e . ctx , ch )
62
68
63
69
ch <- e .metrics .TotalScrapes
64
70
ch <- e .metrics .Error
65
71
e .metrics .ScrapeErrors .Collect (ch )
66
72
ch <- e .metrics .MySQLUp
67
73
}
68
74
69
- func (e * Exporter ) scrape (ch chan <- prometheus.Metric ) {
75
+ func (e * Exporter ) scrape (ctx context. Context , ch chan <- prometheus.Metric ) {
70
76
e .metrics .Error .Set (0 )
71
77
e .metrics .TotalScrapes .Inc ()
72
78
var err error
73
79
74
80
scrapeTime := time .Now ()
75
- if err = e .db .Ping ( ); err != nil {
81
+ if err = e .db .PingContext ( ctx ); err != nil {
76
82
log .Errorln ("Error pinging mysqld:" , err )
77
83
e .metrics .MySQLUp .Set (0 )
78
84
e .metrics .Error .Set (1 )
@@ -82,7 +88,7 @@ func (e *Exporter) scrape(ch chan<- prometheus.Metric) {
82
88
83
89
ch <- prometheus .MustNewConstMetric (scrapeDurationDesc , prometheus .GaugeValue , time .Since (scrapeTime ).Seconds (), "connection" )
84
90
85
- versionNum := getMySQLVersion (e .db )
91
+ versionNum := getMySQLVersion (ctx , e .db )
86
92
wg := & sync.WaitGroup {}
87
93
defer wg .Wait ()
88
94
for _ , scraper := range e .scrapers {
@@ -94,7 +100,7 @@ func (e *Exporter) scrape(ch chan<- prometheus.Metric) {
94
100
defer wg .Done ()
95
101
label := "collect." + scraper .Name ()
96
102
scrapeTime := time .Now ()
97
- if err := scraper .Scrape (e .db , ch ); err != nil {
103
+ if err := scraper .Scrape (ctx , e .db , ch ); err != nil {
98
104
log .Errorln ("Error scraping for " + label + ":" , err )
99
105
e .metrics .ScrapeErrors .WithLabelValues (label ).Inc ()
100
106
e .metrics .Error .Set (1 )
@@ -104,12 +110,12 @@ func (e *Exporter) scrape(ch chan<- prometheus.Metric) {
104
110
}
105
111
}
106
112
107
- func getMySQLVersion (db * sql.DB ) float64 {
113
+ func getMySQLVersion (ctx context. Context , db * sql.DB ) float64 {
108
114
var (
109
115
versionStr string
110
116
versionNum float64
111
117
)
112
- err := db .QueryRow ( versionQuery ).Scan (& versionStr )
118
+ err := db .QueryRowContext ( ctx , versionQuery ).Scan (& versionStr )
113
119
if err == nil {
114
120
r , _ := regexp .Compile (`^\d+\.\d+` )
115
121
versionNum , _ = strconv .ParseFloat (r .FindString (versionStr ), 64 )
0 commit comments