1
1
// Copyright 2019 TiKV Project Authors. Licensed under Apache-2.0.
2
2
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 ;
9
4
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 ;
10
12
use lazy_static:: lazy_static;
11
13
use 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 > ;
12
18
13
19
lazy_static ! {
14
20
static ref HTTP_COUNTER : Counter = register_counter!( opts!(
@@ -31,38 +37,39 @@ lazy_static! {
31
37
. unwrap( ) ;
32
38
}
33
39
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 > {
35
41
let encoder = TextEncoder :: new ( ) ;
36
42
37
43
HTTP_COUNTER . inc ( ) ;
38
44
let timer = HTTP_REQ_HISTOGRAM . with_label_values ( & [ "all" ] ) . start_timer ( ) ;
39
45
40
46
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 ) ;
44
49
45
50
let response = Response :: builder ( )
46
51
. status ( 200 )
47
52
. header ( CONTENT_TYPE , encoder. format_type ( ) )
48
- . body ( Body :: from ( buffer) )
49
- . unwrap ( ) ;
53
+ . body ( body) ?;
50
54
51
55
timer. observe_duration ( ) ;
52
56
53
57
Ok ( response)
54
58
}
55
59
56
60
#[ 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 ( ) ;
59
63
println ! ( "Listening on http://{}" , addr) ;
64
+ let listener = TcpListener :: bind ( addr) . await ?;
60
65
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 ) ;
64
69
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
+ } ;
67
74
}
68
75
}
0 commit comments