1
1
use std:: io:: Cursor ;
2
2
use std:: net:: { IpAddr , SocketAddr } ;
3
3
use std:: sync:: Arc ;
4
+ use std:: time:: Duration ;
4
5
5
6
use aquatic_udp_protocol:: Response ;
6
7
use tokio:: sync:: RwLock ;
8
+ use tokio:: time:: Instant ;
7
9
use tracing:: { instrument, Level } ;
8
10
9
11
use super :: banning:: BanService ;
10
12
use super :: bound_socket:: BoundSocket ;
13
+ use crate :: core:: statistics:: event:: UdpResponseKind ;
11
14
use crate :: core:: { statistics, Tracker } ;
12
15
use crate :: servers:: udp:: handlers:: CookieTimeValues ;
13
16
use crate :: servers:: udp:: { handlers, RawRequest } ;
@@ -30,6 +33,9 @@ impl Processor {
30
33
#[ instrument( skip( self , request, ban_service) ) ]
31
34
pub async fn process_request ( self , request : RawRequest , ban_service : Arc < RwLock < BanService > > ) {
32
35
let from = request. from ;
36
+
37
+ let start_time = Instant :: now ( ) ;
38
+
33
39
let response = handlers:: handle_packet (
34
40
request,
35
41
& self . tracker ,
@@ -39,11 +45,13 @@ impl Processor {
39
45
)
40
46
. await ;
41
47
42
- self . send_response ( from, response) . await ;
48
+ let elapsed_time = start_time. elapsed ( ) ;
49
+
50
+ self . send_response ( from, response, elapsed_time) . await ;
43
51
}
44
52
45
53
#[ instrument( skip( self ) ) ]
46
- async fn send_response ( self , target : SocketAddr , response : Response ) {
54
+ async fn send_response ( self , target : SocketAddr , response : Response , req_processing_time : Duration ) {
47
55
tracing:: debug!( "send response" ) ;
48
56
49
57
let response_type = match & response {
@@ -54,6 +62,13 @@ impl Processor {
54
62
Response :: Error ( e) => format ! ( "Error: {e:?}" ) ,
55
63
} ;
56
64
65
+ let response_kind = match & response {
66
+ Response :: Connect ( _) => UdpResponseKind :: Connect ,
67
+ Response :: AnnounceIpv4 ( _) | Response :: AnnounceIpv6 ( _) => UdpResponseKind :: Announce ,
68
+ Response :: Scrape ( _) => UdpResponseKind :: Scrape ,
69
+ Response :: Error ( _e) => UdpResponseKind :: Error ,
70
+ } ;
71
+
57
72
let mut writer = Cursor :: new ( Vec :: with_capacity ( 200 ) ) ;
58
73
59
74
match response. write_bytes ( & mut writer) {
@@ -71,10 +86,20 @@ impl Processor {
71
86
72
87
match target. ip ( ) {
73
88
IpAddr :: V4 ( _) => {
74
- self . tracker . send_stats_event ( statistics:: event:: Event :: Udp4Response ) . await ;
89
+ self . tracker
90
+ . send_stats_event ( statistics:: event:: Event :: Udp4Response {
91
+ kind : response_kind,
92
+ req_processing_time,
93
+ } )
94
+ . await ;
75
95
}
76
96
IpAddr :: V6 ( _) => {
77
- self . tracker . send_stats_event ( statistics:: event:: Event :: Udp6Response ) . await ;
97
+ self . tracker
98
+ . send_stats_event ( statistics:: event:: Event :: Udp6Response {
99
+ kind : response_kind,
100
+ req_processing_time,
101
+ } )
102
+ . await ;
78
103
}
79
104
}
80
105
}
0 commit comments