@@ -46,28 +46,46 @@ type commonOpts struct {
4646}
4747
4848var (
49- metrics = []struct {
49+ gaugeMetrics = []struct {
5050 Key string
5151 Value func (* pgxpool.Stat ) float64
5252 }{
53- {"acquire_count" , func (s * pgxpool.Stat ) float64 { return float64 (s .AcquireCount ()) }},
5453 {"acquired_conns" , func (s * pgxpool.Stat ) float64 { return float64 (s .AcquiredConns ()) }},
55- {"canceled_acquire_count" , func (s * pgxpool.Stat ) float64 { return float64 (s .CanceledAcquireCount ()) }},
56- {"acquire_duration_ms" , func (s * pgxpool.Stat ) float64 { return float64 (s .AcquireDuration ().Milliseconds ()) }},
5754 {"constructing_conns" , func (s * pgxpool.Stat ) float64 { return float64 (s .ConstructingConns ()) }},
58- {"empty_acquire_count" , func (s * pgxpool.Stat ) float64 { return float64 (s .EmptyAcquireCount ()) }},
5955 {"idle_conns" , func (s * pgxpool.Stat ) float64 { return float64 (s .IdleConns ()) }},
6056 {"max_conns" , func (s * pgxpool.Stat ) float64 { return float64 (s .MaxConns ()) }},
6157 {"total_conns" , func (s * pgxpool.Stat ) float64 { return float64 (s .TotalConns ()) }},
6258 }
63- cols []* prometheus.GaugeVec
59+ counterMetrics = []struct {
60+ Key string
61+ Value func (* pgxpool.Stat ) float64
62+ }{
63+ {"acquire_count" , func (s * pgxpool.Stat ) float64 { return float64 (s .AcquireCount ()) }},
64+ {"canceled_acquire_count" , func (s * pgxpool.Stat ) float64 { return float64 (s .CanceledAcquireCount ()) }},
65+ {"acquire_duration_ms" , func (s * pgxpool.Stat ) float64 { return float64 (s .AcquireDuration ().Milliseconds ()) }},
66+ {"empty_acquire_count" , func (s * pgxpool.Stat ) float64 { return float64 (s .EmptyAcquireCount ()) }},
67+ {"new_conns_count" , func (s * pgxpool.Stat ) float64 { return float64 (s .NewConnsCount ()) }},
68+ {"max_lifetime_destroy_count" , func (s * pgxpool.Stat ) float64 { return float64 (s .MaxLifetimeDestroyCount ()) }},
69+ {"max_idle_destroy_count" , func (s * pgxpool.Stat ) float64 { return float64 (s .MaxIdleDestroyCount ()) }},
70+ }
71+
72+ gaugeVecs []* prometheus.GaugeVec
73+ counterVecs []* prometheus.CounterVec
6474)
6575
6676func init () {
67- cols = make ([]* prometheus.GaugeVec , len (metrics ))
68- for k , def := range metrics {
69- cols [k ] = prometheus .NewGaugeVec (prometheus.GaugeOpts {Subsystem : "pgx_pool" , Name : def .Key }, []string {"address" , "database" , "client" })
70- prometheus .MustRegister (cols [k ])
77+ labels := []string {"address" , "database" , "client" }
78+
79+ gaugeVecs = make ([]* prometheus.GaugeVec , len (gaugeMetrics ))
80+ for k , def := range gaugeMetrics {
81+ gaugeVecs [k ] = prometheus .NewGaugeVec (prometheus.GaugeOpts {Subsystem : "pgx_pool" , Name : def .Key }, labels )
82+ prometheus .MustRegister (gaugeVecs [k ])
83+ }
84+
85+ counterVecs = make ([]* prometheus.CounterVec , len (counterMetrics ))
86+ for k , def := range counterMetrics {
87+ counterVecs [k ] = prometheus .NewCounterVec (prometheus.CounterOpts {Subsystem : "pgx_pool" , Name : def .Key }, labels )
88+ prometheus .MustRegister (counterVecs [k ])
7189 }
7290}
7391
@@ -100,6 +118,8 @@ func newDatabase(instance DBInstance, conn *pgxpool.Pool, tracer trace.Tracer, c
100118 t := time .NewTicker (5 * time .Second )
101119 defer t .Stop ()
102120
121+ prevCounters := make ([]float64 , len (counterMetrics ))
122+
103123 for {
104124 select {
105125 case <- ctx .Done ():
@@ -108,8 +128,17 @@ func newDatabase(instance DBInstance, conn *pgxpool.Pool, tracer trace.Tracer, c
108128 case <- t .C :
109129 stats := conn .Stat ()
110130
111- for k , def := range metrics {
112- cols [k ].WithLabelValues (db .opts .clusterAddr , db .opts .databaseName , client ).Set (def .Value (stats ))
131+ for k , def := range gaugeMetrics {
132+ gaugeVecs [k ].WithLabelValues (db .opts .clusterAddr , db .opts .databaseName , client ).Set (def .Value (stats ))
133+ }
134+
135+ for k , def := range counterMetrics {
136+ v := def .Value (stats )
137+ delta := v - prevCounters [k ]
138+ if delta > 0 {
139+ counterVecs [k ].WithLabelValues (db .opts .clusterAddr , db .opts .databaseName , client ).Add (delta )
140+ }
141+ prevCounters [k ] = v
113142 }
114143 }
115144 }
0 commit comments