From 179e77882c1aca8e74978ec117ce183d1c901d0f Mon Sep 17 00:00:00 2001 From: IuryAlves Date: Thu, 21 Jul 2022 14:52:08 +0200 Subject: [PATCH 1/3] List used labels by metric in grafana --- pkg/analyse/grafana.go | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/pkg/analyse/grafana.go b/pkg/analyse/grafana.go index 780189e25..1eac40555 100644 --- a/pkg/analyse/grafana.go +++ b/pkg/analyse/grafana.go @@ -24,12 +24,18 @@ type DashboardMetrics struct { UID string `json:"uid,omitempty"` Title string `json:"title"` Metrics []string `json:"metrics"` + LabelsByMetric map[string][]Label `json:"labels_by_metric"` ParseErrors []string `json:"parse_errors"` } +type Label struct { + Name string `json:"name"` + Value string `json:"value"` +} + func ParseMetricsInBoard(mig *MetricsInGrafana, board sdk.Board) { var parseErrors []error - metrics := make(map[string]struct{}) + metrics := make(map[string][]Label) // Iterate through all the panels and collect metrics for _, panel := range board.Panels { @@ -73,11 +79,12 @@ func ParseMetricsInBoard(mig *MetricsInGrafana, board sdk.Board) { Title: board.Title, Metrics: metricsInBoard, ParseErrors: parseErrs, + LabelsByMetric: metrics, }) } -func metricsFromTemplating(templating sdk.Templating, metrics map[string]struct{}) []error { +func metricsFromTemplating(templating sdk.Templating, metrics map[string][]Label) []error { parseErrors := []error{} for _, templateVar := range templating.List { if templateVar.Type != "query" { @@ -114,7 +121,7 @@ func metricsFromTemplating(templating sdk.Templating, metrics map[string]struct{ return parseErrors } -func metricsFromPanel(panel sdk.Panel, metrics map[string]struct{}) []error { +func metricsFromPanel(panel sdk.Panel, metrics map[string][]Label) []error { var parseErrors []error targets := panel.GetTargets() @@ -140,7 +147,7 @@ func metricsFromPanel(panel sdk.Panel, metrics map[string]struct{}) []error { return parseErrors } -func parseQuery(query string, metrics map[string]struct{}) error { +func parseQuery(query string, metrics map[string][]Label) error { query = strings.ReplaceAll(query, `$__interval`, "5m") query = strings.ReplaceAll(query, `$interval`, "5m") query = strings.ReplaceAll(query, `$resolution`, "5s") @@ -155,7 +162,15 @@ func parseQuery(query string, metrics map[string]struct{}) error { parser.Inspect(expr, func(node parser.Node, path []parser.Node) error { if n, ok := node.(*parser.VectorSelector); ok { - metrics[n.Name] = struct{}{} + var labels []Label + for _, l := range n.LabelMatchers { + labels = append( + labels, + Label{Name: l.Name, Value: l.Value}, + ) + } + metrics[n.Name] = labels + } return nil From 899152c1f9b766ff33b04f1edc840bf7596b7dae Mon Sep 17 00:00:00 2001 From: IuryAlves Date: Thu, 21 Jul 2022 15:28:00 +0200 Subject: [PATCH 2/3] Fix lint --- pkg/analyse/grafana.go | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/pkg/analyse/grafana.go b/pkg/analyse/grafana.go index 1eac40555..9f39192fa 100644 --- a/pkg/analyse/grafana.go +++ b/pkg/analyse/grafana.go @@ -20,16 +20,16 @@ type MetricsInGrafana struct { } type DashboardMetrics struct { - Slug string `json:"slug"` - UID string `json:"uid,omitempty"` - Title string `json:"title"` - Metrics []string `json:"metrics"` + Slug string `json:"slug"` + UID string `json:"uid,omitempty"` + Title string `json:"title"` + Metrics []string `json:"metrics"` LabelsByMetric map[string][]Label `json:"labels_by_metric"` - ParseErrors []string `json:"parse_errors"` + ParseErrors []string `json:"parse_errors"` } type Label struct { - Name string `json:"name"` + Name string `json:"name"` Value string `json:"value"` } @@ -74,11 +74,11 @@ func ParseMetricsInBoard(mig *MetricsInGrafana, board sdk.Board) { sort.Strings(metricsInBoard) mig.Dashboards = append(mig.Dashboards, DashboardMetrics{ - Slug: board.Slug, - UID: board.UID, - Title: board.Title, - Metrics: metricsInBoard, - ParseErrors: parseErrs, + Slug: board.Slug, + UID: board.UID, + Title: board.Title, + Metrics: metricsInBoard, + ParseErrors: parseErrs, LabelsByMetric: metrics, }) @@ -167,7 +167,7 @@ func parseQuery(query string, metrics map[string][]Label) error { labels = append( labels, Label{Name: l.Name, Value: l.Value}, - ) + ) } metrics[n.Name] = labels From adfe5cd21ac8ca2428ead226a8388ec94460581f Mon Sep 17 00:00:00 2001 From: IuryAlves Date: Fri, 22 Jul 2022 11:45:11 +0200 Subject: [PATCH 3/3] Ignore label values, only get the label names --- pkg/analyse/grafana.go | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/pkg/analyse/grafana.go b/pkg/analyse/grafana.go index 9f39192fa..b6d906605 100644 --- a/pkg/analyse/grafana.go +++ b/pkg/analyse/grafana.go @@ -20,22 +20,17 @@ type MetricsInGrafana struct { } type DashboardMetrics struct { - Slug string `json:"slug"` - UID string `json:"uid,omitempty"` - Title string `json:"title"` - Metrics []string `json:"metrics"` - LabelsByMetric map[string][]Label `json:"labels_by_metric"` - ParseErrors []string `json:"parse_errors"` -} - -type Label struct { - Name string `json:"name"` - Value string `json:"value"` + Slug string `json:"slug"` + UID string `json:"uid,omitempty"` + Title string `json:"title"` + Metrics []string `json:"metrics"` + LabelsByMetric map[string][]string `json:"labels_by_metric"` + ParseErrors []string `json:"parse_errors"` } func ParseMetricsInBoard(mig *MetricsInGrafana, board sdk.Board) { var parseErrors []error - metrics := make(map[string][]Label) + metrics := make(map[string][]string) // Iterate through all the panels and collect metrics for _, panel := range board.Panels { @@ -84,8 +79,8 @@ func ParseMetricsInBoard(mig *MetricsInGrafana, board sdk.Board) { } -func metricsFromTemplating(templating sdk.Templating, metrics map[string][]Label) []error { - parseErrors := []error{} +func metricsFromTemplating(templating sdk.Templating, metrics map[string][]string) []error { + var parseErrors []error for _, templateVar := range templating.List { if templateVar.Type != "query" { continue @@ -121,7 +116,7 @@ func metricsFromTemplating(templating sdk.Templating, metrics map[string][]Label return parseErrors } -func metricsFromPanel(panel sdk.Panel, metrics map[string][]Label) []error { +func metricsFromPanel(panel sdk.Panel, metrics map[string][]string) []error { var parseErrors []error targets := panel.GetTargets() @@ -147,7 +142,7 @@ func metricsFromPanel(panel sdk.Panel, metrics map[string][]Label) []error { return parseErrors } -func parseQuery(query string, metrics map[string][]Label) error { +func parseQuery(query string, metrics map[string][]string) error { query = strings.ReplaceAll(query, `$__interval`, "5m") query = strings.ReplaceAll(query, `$interval`, "5m") query = strings.ReplaceAll(query, `$resolution`, "5s") @@ -161,12 +156,17 @@ func parseQuery(query string, metrics map[string][]Label) error { } parser.Inspect(expr, func(node parser.Node, path []parser.Node) error { + var labels []string + if n, ok := node.(*parser.VectorSelector); ok { - var labels []Label for _, l := range n.LabelMatchers { + // ignore meta label __name__ + if l.Name == "__name__" { + continue + } labels = append( labels, - Label{Name: l.Name, Value: l.Value}, + l.Name, ) } metrics[n.Name] = labels