@@ -15,6 +15,7 @@ package collector
15
15
16
16
import (
17
17
"context"
18
+ "database/sql"
18
19
"errors"
19
20
"fmt"
20
21
"sync"
58
59
)
59
60
60
61
type 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
62
63
}
63
64
64
65
func registerCollector (name string , isDefaultEnabled bool , createFunc func (logger log.Logger ) (Collector , error )) {
@@ -86,13 +87,13 @@ type PostgresCollector struct {
86
87
Collectors map [string ]Collector
87
88
logger log.Logger
88
89
89
- servers map [ string ] * server
90
+ db * sql. DB
90
91
}
91
92
92
93
type Option func (* PostgresCollector ) error
93
94
94
95
// 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 ) {
96
97
p := & PostgresCollector {
97
98
logger : logger ,
98
99
}
@@ -136,17 +137,18 @@ func NewPostgresCollector(logger log.Logger, dsns []string, filters []string, op
136
137
137
138
p .Collectors = collectors
138
139
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
+ }
145
143
146
- servers [dsn ] = s
144
+ db , err := sql .Open ("postgres" , dsn )
145
+ if err != nil {
146
+ return nil , err
147
147
}
148
+ db .SetMaxOpenConns (1 )
149
+ db .SetMaxIdleConns (1 )
148
150
149
- p .servers = servers
151
+ p .db = db
150
152
151
153
return p , nil
152
154
}
@@ -160,32 +162,20 @@ func (p PostgresCollector) Describe(ch chan<- *prometheus.Desc) {
160
162
// Collect implements the prometheus.Collector interface.
161
163
func (p PostgresCollector ) Collect (ch chan <- prometheus.Metric ) {
162
164
ctx := 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 ) {
175
165
wg := sync.WaitGroup {}
176
166
wg .Add (len (p .Collectors ))
177
167
for name , c := range p .Collectors {
178
168
go func (name string , c Collector ) {
179
- execute (ctx , name , c , server , ch , p .logger )
169
+ execute (ctx , name , c , p . db , ch , p .logger )
180
170
wg .Done ()
181
171
}(name , c )
182
172
}
183
173
wg .Wait ()
184
174
}
185
175
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 ) {
187
177
begin := time .Now ()
188
- err := c .Update (ctx , s , ch )
178
+ err := c .Update (ctx , db , ch )
189
179
duration := time .Since (begin )
190
180
var success float64
191
181
0 commit comments