Skip to content

Commit 869a799

Browse files
authored
Add per job cardinality statistics (#178)
Signed-off-by: Goutham Veeramachaneni <[email protected]>
1 parent bc1bc5c commit 869a799

File tree

2 files changed

+76
-18
lines changed

2 files changed

+76
-18
lines changed

pkg/analyse/prometheus.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@ type MetricsInPrometheus struct {
1010
}
1111

1212
type MetricCount struct {
13-
Metric string `string:"metric"`
14-
Count int `int:"count"`
13+
Metric string `json:"metric"`
14+
Count int `json:"count"`
15+
JobCounts []JobCount `json:"job_counts"`
16+
}
17+
18+
type JobCount struct {
19+
Job string `json:"job"`
20+
Count int `json:"count"`
1521
}

pkg/commands/analyse_prometheus.go

Lines changed: 68 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -63,37 +63,55 @@ func (cmd *PrometheusAnalyseCommand) run(k *kingpin.ParseContext) error {
6363
}
6464
log.Infof("Found %d metric names\n", len(metricNames))
6565

66-
inUseMetrics := map[string]int{}
66+
inUseMetrics := map[string]struct {
67+
totalCount int
68+
jobCount map[string]int
69+
}{}
6770
inUseCardinality := 0
6871

6972
for _, metric := range grafanaMetrics.MetricsUsed {
7073
ctx, cancel := context.WithTimeout(context.Background(), cmd.readTimeout)
7174
defer cancel()
7275

73-
query := "count(" + metric + ")"
76+
query := "count by (job) (" + metric + ")"
7477
result, _, err := v1api.Query(ctx, query, time.Now())
7578
if err != nil {
7679
return errors.Wrap(err, "error querying "+query)
7780
}
7881

7982
vec := result.(model.Vector)
8083
if len(vec) == 0 {
81-
inUseMetrics[metric] += 0
82-
log.Debugln(metric, 0)
84+
counts := inUseMetrics[metric]
85+
counts.totalCount += 0
86+
inUseMetrics[metric] = counts
87+
log.Debugln("in use", metric, 0)
8388

8489
continue
8590
}
8691

87-
inUseMetrics[metric] += int(vec[0].Value)
88-
inUseCardinality += int(vec[0].Value)
92+
for _, sample := range vec {
93+
counts := inUseMetrics[metric]
94+
if counts.jobCount == nil {
95+
counts.jobCount = make(map[string]int)
96+
}
97+
98+
counts.totalCount += int(sample.Value)
99+
counts.jobCount[string(sample.Metric["job"])] += int(sample.Value)
100+
inUseMetrics[metric] = counts
101+
102+
inUseCardinality += int(sample.Value)
103+
}
89104

90105
log.Debugln("in use", metric, vec[0].Value)
91106
}
92107

93108
log.Infof("%d active series are being used in dashboards", inUseCardinality)
94109

95110
// Count the not-in-use active series.
96-
additionalMetrics := map[string]int{}
111+
additionalMetrics := map[string]struct {
112+
totalCount int
113+
jobCount map[string]int
114+
}{}
97115
additionalMetricsCardinality := 0
98116
for _, metricName := range metricNames {
99117
metric := string(metricName)
@@ -104,22 +122,35 @@ func (cmd *PrometheusAnalyseCommand) run(k *kingpin.ParseContext) error {
104122
ctx, cancel := context.WithTimeout(context.Background(), cmd.readTimeout)
105123
defer cancel()
106124

107-
query := "count(" + metric + ")"
125+
query := "count by (job) (" + metric + ")"
108126
result, _, err := v1api.Query(ctx, query, time.Now())
109127
if err != nil {
110128
return errors.Wrap(err, "error querying "+query)
111129
}
112130

113131
vec := result.(model.Vector)
114132
if len(vec) == 0 {
115-
additionalMetrics[metric] += 0
116-
log.Debugln(metric, 0)
133+
counts := additionalMetrics[metric]
134+
counts.totalCount += 0
135+
additionalMetrics[metric] = counts
136+
137+
log.Debugln("additional", metric, 0)
117138

118139
continue
119140
}
120141

121-
additionalMetrics[metric] += int(vec[0].Value)
122-
additionalMetricsCardinality += int(vec[0].Value)
142+
for _, sample := range vec {
143+
counts := additionalMetrics[metric]
144+
if counts.jobCount == nil {
145+
counts.jobCount = make(map[string]int)
146+
}
147+
148+
counts.totalCount += int(sample.Value)
149+
counts.jobCount[string(sample.Metric["job"])] += int(sample.Value)
150+
additionalMetrics[metric] = counts
151+
152+
additionalMetricsCardinality += int(sample.Value)
153+
}
123154

124155
log.Debugln("additional", metric, vec[0].Value)
125156
}
@@ -131,15 +162,36 @@ func (cmd *PrometheusAnalyseCommand) run(k *kingpin.ParseContext) error {
131162
output.InUseActiveSeries = inUseCardinality
132163
output.AdditionalActiveSeries = additionalMetricsCardinality
133164

134-
for metric, count := range inUseMetrics {
135-
output.InUseMetricCounts = append(output.InUseMetricCounts, analyse.MetricCount{Metric: metric, Count: count})
165+
for metric, counts := range inUseMetrics {
166+
jobCounts := make([]analyse.JobCount, 0, len(counts.jobCount))
167+
for job, count := range counts.jobCount {
168+
jobCounts = append(jobCounts, analyse.JobCount{
169+
Job: job,
170+
Count: count,
171+
})
172+
}
173+
sort.Slice(jobCounts, func(i, j int) bool {
174+
return jobCounts[i].Count > jobCounts[j].Count
175+
})
176+
177+
output.InUseMetricCounts = append(output.InUseMetricCounts, analyse.MetricCount{Metric: metric, Count: counts.totalCount, JobCounts: jobCounts})
136178
}
137179
sort.Slice(output.InUseMetricCounts, func(i, j int) bool {
138180
return output.InUseMetricCounts[i].Count > output.InUseMetricCounts[j].Count
139181
})
140182

141-
for metric, count := range additionalMetrics {
142-
output.AdditionalMetricCounts = append(output.AdditionalMetricCounts, analyse.MetricCount{Metric: metric, Count: count})
183+
for metric, counts := range additionalMetrics {
184+
jobCounts := make([]analyse.JobCount, 0, len(counts.jobCount))
185+
for job, count := range counts.jobCount {
186+
jobCounts = append(jobCounts, analyse.JobCount{
187+
Job: job,
188+
Count: count,
189+
})
190+
}
191+
sort.Slice(jobCounts, func(i, j int) bool {
192+
return jobCounts[i].Count > jobCounts[j].Count
193+
})
194+
output.AdditionalMetricCounts = append(output.AdditionalMetricCounts, analyse.MetricCount{Metric: metric, Count: counts.totalCount, JobCounts: jobCounts})
143195
}
144196
sort.Slice(output.AdditionalMetricCounts, func(i, j int) bool {
145197
return output.AdditionalMetricCounts[i].Count > output.AdditionalMetricCounts[j].Count

0 commit comments

Comments
 (0)