@@ -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
@@ -375,8 +417,8 @@ impl QueryServer {
375417 let client = reqwest:: Client :: new ( ) ;
376418 let res = client
377419 . get ( url)
378- . header ( "Content-Type" , "application/json" )
379- . header ( "Authorization" , ingester. token )
420+ . header ( header :: CONTENT_TYPE , "application/json" )
421+ . header ( header :: AUTHORIZATION , ingester. token )
380422 . send ( )
381423 . await
382424 . map_err ( |err| {
@@ -424,8 +466,8 @@ impl QueryServer {
424466 let client = reqwest:: Client :: new ( ) ;
425467 let res = client
426468 . put ( url)
427- . header ( "Content-Type" , "application/json" )
428- . header ( "Authorization" , ingester. token )
469+ . header ( header :: CONTENT_TYPE , "application/json" )
470+ . header ( header :: AUTHORIZATION , ingester. token )
429471 . send ( )
430472 . await
431473 . map_err ( |err| {
@@ -473,8 +515,8 @@ impl QueryServer {
473515 let client = reqwest:: Client :: new ( ) ;
474516 let resp = client
475517 . delete ( url)
476- . header ( "Content-Type" , "application/json" )
477- . header ( "Authorization" , ingester. token )
518+ . header ( header :: CONTENT_TYPE , "application/json" )
519+ . header ( header :: AUTHORIZATION , ingester. token )
478520 . send ( )
479521 . await
480522 . map_err ( |err| {
@@ -649,6 +691,7 @@ impl StorageStats {
649691struct ClusterInfo {
650692 domain_name : String ,
651693 reachable : bool ,
694+ staging_path : String ,
652695 error : Option < String > , // error message if the ingester is not reachable
653696 status : Option < String > , // status message if the ingester is reachable
654697}
@@ -657,12 +700,14 @@ impl ClusterInfo {
657700 fn new (
658701 domain_name : & str ,
659702 reachable : bool ,
703+ staging_path : String ,
660704 error : Option < String > ,
661705 status : Option < String > ,
662706 ) -> Self {
663707 Self {
664708 domain_name : domain_name. to_string ( ) ,
665709 reachable,
710+ staging_path,
666711 error,
667712 status,
668713 }
0 commit comments