@@ -39,6 +39,7 @@ type JSONMetric struct {
3939 LabelsJSONPaths []string
4040 ValueType prometheus.ValueType
4141 EpochTimestampJSONPath string
42+ MinimumCount int
4243}
4344
4445func (mc JSONMetricCollector ) Describe (ch chan <- * prometheus.Desc ) {
@@ -70,6 +71,42 @@ func (mc JSONMetricCollector) Collect(ch chan<- prometheus.Metric) {
7071 continue
7172 }
7273
74+ case config .CountScrape :
75+ values , err := extractValue (mc .Logger , mc .Data , m .KeyJSONPath , true )
76+ if err != nil {
77+ level .Error (mc .Logger ).Log ("msg" , "Failed to extract json objects for metric" , "err" , err , "metric" , m .Desc )
78+ continue
79+ }
80+
81+ var jsonData []interface {}
82+ counts := make (map [interface {}]int )
83+
84+ if err := json .Unmarshal ([]byte (values ), & jsonData ); err == nil {
85+ for _ , data := range jsonData {
86+ counts [data ]++
87+ }
88+ for data , count := range counts {
89+ if count >= m .MinimumCount {
90+ jdata , err := json .Marshal (data )
91+ if err != nil {
92+ level .Error (mc .Logger ).Log ("msg" , "Failed to marshal data to json" , "path" , m .ValueJSONPath , "err" , err , "metric" , m .Desc , "data" , data )
93+ continue
94+ }
95+ if err != nil {
96+ level .Error (mc .Logger ).Log ("msg" , "Failed to extract value for metric" , "path" , m .ValueJSONPath , "err" , err , "metric" , m .Desc )
97+ continue
98+ }
99+
100+ ch <- prometheus .MustNewConstMetric (
101+ m .Desc ,
102+ prometheus .UntypedValue ,
103+ float64 (count ),
104+ extractLabels (mc .Logger , jdata , m .LabelsJSONPaths )... ,
105+ )
106+ }
107+ }
108+ }
109+
73110 case config .ObjectScrape :
74111 values , err := extractValue (mc .Logger , mc .Data , m .KeyJSONPath , true )
75112 if err != nil {
0 commit comments