@@ -34,6 +34,7 @@ type JSONMetric struct {
3434 KeyJSONPath string
3535 ValueJSONPath string
3636 LabelsJSONPaths []string
37+ Mincount int
3738}
3839
3940func (mc JSONMetricCollector ) Describe (ch chan <- * prometheus.Desc ) {
@@ -44,7 +45,7 @@ func (mc JSONMetricCollector) Describe(ch chan<- *prometheus.Desc) {
4445
4546func (mc JSONMetricCollector ) Collect (ch chan <- prometheus.Metric ) {
4647 for _ , m := range mc .JSONMetrics {
47- if m .ValueJSONPath == "" { // ScrapeType is 'value'
48+ if m .ValueJSONPath == "" && m . Mincount == 0 { // ScrapeType is 'value'
4849 value , err := extractValue (mc .Logger , mc .Data , m .KeyJSONPath , false )
4950 if err != nil {
5051 level .Error (mc .Logger ).Log ("msg" , "Failed to extract value for metric" , "path" , m .KeyJSONPath , "err" , err , "metric" , m .Desc )
@@ -63,6 +64,42 @@ func (mc JSONMetricCollector) Collect(ch chan<- prometheus.Metric) {
6364 level .Error (mc .Logger ).Log ("msg" , "Failed to convert extracted value to float64" , "path" , m .KeyJSONPath , "value" , value , "err" , err , "metric" , m .Desc )
6465 continue
6566 }
67+ } else if m .Mincount > 0 { // ScrapeType is 'countbylabel'
68+ values , err := extractValue (mc .Logger , mc .Data , m .KeyJSONPath , true )
69+ if err != nil {
70+ level .Error (mc .Logger ).Log ("msg" , "Failed to extract json objects for metric" , "err" , err , "metric" , m .Desc )
71+ continue
72+ }
73+
74+ var jsonData []interface {}
75+ counts := make (map [interface {}]int )
76+
77+ if err := json .Unmarshal ([]byte (values ), & jsonData ); err == nil {
78+ for _ , data := range jsonData {
79+ counts [data ]++
80+ }
81+ for data , count := range counts {
82+ if count >= m .Mincount {
83+ jdata , err := json .Marshal (data )
84+ if err != nil {
85+ level .Error (mc .Logger ).Log ("msg" , "Failed to marshal data to json" , "path" , m .ValueJSONPath , "err" , err , "metric" , m .Desc , "data" , data )
86+ continue
87+ }
88+ if err != nil {
89+ level .Error (mc .Logger ).Log ("msg" , "Failed to extract value for metric" , "path" , m .ValueJSONPath , "err" , err , "metric" , m .Desc )
90+ continue
91+ }
92+
93+ ch <- prometheus .MustNewConstMetric (
94+ m .Desc ,
95+ prometheus .UntypedValue ,
96+ float64 (count ),
97+ extractLabels (mc .Logger , jdata , m .LabelsJSONPaths )... ,
98+ )
99+ }
100+ }
101+ }
102+
66103 } else { // ScrapeType is 'object'
67104 values , err := extractValue (mc .Logger , mc .Data , m .KeyJSONPath , true )
68105 if err != nil {
0 commit comments