@@ -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