|
|
@@ -149,30 +149,37 @@ func resolveMetrics(metrics map[string]interface{}, patterns []string) []string
|
|
|
// resolveMetrics takes a single of input metric pattern, and resolves it to one
|
|
|
// or more canonical metric names.
|
|
|
func resolveMetric(metrics map[string]interface{}, pattern string, path string) []string {
|
|
|
- var ok bool
|
|
|
-
|
|
|
- // Build up the canonical metric path
|
|
|
- parts := strings.Split(pattern, "/")
|
|
|
- for len(parts) > 1 {
|
|
|
- if metrics, ok = metrics[parts[0]].(map[string]interface{}); !ok {
|
|
|
- utils.Fatalf("Failed to retrieve system metrics: %s", path+parts[0])
|
|
|
+ results := []string{}
|
|
|
+
|
|
|
+ // If a nested metric was requested, recurse optionally branching (via comma)
|
|
|
+ parts := strings.SplitN(pattern, "/", 2)
|
|
|
+ if len(parts) > 1 {
|
|
|
+ for _, variation := range strings.Split(parts[0], ",") {
|
|
|
+ if submetrics, ok := metrics[variation].(map[string]interface{}); !ok {
|
|
|
+ utils.Fatalf("Failed to retrieve system metrics: %s", path+variation)
|
|
|
+ return nil
|
|
|
+ } else {
|
|
|
+ results = append(results, resolveMetric(submetrics, parts[1], path+variation+"/")...)
|
|
|
+ }
|
|
|
}
|
|
|
- path += parts[0] + "/"
|
|
|
- parts = parts[1:]
|
|
|
+ return results
|
|
|
}
|
|
|
// Depending what the last link is, return or expand
|
|
|
- switch metric := metrics[parts[0]].(type) {
|
|
|
- case float64:
|
|
|
- // Final metric value found, return as singleton
|
|
|
- return []string{path + parts[0]}
|
|
|
+ for _, variation := range strings.Split(pattern, ",") {
|
|
|
+ switch metric := metrics[variation].(type) {
|
|
|
+ case float64:
|
|
|
+ // Final metric value found, return as singleton
|
|
|
+ results = append(results, path+variation)
|
|
|
|
|
|
- case map[string]interface{}:
|
|
|
- return expandMetrics(metric, path+parts[0]+"/")
|
|
|
+ case map[string]interface{}:
|
|
|
+ results = append(results, expandMetrics(metric, path+variation+"/")...)
|
|
|
|
|
|
- default:
|
|
|
- utils.Fatalf("Metric pattern resolved to unexpected type: %v", reflect.TypeOf(metric))
|
|
|
- return nil
|
|
|
+ default:
|
|
|
+ utils.Fatalf("Metric pattern resolved to unexpected type: %v", reflect.TypeOf(metric))
|
|
|
+ return nil
|
|
|
+ }
|
|
|
}
|
|
|
+ return results
|
|
|
}
|
|
|
|
|
|
// expandMetrics expands the entire tree of metrics into a flat list of paths.
|