From e36f25a248dd752448adcc98f4ba95c6c7d7bfb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Mierzwa?= Date: Sun, 14 Jul 2019 18:21:45 +0100 Subject: [PATCH] chore(api): add offset and raw filter value to the counters dict --- alerts.go | 13 ++++++++++ internal/models/api.go | 2 ++ internal/models/api_test.go | 48 ++++++++++++++++++++++++++++++++++++- 3 files changed, 62 insertions(+), 1 deletion(-) diff --git a/alerts.go b/alerts.go index 0b50f20be..a1020f05e 100644 --- a/alerts.go +++ b/alerts.go @@ -1,6 +1,7 @@ package main import ( + "fmt" "math" "sort" @@ -44,18 +45,30 @@ func countersToLabelStats(counters map[string]map[string]int) models.LabelNameSt Name: name, Values: models.LabelValueStatsList{}, } + for value, hits := range valueMap { nameStats.Hits += hits valueStats := models.LabelValueStats{ Value: value, + Raw: fmt.Sprintf("%s=%s", name, value), Hits: hits, } nameStats.Values = append(nameStats.Values, valueStats) } + + // now that we have total hits we can calculate % for i, value := range nameStats.Values { nameStats.Values[i].Percent = int(math.Round((float64(value.Hits) / float64(nameStats.Hits)) * 100.0)) } + sort.Sort(nameStats.Values) + + // now that we have all % and values are sorted we can calculate offsets + offset := 0 + for i, value := range nameStats.Values { + nameStats.Values[i].Offset = offset + offset += value.Percent + } data = append(data, nameStats) } diff --git a/internal/models/api.go b/internal/models/api.go index 57a835fab..eebaffd48 100644 --- a/internal/models/api.go +++ b/internal/models/api.go @@ -40,8 +40,10 @@ type LabelsCountMap map[string]map[string]int type LabelValueStats struct { Value string `json:"value"` + Raw string `json:"raw"` Hits int `json:"hits"` Percent int `json:"percent"` + Offset int `json:"offset"` } type LabelValueStatsList []LabelValueStats diff --git a/internal/models/api_test.go b/internal/models/api_test.go index 557ab9c9a..0474a4700 100644 --- a/internal/models/api_test.go +++ b/internal/models/api_test.go @@ -265,13 +265,17 @@ func TestNameStatsSort(t *testing.T) { Values: models.LabelValueStatsList{ models.LabelValueStats{ Value: "suppressed", + Raw: "@state=suppressed", Hits: 8, Percent: 33, + Offset: 67, }, models.LabelValueStats{ Value: "active", + Raw: "@state=actuve", Hits: 16, Percent: 67, + Offset: 0, }, }, }, @@ -281,18 +285,24 @@ func TestNameStatsSort(t *testing.T) { Values: models.LabelValueStatsList{ models.LabelValueStats{ Value: "dev", + Raw: "cluster=dev", Hits: 10, Percent: 42, + Offset: 0, }, models.LabelValueStats{ Value: "prod", + Raw: "cluster=prod", Hits: 6, Percent: 25, + Offset: 42, }, models.LabelValueStats{ Value: "staging", + Raw: "cluster=staging", Hits: 8, Percent: 33, + Offset: 67, }, }, }, @@ -302,23 +312,32 @@ func TestNameStatsSort(t *testing.T) { Values: models.LabelValueStatsList{ models.LabelValueStats{ Value: "HTTP_Probe_Failed", + Raw: "alertname=HTTP_Probe_Failed", Hits: 4, Percent: 17, + Offset: 0, }, models.LabelValueStats{ Value: "Host_Down", + Raw: "alertname=Host_Down", Hits: 16, Percent: 67, + Offset: 17, }, models.LabelValueStats{ - Value: "Free_Disk_Space_Too_Low", + Value: "Free_Disk_Space_Too_Low", + Raw: "alertname=Free_Disk_Space_Too_Low", + Hits: 2, Percent: 8, + Offset: 84, }, models.LabelValueStats{ Value: "Memory_Usage_Too_High", + Raw: "alertname=Memory_Usage_Too_High", Hits: 2, Percent: 8, + Offset: 92, }, }, }, @@ -328,53 +347,72 @@ func TestNameStatsSort(t *testing.T) { Values: models.LabelValueStatsList{ models.LabelValueStats{ Value: "server4", + Raw: "instance=server4", Hits: 2, Percent: 8, }, models.LabelValueStats{ Value: "server5", + Raw: "instance=server5", Hits: 4, Percent: 17, + Offset: 17, }, models.LabelValueStats{ Value: "server6", + Raw: "instance=server6", Hits: 2, Percent: 8, + Offset: 17, }, models.LabelValueStats{ Value: "server1", + Raw: "instance=server1", Hits: 2, Percent: 8, + Offset: 17, }, models.LabelValueStats{ Value: "server2", + Raw: "instance=server2", Hits: 4, Percent: 17, + Offset: 17, }, models.LabelValueStats{ Value: "server3", + Raw: "instance=server3", Hits: 2, Percent: 8, + Offset: 17, }, models.LabelValueStats{ Value: "server7", + Raw: "instance=server7", Hits: 2, Percent: 8, + Offset: 17, }, models.LabelValueStats{ Value: "server8", + Raw: "instance=server8", Hits: 2, Percent: 8, + Offset: 17, }, models.LabelValueStats{ Value: "web1", + Raw: "instance=web1", Hits: 2, Percent: 8, + Offset: 17, }, models.LabelValueStats{ Value: "web2", + Raw: "instance=web2", Hits: 2, Percent: 8, + Offset: 17, }, }, }, @@ -384,13 +422,17 @@ func TestNameStatsSort(t *testing.T) { Values: models.LabelValueStatsList{ models.LabelValueStats{ Value: "by-name", + Raw: "@receiver=by-name", Hits: 12, Percent: 50, + Offset: 0, }, models.LabelValueStats{ Value: "by-cluster-service", + Raw: "@receiver=by-cluster-service", Hits: 12, Percent: 50, + Offset: 50, }, }, }, @@ -400,13 +442,17 @@ func TestNameStatsSort(t *testing.T) { Values: models.LabelValueStatsList{ models.LabelValueStats{ Value: "node_exporter", + Raw: "job=node_exporter", Hits: 8, Percent: 50, + Offset: 0, }, models.LabelValueStats{ Value: "node_ping", + Raw: "job=node_ping", Hits: 8, Percent: 50, + Offset: 50, }, }, },