@@ -173,6 +173,60 @@ fn push<S: BuildHasher>(
173173 }
174174}
175175
176+ pub fn push_raw < S : BuildHasher > (
177+ url : & str ,
178+ mfs : Vec < proto:: MetricFamily > ,
179+ method : & str ,
180+ basic_auth : Option < BasicAuthentication > ,
181+ ) -> Result < ( ) > {
182+ let mut push_url = if url. contains ( "://" ) {
183+ url. to_owned ( )
184+ } else {
185+ format ! ( "http://{}" , url)
186+ } ;
187+
188+ if push_url. ends_with ( '/' ) {
189+ push_url. pop ( ) ;
190+ }
191+
192+ let encoder = ProtobufEncoder :: new ( ) ;
193+ let mut proto_buf = Vec :: new ( ) ;
194+
195+ for mf in mfs {
196+ // Ignore error, `no metrics` and `no name`.
197+ let _ = encoder. encode ( & [ mf] , & mut proto_buf) ;
198+ }
199+
200+ let buf = snap:: raw:: Encoder :: new ( )
201+ . compress_vec ( & proto_buf)
202+ . expect ( "msg" ) ;
203+
204+ let mut builder = HTTP_CLIENT
205+ . request (
206+ Method :: from_str ( method) . unwrap ( ) ,
207+ Url :: from_str ( & push_url) . unwrap ( ) ,
208+ )
209+ . header ( CONTENT_TYPE , encoder. format_type ( ) )
210+ . header ( "Content-Encoding" , "snappy" )
211+ . body ( buf) ;
212+
213+ if let Some ( BasicAuthentication { username, password } ) = basic_auth {
214+ builder = builder. basic_auth ( username, Some ( password) ) ;
215+ }
216+
217+ let response = builder. send ( ) . map_err ( |e| Error :: Msg ( format ! ( "{}" , e) ) ) ?;
218+
219+ match response. status ( ) {
220+ StatusCode :: ACCEPTED => Ok ( ( ) ) ,
221+ StatusCode :: OK => Ok ( ( ) ) ,
222+ _ => Err ( Error :: Msg ( format ! (
223+ "unexpected status code {} while pushing to {}" ,
224+ response. status( ) ,
225+ push_url
226+ ) ) ) ,
227+ }
228+ }
229+
176230fn push_from_collector < S : BuildHasher > (
177231 job : & str ,
178232 grouping : HashMap < String , String , S > ,
0 commit comments