@@ -8,7 +8,7 @@ pub(crate) mod hooks;
8
8
pub ( crate ) mod progress_options;
9
9
10
10
use std:: {
11
- collections:: { BTreeMap , HashMap } ,
11
+ collections:: BTreeMap ,
12
12
fmt:: { self , Display , Formatter } ,
13
13
path:: PathBuf ,
14
14
} ;
@@ -283,30 +283,26 @@ impl GlobalOptions {
283
283
fn make_url_and_encoded_metrics (
284
284
url : & Url ,
285
285
job : & str ,
286
- grouping : HashMap < & str , & str > ,
286
+ grouping : BTreeMap < & str , & str > ,
287
287
) -> Result < ( Url , Vec < u8 > ) > {
288
+ use base64:: prelude:: * ;
288
289
use prometheus:: { Encoder , ProtobufEncoder } ;
289
290
const LABEL_NAME_JOB : & str = "job" ;
290
291
291
- if job. contains ( '/' ) {
292
- bail ! ( "job contains '/': {}" , job) ;
293
- }
294
-
295
- let url = url. join ( "metrics/job/" ) ?;
296
- // TODO: escape job
297
- let mut url_components = vec ! [ job] ;
292
+ let mut url_components = vec ! [
293
+ "metrics" . to_string( ) ,
294
+ "job@base64" . to_string( ) ,
295
+ BASE64_URL_SAFE_NO_PAD . encode( job) ,
296
+ ] ;
298
297
299
298
for ( ln, lv) in & grouping {
300
299
// TODO: check label name
301
- if lv. contains ( '/' ) {
302
- bail ! ( "value of grouping label {} contains '/': {}" , ln, lv) ;
303
- }
304
- url_components. push ( ln) ;
305
- url_components. push ( lv) ;
300
+ let name = ln. to_string ( ) + "@base64" ;
301
+ url_components. push ( name) ;
302
+ url_components. push ( BASE64_URL_SAFE_NO_PAD . encode ( lv) ) ;
306
303
}
307
304
308
305
let url = url. join ( & url_components. join ( "/" ) ) ?;
309
-
310
306
let encoder = ProtobufEncoder :: new ( ) ;
311
307
let mut buf = Vec :: new ( ) ;
312
308
0 commit comments