From ca447520edd08b08460f4a1ada9b98d0f96d8c4e Mon Sep 17 00:00:00 2001 From: shk1999 Date: Tue, 23 Sep 2025 00:08:26 +0330 Subject: [PATCH 1/2] fix: fixes duplication handling issue Signed-off-by: shk1999 --- exporter/collector.go | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/exporter/collector.go b/exporter/collector.go index 0a913897..c86c0b65 100644 --- a/exporter/collector.go +++ b/exporter/collector.go @@ -18,6 +18,8 @@ import ( "encoding/json" "log/slog" "time" + "fmt" + "strings" "github.com/prometheus-community/json_exporter/config" "github.com/prometheus/client_golang/prometheus" @@ -48,6 +50,7 @@ func (mc JSONMetricCollector) Describe(ch chan<- *prometheus.Desc) { func (mc JSONMetricCollector) Collect(ch chan<- prometheus.Metric) { for _, m := range mc.JSONMetrics { + seen := make(map[string]struct{}) switch m.Type { case config.ValueScrape: value, err := extractValue(mc.Logger, mc.Data, m.KeyJSONPath, false) @@ -91,11 +94,18 @@ func (mc JSONMetricCollector) Collect(ch chan<- prometheus.Metric) { } if floatValue, err := SanitizeValue(value); err == nil { + labels := extractLabels(mc.Logger, jdata, m.LabelsJSONPaths) + labelKey := strings.Join(labels, "\x00") + if _, exists := seen[labelKey]; exists { + mc.Logger.Warn("Skipping duplicate metric with identical labels", "metric", m.Desc, "labels", fmt.Sprintf("%v", labels)) + continue + } + seen[labelKey] = struct{}{} metric := prometheus.MustNewConstMetric( m.Desc, m.ValueType, floatValue, - extractLabels(mc.Logger, jdata, m.LabelsJSONPaths)..., + labels..., ) ch <- timestampMetric(mc.Logger, m, jdata, metric) } else { @@ -176,4 +186,4 @@ func timestampMetric(logger *slog.Logger, m JSONMetric, data []byte, pm promethe } timestamp := time.UnixMilli(epochTime) return prometheus.NewMetricWithTimestamp(timestamp, pm) -} +} \ No newline at end of file From 72dba70fcd8f44a9c821d611aaddd204e13d6668 Mon Sep 17 00:00:00 2001 From: shk1999 Date: Wed, 1 Oct 2025 10:12:46 +0330 Subject: [PATCH 2/2] fix: fixes formatting code --- exporter/collector.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/exporter/collector.go b/exporter/collector.go index c86c0b65..a675786c 100644 --- a/exporter/collector.go +++ b/exporter/collector.go @@ -16,10 +16,10 @@ package exporter import ( "bytes" "encoding/json" - "log/slog" - "time" "fmt" + "log/slog" "strings" + "time" "github.com/prometheus-community/json_exporter/config" "github.com/prometheus/client_golang/prometheus" @@ -186,4 +186,4 @@ func timestampMetric(logger *slog.Logger, m JSONMetric, data []byte, pm promethe } timestamp := time.UnixMilli(epochTime) return prometheus.NewMetricWithTimestamp(timestamp, pm) -} \ No newline at end of file +}