@@ -299,6 +299,17 @@ const (
299
299
contentTypePickle = "application/pickle"
300
300
)
301
301
302
+ func fetchCarbonsearchResponse (req * http.Request , rewrite * url.URL ) []string {
303
+ // Send query to SearchBackend. The result is []queries for StorageBackends
304
+ searchResponse := multiGet ([]string {Config .SearchBackend }, rewrite .RequestURI ())
305
+ m , _ := findUnpackPB (req , searchResponse )
306
+ queries := make ([]string , 0 , len (m ))
307
+ for _ , v := range m {
308
+ queries = append (queries , v .Path )
309
+ }
310
+ return queries
311
+ }
312
+
302
313
func findHandler (w http.ResponseWriter , req * http.Request ) {
303
314
304
315
logger .Debugln ("request: " , req .URL .RequestURI ())
@@ -327,14 +338,7 @@ func findHandler(w http.ResponseWriter, req *http.Request) {
327
338
encodeFindResponse (format , originalQuery , w , matches )
328
339
return
329
340
}
330
-
331
- // Send query to SearchBackend. The result is []queries for StorageBackends
332
- searchResponse := multiGet ([]string {Config .SearchBackend }, rewrite .RequestURI ())
333
- m , _ := findUnpackPB (req , searchResponse )
334
- queries = make ([]string , 0 , len (m ))
335
- for _ , v := range m {
336
- queries = append (queries , v .Path )
337
- }
341
+ queries = fetchCarbonsearchResponse (req , rewrite )
338
342
}
339
343
340
344
var metrics []* pb3.GlobMatch
@@ -438,21 +442,46 @@ func renderHandler(w http.ResponseWriter, req *http.Request) {
438
442
return
439
443
}
440
444
441
- var serverList []string
442
- var ok bool
443
-
444
- // lookup the server list for this metric, or use all the servers if it's unknown
445
- if serverList , ok = Config .pathCache .get (target ); ! ok || serverList == nil || len (serverList ) == 0 {
446
- serverList = Config .Backends
447
- }
448
-
449
445
format := req .FormValue ("format" )
446
+
450
447
rewrite , _ := url .ParseRequestURI (req .URL .RequestURI ())
451
448
v := rewrite .Query ()
452
449
v .Set ("format" , "protobuf3" )
453
- rewrite .RawQuery = v .Encode ()
454
450
455
- responses := multiGet (serverList , rewrite .RequestURI ())
451
+ var serverList []string
452
+ var ok bool
453
+ var responses []serverResponse
454
+ if searchConfigured && strings .HasPrefix (target , Config .SearchPrefix ) {
455
+ Metrics .SearchRequests .Add (1 )
456
+
457
+ findUrl := & url.URL {Path : "/metrics/find/" }
458
+ findValues := url.Values {}
459
+ findValues .Set ("format" , "protobuf3" )
460
+ findValues .Set ("query" , target )
461
+ findUrl .RawQuery = findValues .Encode ()
462
+ metrics := fetchCarbonsearchResponse (req , findUrl )
463
+
464
+ for _ , target := range metrics {
465
+ v .Set ("target" , target )
466
+ rewrite .RawQuery = v .Encode ()
467
+
468
+ // lookup the server list for this metric, or use all the servers if it's unknown
469
+ if serverList , ok = Config .pathCache .get (target ); ! ok || serverList == nil || len (serverList ) == 0 {
470
+ serverList = Config .Backends
471
+ }
472
+
473
+ responses = append (responses , multiGet (serverList , rewrite .RequestURI ())... )
474
+ }
475
+ } else {
476
+ rewrite .RawQuery = v .Encode ()
477
+
478
+ // lookup the server list for this metric, or use all the servers if it's unknown
479
+ if serverList , ok = Config .pathCache .get (target ); ! ok || serverList == nil || len (serverList ) == 0 {
480
+ serverList = Config .Backends
481
+ }
482
+
483
+ responses = multiGet (serverList , rewrite .RequestURI ())
484
+ }
456
485
457
486
if len (responses ) == 0 {
458
487
logger .Logln ("render: error querying backends for:" , req .URL .RequestURI (), "backends:" , serverList )
0 commit comments