@@ -15,6 +15,7 @@ package collector
1515
1616import (
1717"context"
18+ "database/sql"
1819"errors"
1920"fmt"
2021"sync"
5859)
5960
6061type Collector interface {
61- Update (ctx context.Context , server * server , ch chan <- prometheus.Metric ) error
62+ Update (ctx context.Context , db * sql. DB , ch chan <- prometheus.Metric ) error
6263}
6364
6465func registerCollector (name string , isDefaultEnabled bool , createFunc func (logger log.Logger ) (Collector , error )) {
@@ -86,13 +87,13 @@ type PostgresCollector struct {
8687Collectors map [string ]Collector
8788logger log.Logger
8889
89- servers map [ string ] * server
90+ db * sql. DB
9091}
9192
9293type Option func (* PostgresCollector ) error
9394
9495// NewPostgresCollector creates a new PostgresCollector.
95- func NewPostgresCollector (logger log.Logger , dsns [] string , filters []string , options ... Option ) (* PostgresCollector , error ) {
96+ func NewPostgresCollector (logger log.Logger , dsn string , filters []string , options ... Option ) (* PostgresCollector , error ) {
9697p := & PostgresCollector {
9798logger : logger ,
9899}
@@ -136,17 +137,18 @@ func NewPostgresCollector(logger log.Logger, dsns []string, filters []string, op
136137
137138p .Collectors = collectors
138139
139- servers := make (map [string ]* server )
140- for _ , dsn := range dsns {
141- s , err := makeServer (dsn )
142- if err != nil {
143- return nil , err
144- }
140+ if dsn == "" {
141+ return nil , errors .New ("empty dsn" )
142+ }
145143
146- servers [dsn ] = s
144+ db , err := sql .Open ("postgres" , dsn )
145+ if err != nil {
146+ return nil , err
147147}
148+ db .SetMaxOpenConns (1 )
149+ db .SetMaxIdleConns (1 )
148150
149- p .servers = servers
151+ p .db = db
150152
151153return p , nil
152154}
@@ -160,32 +162,20 @@ func (p PostgresCollector) Describe(ch chan<- *prometheus.Desc) {
160162// Collect implements the prometheus.Collector interface.
161163func (p PostgresCollector ) Collect (ch chan <- prometheus.Metric ) {
162164ctx := context .TODO ()
163- wg := sync.WaitGroup {}
164- wg .Add (len (p .servers ))
165- for _ , s := range p .servers {
166- go func (s * server ) {
167- p .subCollect (ctx , s , ch )
168- wg .Done ()
169- }(s )
170- }
171- wg .Wait ()
172- }
173-
174- func (p PostgresCollector ) subCollect (ctx context.Context , server * server , ch chan <- prometheus.Metric ) {
175165wg := sync.WaitGroup {}
176166wg .Add (len (p .Collectors ))
177167for name , c := range p .Collectors {
178168go func (name string , c Collector ) {
179- execute (ctx , name , c , server , ch , p .logger )
169+ execute (ctx , name , c , p . db , ch , p .logger )
180170wg .Done ()
181171}(name , c )
182172}
183173wg .Wait ()
184174}
185175
186- func execute (ctx context.Context , name string , c Collector , s * server , ch chan <- prometheus.Metric , logger log.Logger ) {
176+ func execute (ctx context.Context , name string , c Collector , db * sql. DB , ch chan <- prometheus.Metric , logger log.Logger ) {
187177begin := time .Now ()
188- err := c .Update (ctx , s , ch )
178+ err := c .Update (ctx , db , ch )
189179duration := time .Since (begin )
190180var success float64
191181
0 commit comments