@@ -249,6 +249,87 @@ func TestReadRowsInvalidRowSet(t *testing.T) {
249
249
}
250
250
}
251
251
252
+ func TestReadRowsRequestStats (t * testing.T ) {
253
+ testEnv , err := NewEmulatedEnv (IntegrationTestConfig {})
254
+ if err != nil {
255
+ t .Fatalf ("NewEmulatedEnv failed: %v" , err )
256
+ }
257
+ conn , err := grpc .Dial (testEnv .server .Addr , grpc .WithInsecure (), grpc .WithBlock (),
258
+ grpc .WithDefaultCallOptions (grpc .MaxCallSendMsgSize (100 << 20 ), grpc .MaxCallRecvMsgSize (100 << 20 )),
259
+ )
260
+ if err != nil {
261
+ t .Fatalf ("grpc.Dial failed: %v" , err )
262
+ }
263
+ ctx , cancel := context .WithTimeout (context .Background (), 20 * time .Second )
264
+ defer cancel ()
265
+ adminClient , err := NewAdminClient (ctx , testEnv .config .Project , testEnv .config .Instance , option .WithGRPCConn (conn ))
266
+ if err != nil {
267
+ t .Fatalf ("NewClient failed: %v" , err )
268
+ }
269
+ defer adminClient .Close ()
270
+ tableConf := & TableConf {
271
+ TableID : testEnv .config .Table ,
272
+ Families : map [string ]GCPolicy {
273
+ "f" : NoGcPolicy (),
274
+ },
275
+ }
276
+ if err := adminClient .CreateTableFromConf (ctx , tableConf ); err != nil {
277
+ t .Fatalf ("CreateTable(%v) failed: %v" , testEnv .config .Table , err )
278
+ }
279
+
280
+ client , err := NewClient (ctx , testEnv .config .Project , testEnv .config .Instance , option .WithGRPCConn (conn ))
281
+ if err != nil {
282
+ t .Fatalf ("NewClient failed: %v" , err )
283
+ }
284
+ defer client .Close ()
285
+ table := client .Open (testEnv .config .Table )
286
+
287
+ m := NewMutation ()
288
+ m .Set ("f" , "q" , ServerTime , []byte ("value" ))
289
+
290
+ if err = table .Apply (ctx , "row1" , m ); err != nil {
291
+ t .Fatalf ("Apply failed: %v" , err )
292
+ }
293
+
294
+ m = NewMutation ()
295
+ m .Set ("f" , "q" , ServerTime , []byte ("value" ))
296
+ m .Set ("f" , "q2" , ServerTime , []byte ("value2" ))
297
+ if err = table .Apply (ctx , "row2" , m ); err != nil {
298
+ t .Fatalf ("Apply failed: %v" , err )
299
+ }
300
+
301
+ m = NewMutation ()
302
+ m .Set ("f" , "excluded" , ServerTime , []byte ("value" ))
303
+ if err = table .Apply (ctx , "row3" , m ); err != nil {
304
+ t .Fatalf ("Apply failed: %v" , err )
305
+ }
306
+
307
+ statsChannel := make (chan FullReadStats , 1 )
308
+
309
+ readStart := time .Now ()
310
+ if err := table .ReadRows (ctx , RowRange {}, func (r Row ) bool { return true }, WithFullReadStats (func (s * FullReadStats ) { statsChannel <- * s }), RowFilter (ColumnFilter ("q.*" ))); err != nil {
311
+ t .Fatalf ("NewClient failed: %v" , err )
312
+ }
313
+ readElapsed := time .Since (readStart )
314
+
315
+ got := <- statsChannel
316
+
317
+ wantIter := ReadIterationStats {
318
+ RowsSeenCount : 3 ,
319
+ RowsReturnedCount : 2 ,
320
+ CellsSeenCount : 4 ,
321
+ CellsReturnedCount : 3 ,
322
+ }
323
+
324
+ if diff := cmp .Diff (wantIter , got .ReadIterationStats ); diff != "" {
325
+ t .Errorf ("ReadRows RequestStats are incorrect (-want +got):\n %s" , diff )
326
+ }
327
+
328
+ if got .RequestLatencyStats .FrontendServerLatency > readElapsed || got .RequestLatencyStats .FrontendServerLatency <= 0 {
329
+ t .Fatalf ("ReadRows FrontendServerLatency should be in range 0, %v" , readElapsed )
330
+ }
331
+ }
332
+
252
333
// TestHeaderPopulatedWithAppProfile verifies that request params header is populated with table name and app profile
253
334
func TestHeaderPopulatedWithAppProfile (t * testing.T ) {
254
335
testEnv , err := NewEmulatedEnv (IntegrationTestConfig {})
0 commit comments