@@ -9,15 +9,16 @@ use std::{collections::HashMap, env, fmt::Debug, net::SocketAddr};
9
9
// Third Party Imports
10
10
use axum:: {
11
11
body:: Bytes ,
12
- extract:: { Json , Path , Query } ,
12
+ extract:: { ConnectInfo , Json , Path , Query } ,
13
13
http:: { HeaderMap , Method } ,
14
14
middleware, routing, Router ,
15
15
} ;
16
16
17
17
pub ( crate ) mod metrics;
18
18
19
- #[ derive( Debug , serde:: Serialize , Clone ) ]
19
+ #[ derive( Clone , Debug , serde:: Serialize ) ]
20
20
struct Echo {
21
+ client : String ,
21
22
method : String ,
22
23
path : String ,
23
24
headers : HashMap < String , String > ,
@@ -28,6 +29,8 @@ struct Echo {
28
29
#[ derive( Debug , clap:: Parser ) ]
29
30
#[ command( author, version, about) ]
30
31
struct Args {
32
+ #[ arg( short = 'h' , long = "host" , env = "ECHO_HOST" , default_value = "[::]" ) ]
33
+ pub host : String ,
31
34
#[ arg( short = 'p' , long = "port" , env = "ECHO_PORT" , default_value_t = 8080 ) ]
32
35
pub port : usize ,
33
36
#[ arg(
@@ -52,8 +55,9 @@ struct Args {
52
55
pub log_level : tracing:: Level ,
53
56
}
54
57
55
- #[ tracing:: instrument]
58
+ #[ tracing:: instrument( ret , skip_all , parent = None ) ]
56
59
async fn serialize_request (
60
+ ConnectInfo ( client) : ConnectInfo < SocketAddr > ,
57
61
method : Method ,
58
62
path : Option < Path < String > > ,
59
63
Query ( params) : Query < HashMap < String , String > > ,
@@ -90,11 +94,10 @@ async fn serialize_request(
90
94
} )
91
95
} ;
92
96
93
- let method = method. to_string ( ) ;
94
-
95
- tracing:: info!( "{} {}" , & method, & path) ;
97
+ let ( client, method) = ( client. to_string ( ) , method. to_string ( ) ) ;
96
98
97
99
Json ( Echo {
100
+ client,
98
101
method,
99
102
path,
100
103
headers,
@@ -130,26 +133,26 @@ async fn echo_router() -> anyhow::Result<Router> {
130
133
. route_layer ( middleware:: from_fn ( metrics:: track_metrics) ) )
131
134
}
132
135
133
- #[ tracing:: instrument]
134
- async fn serve_app ( port : usize ) -> anyhow:: Result < ( ) > {
136
+ #[ tracing:: instrument( skip_all ) ]
137
+ async fn serve_app ( host : & str , port : usize ) -> anyhow:: Result < ( ) > {
135
138
let app = echo_router ( ) . await ?;
136
139
137
- let addr: SocketAddr = format ! ( "[::] :{port}" ) . parse ( ) ?;
140
+ let addr: SocketAddr = format ! ( "{host} :{port}" ) . parse ( ) ?;
138
141
139
142
tracing:: info!( "`echo-rs` server listening at: http://{addr}" ) ;
140
143
141
144
axum:: Server :: bind ( & addr)
142
- . serve ( app. into_make_service ( ) )
145
+ . serve ( app. into_make_service_with_connect_info :: < SocketAddr > ( ) )
143
146
. await ?;
144
147
145
148
Ok ( ( ) )
146
149
}
147
150
148
- #[ tracing:: instrument]
149
- async fn serve_metrics ( port : usize ) -> anyhow:: Result < ( ) > {
151
+ #[ tracing:: instrument( skip_all ) ]
152
+ async fn serve_metrics ( host : & str , port : usize ) -> anyhow:: Result < ( ) > {
150
153
let app = metrics:: router ( ) ;
151
154
152
- let addr: SocketAddr = format ! ( "[::] :{port}" ) . parse ( ) ?;
155
+ let addr: SocketAddr = format ! ( "{host} :{port}" ) . parse ( ) ?;
153
156
154
157
tracing:: info!( "Serving Prometheus metrics at: http://{addr}" ) ;
155
158
@@ -161,8 +164,8 @@ async fn serve_metrics(port: usize) -> anyhow::Result<()> {
161
164
Ok ( ( ) )
162
165
}
163
166
164
- #[ tokio:: main]
165
167
#[ tracing:: instrument]
168
+ #[ tokio:: main]
166
169
async fn main ( ) -> anyhow:: Result < ( ) > {
167
170
let args = <Args as clap:: Parser >:: parse ( ) ;
168
171
@@ -188,10 +191,12 @@ async fn main() -> anyhow::Result<()> {
188
191
tracing:: subscriber:: set_global_default ( subscriber) . expect ( "setting default subscriber failed" ) ;
189
192
190
193
if !args. metrics {
191
- serve_app ( args. port ) . await
194
+ serve_app ( & args . host , args. port ) . await
192
195
} else {
193
- let ( echo_server, metrics_server) =
194
- tokio:: join!( serve_app( args. port) , serve_metrics( args. metrics_port) ) ;
196
+ let ( echo_server, metrics_server) = tokio:: join!(
197
+ serve_app( & args. host, args. port) ,
198
+ serve_metrics( & args. host, args. metrics_port)
199
+ ) ;
195
200
let ( _, _) = ( echo_server?, metrics_server?) ;
196
201
197
202
Ok ( ( ) )
0 commit comments