@@ -93,7 +93,8 @@ type PostgresCollector struct {
9393 logger * slog.Logger
9494 scrapeTimeout time.Duration
9595
96- instance * instance
96+ instance * instance
97+ instancePerCollect bool
9798}
9899
99100type Option func (* PostgresCollector ) error
@@ -106,10 +107,19 @@ func WithTimeout(timeout time.Duration) Option {
106107 }
107108}
108109
110+ // WithInstancePerCollect configures whether to create a new instance per Collect call.
111+ func WithInstancePerCollect () Option {
112+ return func (p * PostgresCollector ) error {
113+ p .instancePerCollect = true
114+ return nil
115+ }
116+ }
117+
109118// NewPostgresCollector creates a new PostgresCollector.
110- func NewPostgresCollector (logger * slog.Logger , excludeDatabases []string , dsn string , filters []string , options ... Option ) (* PostgresCollector , error ) {
119+ func NewPostgresCollector (logger * slog.Logger , excludeDatabases []string , instance * instance , filters []string , options ... Option ) (* PostgresCollector , error ) {
111120 p := & PostgresCollector {
112- logger : logger ,
121+ logger : logger ,
122+ instance : instance ,
113123 }
114124 // Apply options to customize the collector
115125 for _ , o := range options {
@@ -154,16 +164,6 @@ func NewPostgresCollector(logger *slog.Logger, excludeDatabases []string, dsn st
154164
155165 p .Collectors = collectors
156166
157- if dsn == "" {
158- return nil , errors .New ("empty dsn" )
159- }
160-
161- instance , err := newInstance (dsn )
162- if err != nil {
163- return nil , err
164- }
165- p .instance = instance
166-
167167 return p , nil
168168}
169169
@@ -184,15 +184,21 @@ func (p PostgresCollector) Collect(ch chan<- prometheus.Metric) {
184184 ctx = context .Background ()
185185 }
186186
187- // copy the instance so that concurrent scrapes have independent instances
188- inst := p .instance .copy ()
187+ var inst * instance
189188
190- // Set up the database connection for the collector.
191- err := inst .setup ()
192- defer inst .Close ()
193- if err != nil {
194- p .logger .Error ("Error opening connection to database" , "err" , err )
195- return
189+ if p .instancePerCollect {
190+ // copy the instance so that concurrent scrapes have independent instances
191+ inst = p .instance .copy ()
192+ // Set up the database connection for the collector.
193+ err := inst .setup ()
194+ if err != nil {
195+ p .logger .Error ("Error opening connection to database" , "err" , err )
196+ return
197+ }
198+ defer inst .Close ()
199+ } else {
200+ // Use the shared instance directly
201+ inst = p .instance
196202 }
197203
198204 wg := sync.WaitGroup {}
@@ -206,10 +212,6 @@ func (p PostgresCollector) Collect(ch chan<- prometheus.Metric) {
206212 wg .Wait ()
207213}
208214
209- func (p * PostgresCollector ) Close () error {
210- return p .instance .Close ()
211- }
212-
213215func execute (ctx context.Context , name string , c Collector , instance * instance , ch chan <- prometheus.Metric , logger * slog.Logger ) {
214216 begin := time .Now ()
215217 err := c .Update (ctx , instance , ch )
0 commit comments