11// Copyright 2019 TiKV Project Authors. Licensed under Apache-2.0.
22
3- use hyper:: {
4- header:: CONTENT_TYPE ,
5- service:: { make_service_fn, service_fn} ,
6- Body , Request , Response , Server ,
7- } ;
8- use prometheus:: { Counter , Encoder , Gauge , HistogramVec , TextEncoder } ;
3+ use std:: net:: SocketAddr ;
94
5+ use hyper:: body:: Incoming ;
6+ use hyper:: header:: CONTENT_TYPE ;
7+ use hyper:: server:: conn:: http1;
8+ use hyper:: service:: service_fn;
9+ use hyper:: Request ;
10+ use hyper:: Response ;
11+ use hyper_util:: rt:: TokioIo ;
1012use lazy_static:: lazy_static;
1113use prometheus:: { labels, opts, register_counter, register_gauge, register_histogram_vec} ;
14+ use prometheus:: { Counter , Encoder , Gauge , HistogramVec , TextEncoder } ;
15+ use tokio:: net:: TcpListener ;
16+
17+ type BoxedErr = Box < dyn std:: error:: Error + Send + Sync + ' static > ;
1218
1319lazy_static ! {
1420 static ref HTTP_COUNTER : Counter = register_counter!( opts!(
@@ -31,38 +37,39 @@ lazy_static! {
3137 . unwrap( ) ;
3238}
3339
34- async fn serve_req ( _req : Request < Body > ) -> Result < Response < Body > , hyper :: Error > {
40+ async fn serve_req ( _req : Request < Incoming > ) -> Result < Response < String > , BoxedErr > {
3541 let encoder = TextEncoder :: new ( ) ;
3642
3743 HTTP_COUNTER . inc ( ) ;
3844 let timer = HTTP_REQ_HISTOGRAM . with_label_values ( & [ "all" ] ) . start_timer ( ) ;
3945
4046 let metric_families = prometheus:: gather ( ) ;
41- let mut buffer = vec ! [ ] ;
42- encoder. encode ( & metric_families, & mut buffer) . unwrap ( ) ;
43- HTTP_BODY_GAUGE . set ( buffer. len ( ) as f64 ) ;
47+ let body = encoder. encode_to_string ( & metric_families) ?;
48+ HTTP_BODY_GAUGE . set ( body. len ( ) as f64 ) ;
4449
4550 let response = Response :: builder ( )
4651 . status ( 200 )
4752 . header ( CONTENT_TYPE , encoder. format_type ( ) )
48- . body ( Body :: from ( buffer) )
49- . unwrap ( ) ;
53+ . body ( body) ?;
5054
5155 timer. observe_duration ( ) ;
5256
5357 Ok ( response)
5458}
5559
5660#[ tokio:: main]
57- async fn main ( ) {
58- let addr = ( [ 127 , 0 , 0 , 1 ] , 9898 ) . into ( ) ;
61+ async fn main ( ) -> Result < ( ) , BoxedErr > {
62+ let addr: SocketAddr = ( [ 127 , 0 , 0 , 1 ] , 9898 ) . into ( ) ;
5963 println ! ( "Listening on http://{}" , addr) ;
64+ let listener = TcpListener :: bind ( addr) . await ?;
6065
61- let serve_future = Server :: bind ( & addr ) . serve ( make_service_fn ( |_| async {
62- Ok :: < _ , hyper :: Error > ( service_fn ( serve_req ) )
63- } ) ) ;
66+ loop {
67+ let ( stream , _ ) = listener . accept ( ) . await ? ;
68+ let io = TokioIo :: new ( stream ) ;
6469
65- if let Err ( err) = serve_future. await {
66- eprintln ! ( "server error: {}" , err) ;
70+ let service = service_fn ( serve_req) ;
71+ if let Err ( err) = http1:: Builder :: new ( ) . serve_connection ( io, service) . await {
72+ eprintln ! ( "server error: {:?}" , err) ;
73+ } ;
6774 }
6875}
0 commit comments