@@ -99,40 +99,35 @@ fn duration_to_seconds(d: Duration) -> f64 {
99
99
d. as_secs ( ) as f64 + nanos
100
100
}
101
101
102
- #[ derive( Debug , Clone ) ]
103
- pub struct ResponseRecorder {
104
- start_time : Instant ,
105
- route : Option < String > ,
102
+ pub struct RequestRecorder {
103
+ handler : Box < dyn iron:: Handler > ,
104
+ route_name : String ,
106
105
}
107
106
108
- impl ResponseRecorder {
109
- #[ inline]
110
- pub fn new ( ) -> Self {
107
+ impl RequestRecorder {
108
+ pub fn new ( handler : impl iron:: Handler , route : impl Into < String > ) -> Self {
111
109
Self {
112
- start_time : Instant :: now ( ) ,
113
- route : None ,
110
+ handler : Box :: new ( handler ) ,
111
+ route_name : route . into ( ) ,
114
112
}
115
113
}
116
-
117
- #[ inline]
118
- pub fn route ( & mut self , route : impl Into < String > ) {
119
- self . route = Some ( route. into ( ) ) ;
120
- }
121
114
}
122
115
123
- impl Drop for ResponseRecorder {
124
- fn drop ( & mut self ) {
125
- if let Some ( route) = & self . route {
126
- ROUTES_VISITED . with_label_values ( & [ route] ) . inc ( ) ;
116
+ impl iron:: Handler for RequestRecorder {
117
+ fn handle ( & self , request : & mut Request ) -> IronResult < Response > {
118
+ let start = Instant :: now ( ) ;
119
+ let result = self . handler . handle ( request) ;
120
+ let resp_time = duration_to_seconds ( start. elapsed ( ) ) ;
127
121
128
- let response_time = duration_to_seconds ( self . start_time . elapsed ( ) ) ;
129
- RESPONSE_TIMES
130
- . with_label_values ( & [ route ] )
131
- . observe ( response_time ) ;
122
+ ROUTES_VISITED . with_label_values ( & [ & self . route_name ] ) . inc ( ) ;
123
+ RESPONSE_TIMES
124
+ . with_label_values ( & [ & self . route_name ] )
125
+ . observe ( resp_time ) ;
132
126
133
- #[ cfg( test) ]
134
- tests:: record_tests ( route) ;
135
- }
127
+ #[ cfg( test) ]
128
+ tests:: record_tests ( & self . route_name ) ;
129
+
130
+ result
136
131
}
137
132
}
138
133
@@ -178,14 +173,14 @@ mod tests {
178
173
frontend. get ( "/" ) . send ( ) ?;
179
174
frontend. get ( "/" ) . send ( ) ?;
180
175
assert_eq ! ( ROUTES_VISITED . load( Ordering :: SeqCst ) , 2 ) ;
181
- assert_eq ! ( RESPONSE_TIMES . lock( ) . unwrap( ) . get( "home (found) " ) , Some ( & 2 ) ) ;
176
+ assert_eq ! ( RESPONSE_TIMES . lock( ) . unwrap( ) . get( "/ " ) , Some ( & 2 ) ) ;
182
177
183
178
reset_records ( ) ;
184
179
185
180
frontend. get ( "" ) . send ( ) ?;
186
181
frontend. get ( "" ) . send ( ) ?;
187
182
assert_eq ! ( ROUTES_VISITED . load( Ordering :: SeqCst ) , 2 ) ;
188
- assert_eq ! ( RESPONSE_TIMES . lock( ) . unwrap( ) . get( "home (found) " ) , Some ( & 2 ) ) ;
183
+ assert_eq ! ( RESPONSE_TIMES . lock( ) . unwrap( ) . get( "/ " ) , Some ( & 2 ) ) ;
189
184
190
185
Ok ( ( ) )
191
186
} )
@@ -202,6 +197,7 @@ mod tests {
202
197
"/menu.js" ,
203
198
"/sitemap.xml" ,
204
199
"/opensearch.xml" ,
200
+ "/robots.txt" ,
205
201
] ;
206
202
207
203
for route in routes. iter ( ) {
@@ -212,19 +208,11 @@ mod tests {
212
208
213
209
assert_eq ! ( ROUTES_VISITED . load( Ordering :: SeqCst ) , 2 ) ;
214
210
assert_eq ! (
215
- RESPONSE_TIMES . lock( ) . unwrap( ) . get( "resources (found) " ) ,
211
+ RESPONSE_TIMES . lock( ) . unwrap( ) . get( "static resource " ) ,
216
212
Some ( & 2 )
217
213
) ;
218
214
}
219
215
220
- reset_records ( ) ;
221
-
222
- frontend. get ( "/robots.txt" ) . send ( ) ?;
223
- frontend. get ( "/robots.txt" ) . send ( ) ?;
224
-
225
- assert_eq ! ( ROUTES_VISITED . load( Ordering :: SeqCst ) , 2 ) ;
226
- assert_eq ! ( RESPONSE_TIMES . lock( ) . unwrap( ) . get( "resources" ) , Some ( & 2 ) ) ;
227
-
228
216
Ok ( ( ) )
229
217
} )
230
218
}
@@ -248,19 +236,15 @@ mod tests {
248
236
let frontend = env. frontend ( ) ;
249
237
250
238
let routes = [
251
- ( "/releases" , "recent releases (found)" ) ,
252
- // ("/releases/recent", "recent releases (found)"),
253
- ( "/releases/recent/1" , "recent releases (found)" ) ,
254
- ( "/releases/feed" , "release feed (found)" ) ,
255
- ( "/releases/queue" , "release queue (found)" ) ,
256
- // ("/releases/search", "search releases (found)"),
257
- // ("/releases/stars", "release stars (found)"),
258
- // ("/releases/stars/1", "release stars (found)"),
259
- // ("/releases/activity", "release activity (found)"),
260
- // ("/releases/failures", "build failures (found)"),
261
- // ("/releases/failures/1", "build failures (found)"),
262
- ( "/releases/recent-failures" , "recent failures (found)" ) ,
263
- ( "/releases/recent-failures/1" , "recent failures (found)" ) ,
239
+ ( "/releases" , "/releases" ) ,
240
+ ( "/releases/recent/1" , "/releases/recent/:page" ) ,
241
+ ( "/releases/feed" , "static resource" ) ,
242
+ ( "/releases/queue" , "/releases/queue" ) ,
243
+ ( "/releases/recent-failures" , "/releases/recent-failures" ) ,
244
+ (
245
+ "/releases/recent-failures/1" ,
246
+ "/releases/recent-failures/:page" ,
247
+ ) ,
264
248
] ;
265
249
266
250
for ( route, correct) in routes. iter ( ) {
@@ -293,29 +277,19 @@ mod tests {
293
277
294
278
let frontend = env. frontend ( ) ;
295
279
296
- let routes = [
297
- ( "/crate/rcc" , "crate details (found)" ) ,
298
- ( "/crate/rcc/" , "crate details (found)" ) ,
299
- ( "/crate/hexponent" , "crate details (found)" ) ,
300
- ( "/crate/hexponent/" , "crate details (found)" ) ,
301
- ( "/crate/rcc/0.0.0" , "crate details (found)" ) ,
302
- ( "/crate/rcc/0.0.0/" , "crate details (found)" ) ,
303
- ( "/crate/hexponent/0.2.0" , "crate details (found)" ) ,
304
- ( "/crate/hexponent/0.2.0/" , "crate details (found)" ) ,
305
- ( "/crate/i_dont_exist" , "crate details (404)" ) ,
306
- ( "/crate/i_dont_exist/" , "crate details (404)" ) ,
307
- ( "/crate/i_dont_exist/4.0.4" , "crate details (404)" ) ,
308
- ( "/crate/i_dont_exist/4.0.4/" , "crate details (404)" ) ,
309
- ] ;
280
+ let routes = [ "/crate/rcc/0.0.0" , "/crate/hexponent/0.2.0" ] ;
310
281
311
- for ( route, correct ) in routes. iter ( ) {
282
+ for route in routes. iter ( ) {
312
283
reset_records ( ) ;
313
284
314
285
frontend. get ( route) . send ( ) ?;
315
286
frontend. get ( route) . send ( ) ?;
316
287
317
288
assert_eq ! ( ROUTES_VISITED . load( Ordering :: SeqCst ) , 2 ) ;
318
- assert_eq ! ( RESPONSE_TIMES . lock( ) . unwrap( ) . get( * correct) , Some ( & 2 ) ) ;
289
+ assert_eq ! (
290
+ RESPONSE_TIMES . lock( ) . unwrap( ) . get( "/crate/:name/:version" ) ,
291
+ Some ( & 2 )
292
+ ) ;
319
293
}
320
294
321
295
Ok ( ( ) )
0 commit comments