@@ -19,12 +19,12 @@ import (
1919 "fmt"
2020 "log/slog"
2121 "math"
22- "os"
2322 "strconv"
2423 "time"
2524 "unicode/utf8"
2625
27- _ "github.com/lib/pq"
26+ "github.com/lib/pq"
27+
2828 "github.com/prometheus/client_golang/prometheus"
2929)
3030
@@ -137,17 +137,15 @@ var (
137137)
138138
139139func NewExporter (connectionString string , namespace string , logger * slog.Logger ) * Exporter {
140-
141- db , err := getDB (connectionString )
142-
140+ conn , err := pq .NewConnector (connectionString )
143141 if err != nil {
144- logger .Error ("error setting up DB connection " , "err " , err . Error () )
145- os . Exit ( 1 )
142+ logger .Error ("failed to create connector " , "error " , err )
143+ return nil
146144 }
147145
148146 return & Exporter {
147+ conn : conn ,
149148 metricMap : makeDescMap (metricMaps , namespace , logger ),
150- db : db ,
151149 logger : logger ,
152150 }
153151}
@@ -335,10 +333,10 @@ func queryNamespaceMapping(ch chan<- prometheus.Metric, db *sql.DB, namespace st
335333 return nonfatalErrors , nil
336334}
337335
338- func getDB (conn string ) (* sql.DB , error ) {
339- db , err := sql .Open ( "postgres" , conn )
340- if err ! = nil {
341- return nil , err
336+ func getDB (conn * pq. Connector ) (* sql.DB , error ) {
337+ db := sql .OpenDB ( conn )
338+ if db = = nil {
339+ return nil , errors . New ( "error opening DB" )
342340 }
343341 rows , err := db .Query ("SHOW STATS" )
344342 if err != nil {
@@ -472,36 +470,47 @@ func (e *Exporter) Describe(ch chan<- *prometheus.Desc) {
472470
473471// Collect implements prometheus.Collector.
474472func (e * Exporter ) Collect (ch chan <- prometheus.Metric ) {
475- e .logger .Info ("Starting scrape" )
473+ e .logger .Debug ("Starting scrape" )
476474
477475 var up = 1.0
478476
479- err := queryVersion (ch , e .db )
477+ defer func () {
478+ ch <- prometheus .MustNewConstMetric (scrapeSuccessDesc , prometheus .GaugeValue , up )
479+ }()
480+
481+ db , err := getDB (e .conn )
482+ if err != nil {
483+ e .logger .Warn ("error setting up DB connection" , "err" , err .Error ())
484+ up = 0
485+ return
486+ }
487+ defer db .Close ()
488+
489+ err = queryVersion (ch , db )
480490 if err != nil {
481- e .logger .Error ("error getting version" , "err" , err .Error ())
491+ e .logger .Warn ("error getting version" , "err" , err .Error ())
482492 up = 0
483493 }
484494
485- if err = queryShowLists (ch , e . db , e .logger ); err != nil {
486- e .logger .Error ("error getting SHOW LISTS" , "err" , err .Error ())
495+ if err = queryShowLists (ch , db , e .logger ); err != nil {
496+ e .logger .Warn ("error getting SHOW LISTS" , "err" , err .Error ())
487497 up = 0
488498 }
489499
490- if err = queryShowConfig (ch , e . db , e .logger ); err != nil {
491- e .logger .Error ("error getting SHOW CONFIG" , "err" , err .Error ())
500+ if err = queryShowConfig (ch , db , e .logger ); err != nil {
501+ e .logger .Warn ("error getting SHOW CONFIG" , "err" , err .Error ())
492502 up = 0
493503 }
494504
495- errMap := queryNamespaceMappings (ch , e . db , e .metricMap , e .logger )
505+ errMap := queryNamespaceMappings (ch , db , e .metricMap , e .logger )
496506 if len (errMap ) > 0 {
497- e .logger .Error ("error querying namespace mappings" , "err" , errMap )
507+ e .logger .Warn ("error querying namespace mappings" , "err" , errMap )
498508 up = 0
499509 }
500510
501511 if len (errMap ) == len (e .metricMap ) {
502512 up = 0
503513 }
504- ch <- prometheus .MustNewConstMetric (scrapeSuccessDesc , prometheus .GaugeValue , up )
505514}
506515
507516// Turn the MetricMap column mapping into a prometheus descriptor mapping.
0 commit comments