You've already forked postgres_exporter
mirror of
https://github.com/prometheus-community/postgres_exporter.git
synced 2025-08-06 17:22:43 +03:00
WIP
This commit is contained in:
64
pkg/servers/servers.go
Normal file
64
pkg/servers/servers.go
Normal file
@@ -0,0 +1,64 @@
|
||||
package servers
|
||||
|
||||
import (
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
// Servers contains a collection of servers to Postgres.
|
||||
type Servers struct {
|
||||
m sync.Mutex
|
||||
servers map[string]*Server
|
||||
opts []ServerOpt
|
||||
}
|
||||
|
||||
// NewServers creates a collection of servers to Postgres.
|
||||
func NewServers(opts ...ServerOpt) *Servers {
|
||||
return &Servers{
|
||||
servers: make(map[string]*Server),
|
||||
opts: opts,
|
||||
}
|
||||
}
|
||||
|
||||
// GetServer returns established connection from a collection.
|
||||
func (s *Servers) GetServer(dsn string) (*Server, error) {
|
||||
s.m.Lock()
|
||||
defer s.m.Unlock()
|
||||
var err error
|
||||
var ok bool
|
||||
errCount := 0 // start at zero because we increment before doing work
|
||||
retries := 3
|
||||
var server *Server
|
||||
for {
|
||||
if errCount++; errCount > retries {
|
||||
return nil, err
|
||||
}
|
||||
server, ok = s.servers[dsn]
|
||||
if !ok {
|
||||
server, err = NewServer(dsn, s.opts...)
|
||||
if err != nil {
|
||||
time.Sleep(time.Duration(errCount) * time.Second)
|
||||
continue
|
||||
}
|
||||
s.servers[dsn] = server
|
||||
}
|
||||
if err = server.Ping(); err != nil {
|
||||
delete(s.servers, dsn)
|
||||
time.Sleep(time.Duration(errCount) * time.Second)
|
||||
continue
|
||||
}
|
||||
break
|
||||
}
|
||||
return server, nil
|
||||
}
|
||||
|
||||
// Close disconnects from all known servers.
|
||||
func (s *Servers) Close() {
|
||||
s.m.Lock()
|
||||
defer s.m.Unlock()
|
||||
for _, server := range s.servers {
|
||||
if err := server.Close(); err != nil {
|
||||
log.Errorf("failed to close connection to %q: %v", server, err)
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user