@@ -34,6 +34,7 @@ use itertools::Itertools;
3434use relative_path:: RelativePathBuf ;
3535use reqwest:: Response ;
3636use serde:: { Deserialize , Serialize } ;
37+ use serde_json:: Value as JsonValue ;
3738use std:: sync:: Arc ;
3839use url:: Url ;
3940
@@ -194,20 +195,61 @@ impl QueryServer {
194195 let mut infos = vec ! [ ] ;
195196
196197 for ingester in ingester_infos {
197- let uri = Url :: parse ( & format ! ( "{}liveness" , ingester. domain_name) )
198- . expect ( "should always be a valid url" ) ;
198+ let uri = Url :: parse ( & format ! (
199+ "{}{}/about" ,
200+ ingester. domain_name,
201+ base_path_without_preceding_slash( )
202+ ) )
203+ . expect ( "should always be a valid url" ) ;
199204
200- let reqw = reqwest:: Client :: new ( )
205+ let resp = reqwest:: Client :: new ( )
201206 . get ( uri)
207+ . header ( header:: AUTHORIZATION , ingester. token . clone ( ) )
202208 . header ( header:: CONTENT_TYPE , "application/json" )
203209 . send ( )
204210 . await ;
205211
212+ let ( reachable, staging_path, error, status) = if let Ok ( resp) = resp {
213+ let status = Some ( resp. status ( ) . to_string ( ) ) ;
214+
215+ let resp_data = resp. bytes ( ) . await . map_err ( |err| {
216+ log:: error!( "Fatal: failed to parse ingester info to bytes: {:?}" , err) ;
217+ StreamError :: Custom {
218+ msg : format ! ( "failed to parse ingester info to bytes: {:?}" , err) ,
219+ status : StatusCode :: INTERNAL_SERVER_ERROR ,
220+ }
221+ } ) ?;
222+
223+ let sp = serde_json:: from_slice :: < JsonValue > ( & resp_data)
224+ . map_err ( |err| {
225+ log:: error!( "Fatal: failed to parse ingester info: {:?}" , err) ;
226+ StreamError :: Custom {
227+ msg : format ! ( "failed to parse ingester info: {:?}" , err) ,
228+ status : StatusCode :: INTERNAL_SERVER_ERROR ,
229+ }
230+ } ) ?
231+ . get ( "staging" )
232+ . unwrap ( )
233+ . as_str ( )
234+ . unwrap ( )
235+ . to_string ( ) ;
236+
237+ ( true , sp, None , status)
238+ } else {
239+ (
240+ false ,
241+ "" . to_owned ( ) ,
242+ resp. as_ref ( ) . err ( ) . map ( |e| e. to_string ( ) ) ,
243+ resp. unwrap_err ( ) . status ( ) . map ( |s| s. to_string ( ) ) ,
244+ )
245+ } ;
246+
206247 infos. push ( ClusterInfo :: new (
207248 & ingester. domain_name ,
208- reqw. is_ok ( ) ,
209- reqw. as_ref ( ) . err ( ) . map ( |e| e. to_string ( ) ) ,
210- reqw. ok ( ) . map ( |r| r. status ( ) . to_string ( ) ) ,
249+ reachable,
250+ staging_path,
251+ error,
252+ status,
211253 ) ) ;
212254 }
213255
@@ -390,8 +432,8 @@ impl QueryServer {
390432 let client = reqwest:: Client :: new ( ) ;
391433 let res = client
392434 . get ( url)
393- . header ( "Content-Type" , "application/json" )
394- . header ( "Authorization" , ingester. token )
435+ . header ( header :: CONTENT_TYPE , "application/json" )
436+ . header ( header :: AUTHORIZATION , ingester. token )
395437 . send ( )
396438 . await
397439 . map_err ( |err| {
@@ -439,8 +481,8 @@ impl QueryServer {
439481 let client = reqwest:: Client :: new ( ) ;
440482 let res = client
441483 . put ( url)
442- . header ( "Content-Type" , "application/json" )
443- . header ( "Authorization" , ingester. token )
484+ . header ( header :: CONTENT_TYPE , "application/json" )
485+ . header ( header :: AUTHORIZATION , ingester. token )
444486 . send ( )
445487 . await
446488 . map_err ( |err| {
@@ -488,8 +530,8 @@ impl QueryServer {
488530 let client = reqwest:: Client :: new ( ) ;
489531 let resp = client
490532 . delete ( url)
491- . header ( "Content-Type" , "application/json" )
492- . header ( "Authorization" , ingester. token )
533+ . header ( header :: CONTENT_TYPE , "application/json" )
534+ . header ( header :: AUTHORIZATION , ingester. token )
493535 . send ( )
494536 . await
495537 . map_err ( |err| {
@@ -664,6 +706,7 @@ impl StorageStats {
664706struct ClusterInfo {
665707 domain_name : String ,
666708 reachable : bool ,
709+ staging_path : String ,
667710 error : Option < String > , // error message if the ingester is not reachable
668711 status : Option < String > , // status message if the ingester is reachable
669712}
@@ -672,12 +715,14 @@ impl ClusterInfo {
672715 fn new (
673716 domain_name : & str ,
674717 reachable : bool ,
718+ staging_path : String ,
675719 error : Option < String > ,
676720 status : Option < String > ,
677721 ) -> Self {
678722 Self {
679723 domain_name : domain_name. to_string ( ) ,
680724 reachable,
725+ staging_path,
681726 error,
682727 status,
683728 }
0 commit comments