@@ -132,6 +132,116 @@ func TestPGStatDatabaseCollector(t *testing.T) {
132
132
}
133
133
}
134
134
135
+ func TestPGStatDatabaseCollectorCollectsIdleTime (t * testing.T ) {
136
+ db , mock , err := sqlmock .New ()
137
+ if err != nil {
138
+ t .Fatalf ("Error opening a stub db connection: %s" , err )
139
+ }
140
+ defer db .Close ()
141
+
142
+ inst := & instance {db : db , version : semver .MustParse ("15.0.0" )}
143
+
144
+ columns := []string {
145
+ "datid" ,
146
+ "datname" ,
147
+ "numbackends" ,
148
+ "xact_commit" ,
149
+ "xact_rollback" ,
150
+ "blks_read" ,
151
+ "blks_hit" ,
152
+ "tup_returned" ,
153
+ "tup_fetched" ,
154
+ "tup_inserted" ,
155
+ "tup_updated" ,
156
+ "tup_deleted" ,
157
+ "conflicts" ,
158
+ "temp_files" ,
159
+ "temp_bytes" ,
160
+ "deadlocks" ,
161
+ "blk_read_time" ,
162
+ "blk_write_time" ,
163
+ "stats_reset" ,
164
+ "active_time" ,
165
+ "idle_in_transaction_time" ,
166
+ }
167
+
168
+ srT , err := time .Parse ("2006-01-02 15:04:05.00000-07" , "2023-05-25 17:10:42.81132-07" )
169
+ if err != nil {
170
+ t .Fatalf ("Error parsing time: %s" , err )
171
+ }
172
+
173
+ rows := sqlmock .NewRows (columns ).
174
+ AddRow (
175
+ "pid" ,
176
+ "postgres" ,
177
+ 354 ,
178
+ 4945 ,
179
+ 289097744 ,
180
+ 1242257 ,
181
+ int64 (3275602074 ),
182
+ 89320867 ,
183
+ 450139 ,
184
+ 2034563757 ,
185
+ 0 ,
186
+ int64 (2725688749 ),
187
+ 23 ,
188
+ 52 ,
189
+ 74 ,
190
+ 925 ,
191
+ 16 ,
192
+ 823 ,
193
+ srT ,
194
+ 33 ,
195
+ 123 ,
196
+ )
197
+
198
+ mock .ExpectQuery (sanitizeQuery (statDatabaseQuery (columns ))).WillReturnRows (rows )
199
+
200
+ ch := make (chan prometheus.Metric )
201
+ go func () {
202
+ defer close (ch )
203
+ c := PGStatDatabaseCollector {
204
+ log : log .With (log .NewNopLogger (), "collector" , "pg_stat_database" ),
205
+ }
206
+
207
+ if err := c .Update (context .Background (), inst , ch ); err != nil {
208
+ t .Errorf ("Error calling PGStatDatabaseCollector.Update: %s" , err )
209
+ }
210
+ }()
211
+
212
+ expected := []MetricResult {
213
+ {labels : labelMap {"datid" : "pid" , "datname" : "postgres" }, metricType : dto .MetricType_GAUGE , value : 354 },
214
+ {labels : labelMap {"datid" : "pid" , "datname" : "postgres" }, metricType : dto .MetricType_COUNTER , value : 4945 },
215
+ {labels : labelMap {"datid" : "pid" , "datname" : "postgres" }, metricType : dto .MetricType_COUNTER , value : 289097744 },
216
+ {labels : labelMap {"datid" : "pid" , "datname" : "postgres" }, metricType : dto .MetricType_COUNTER , value : 1242257 },
217
+ {labels : labelMap {"datid" : "pid" , "datname" : "postgres" }, metricType : dto .MetricType_COUNTER , value : 3275602074 },
218
+ {labels : labelMap {"datid" : "pid" , "datname" : "postgres" }, metricType : dto .MetricType_COUNTER , value : 89320867 },
219
+ {labels : labelMap {"datid" : "pid" , "datname" : "postgres" }, metricType : dto .MetricType_COUNTER , value : 450139 },
220
+ {labels : labelMap {"datid" : "pid" , "datname" : "postgres" }, metricType : dto .MetricType_COUNTER , value : 2034563757 },
221
+ {labels : labelMap {"datid" : "pid" , "datname" : "postgres" }, metricType : dto .MetricType_COUNTER , value : 0 },
222
+ {labels : labelMap {"datid" : "pid" , "datname" : "postgres" }, metricType : dto .MetricType_COUNTER , value : 2725688749 },
223
+ {labels : labelMap {"datid" : "pid" , "datname" : "postgres" }, metricType : dto .MetricType_COUNTER , value : 23 },
224
+ {labels : labelMap {"datid" : "pid" , "datname" : "postgres" }, metricType : dto .MetricType_COUNTER , value : 52 },
225
+ {labels : labelMap {"datid" : "pid" , "datname" : "postgres" }, metricType : dto .MetricType_COUNTER , value : 74 },
226
+ {labels : labelMap {"datid" : "pid" , "datname" : "postgres" }, metricType : dto .MetricType_COUNTER , value : 925 },
227
+ {labels : labelMap {"datid" : "pid" , "datname" : "postgres" }, metricType : dto .MetricType_COUNTER , value : 16 },
228
+ {labels : labelMap {"datid" : "pid" , "datname" : "postgres" }, metricType : dto .MetricType_COUNTER , value : 823 },
229
+ {labels : labelMap {"datid" : "pid" , "datname" : "postgres" }, metricType : dto .MetricType_COUNTER , value : 1685059842 },
230
+ {labels : labelMap {"datid" : "pid" , "datname" : "postgres" }, metricType : dto .MetricType_COUNTER , value : 0.033 },
231
+ {labels : labelMap {"datid" : "pid" , "datname" : "postgres" }, metricType : dto .MetricType_COUNTER , value : 0.123 },
232
+ }
233
+
234
+ convey .Convey ("Metrics comparison" , t , func () {
235
+ for _ , expect := range expected {
236
+ m := readMetric (<- ch )
237
+ convey .So (expect , convey .ShouldResemble , m )
238
+ }
239
+ })
240
+ if err := mock .ExpectationsWereMet (); err != nil {
241
+ t .Errorf ("there were unfulfilled exceptions: %s" , err )
242
+ }
243
+ }
244
+
135
245
func TestPGStatDatabaseCollectorNullValues (t * testing.T ) {
136
246
db , mock , err := sqlmock .New ()
137
247
if err != nil {
0 commit comments