@@ -19,6 +19,8 @@ use std::sync::Arc;
19
19
use databend_common_arrow:: arrow_format:: flight:: data:: BasicAuth ;
20
20
use databend_common_base:: base:: tokio:: sync:: mpsc;
21
21
use databend_common_base:: future:: TimingFutureExt ;
22
+ use databend_common_base:: runtime:: ThreadTracker ;
23
+ use databend_common_base:: runtime:: TrackingGuard ;
22
24
use databend_common_grpc:: GrpcClaim ;
23
25
use databend_common_grpc:: GrpcToken ;
24
26
use databend_common_meta_client:: MetaGrpcReadReq ;
@@ -281,15 +283,20 @@ impl MetaService for MetaServiceImpl {
281
283
async fn kv_api ( & self , request : Request < RaftRequest > ) -> Result < Response < RaftReply > , Status > {
282
284
self . check_token ( request. metadata ( ) ) ?;
283
285
284
- network_metrics:: incr_recv_bytes ( request. get_ref ( ) . encoded_len ( ) as u64 ) ;
285
- let _guard = RequestInFlight :: guard ( ) ;
286
+ let _guard = thread_tracking_guard ( & request) ;
287
+ ThreadTracker :: tracking_future ( async move {
288
+ network_metrics:: incr_recv_bytes ( request. get_ref ( ) . encoded_len ( ) as u64 ) ;
289
+ let _guard = RequestInFlight :: guard ( ) ;
286
290
287
- let root = databend_common_tracing:: start_trace_for_remote_request ( full_name ! ( ) , & request) ;
288
- let reply = self . handle_kv_api ( request) . in_span ( root) . await ?;
291
+ let root =
292
+ databend_common_tracing:: start_trace_for_remote_request ( full_name ! ( ) , & request) ;
293
+ let reply = self . handle_kv_api ( request) . in_span ( root) . await ?;
289
294
290
- network_metrics:: incr_sent_bytes ( reply. encoded_len ( ) as u64 ) ;
295
+ network_metrics:: incr_sent_bytes ( reply. encoded_len ( ) as u64 ) ;
291
296
292
- Ok ( Response :: new ( reply) )
297
+ Ok ( Response :: new ( reply) )
298
+ } )
299
+ . await
293
300
}
294
301
295
302
type KvReadV1Stream = BoxStream < StreamItem > ;
@@ -300,15 +307,20 @@ impl MetaService for MetaServiceImpl {
300
307
) -> Result < Response < Self :: KvReadV1Stream > , Status > {
301
308
self . check_token ( request. metadata ( ) ) ?;
302
309
303
- network_metrics:: incr_recv_bytes ( request. get_ref ( ) . encoded_len ( ) as u64 ) ;
304
- let root = databend_common_tracing:: start_trace_for_remote_request ( full_name ! ( ) , & request) ;
310
+ let _guard = thread_tracking_guard ( & request) ;
311
+ ThreadTracker :: tracking_future ( async move {
312
+ network_metrics:: incr_recv_bytes ( request. get_ref ( ) . encoded_len ( ) as u64 ) ;
313
+ let root =
314
+ databend_common_tracing:: start_trace_for_remote_request ( full_name ! ( ) , & request) ;
305
315
306
- let ( endpoint, strm) = self . handle_kv_read_v1 ( request) . in_span ( root) . await ?;
316
+ let ( endpoint, strm) = self . handle_kv_read_v1 ( request) . in_span ( root) . await ?;
307
317
308
- let mut resp = Response :: new ( strm) ;
309
- GrpcHelper :: add_response_meta_leader ( & mut resp, endpoint. as_ref ( ) ) ;
318
+ let mut resp = Response :: new ( strm) ;
319
+ GrpcHelper :: add_response_meta_leader ( & mut resp, endpoint. as_ref ( ) ) ;
310
320
311
- Ok ( resp)
321
+ Ok ( resp)
322
+ } )
323
+ . await
312
324
}
313
325
314
326
async fn transaction (
@@ -317,18 +329,24 @@ impl MetaService for MetaServiceImpl {
317
329
) -> Result < Response < TxnReply > , Status > {
318
330
self . check_token ( request. metadata ( ) ) ?;
319
331
320
- network_metrics:: incr_recv_bytes ( request. get_ref ( ) . encoded_len ( ) as u64 ) ;
321
- let _guard = RequestInFlight :: guard ( ) ;
332
+ let _guard = thread_tracking_guard ( & request) ;
322
333
323
- let root = databend_common_tracing:: start_trace_for_remote_request ( full_name ! ( ) , & request) ;
324
- let ( endpoint, reply) = self . handle_txn ( request) . in_span ( root) . await ?;
334
+ ThreadTracker :: tracking_future ( async move {
335
+ network_metrics:: incr_recv_bytes ( request. get_ref ( ) . encoded_len ( ) as u64 ) ;
336
+ let _guard = RequestInFlight :: guard ( ) ;
325
337
326
- network_metrics:: incr_sent_bytes ( reply. encoded_len ( ) as u64 ) ;
338
+ let root =
339
+ databend_common_tracing:: start_trace_for_remote_request ( full_name ! ( ) , & request) ;
340
+ let ( endpoint, reply) = self . handle_txn ( request) . in_span ( root) . await ?;
327
341
328
- let mut resp = Response :: new ( reply) ;
329
- GrpcHelper :: add_response_meta_leader ( & mut resp, endpoint. as_ref ( ) ) ;
342
+ network_metrics:: incr_sent_bytes ( reply. encoded_len ( ) as u64 ) ;
330
343
331
- Ok ( resp)
344
+ let mut resp = Response :: new ( reply) ;
345
+ GrpcHelper :: add_response_meta_leader ( & mut resp, endpoint. as_ref ( ) ) ;
346
+
347
+ Ok ( resp)
348
+ } )
349
+ . await
332
350
}
333
351
334
352
type ExportStream = Pin < Box < dyn Stream < Item = Result < ExportedChunk , Status > > + Send + ' static > > ;
@@ -483,3 +501,15 @@ impl MetaService for MetaServiceImpl {
483
501
Err ( Status :: unavailable ( "can not get client ip address" ) )
484
502
}
485
503
}
504
+
505
+ fn thread_tracking_guard < T > ( req : & tonic:: Request < T > ) -> Option < TrackingGuard > {
506
+ if let Some ( value) = req. metadata ( ) . get ( "QueryID" ) {
507
+ if let Ok ( value) = value. to_str ( ) {
508
+ let mut tracking_payload = ThreadTracker :: new_tracking_payload ( ) ;
509
+ tracking_payload. query_id = Some ( value. to_string ( ) ) ;
510
+ return Some ( ThreadTracker :: tracking ( tracking_payload) ) ;
511
+ }
512
+ }
513
+
514
+ None
515
+ }
0 commit comments