From 902733d08016893ebd8487bd6a4845627b0f0b7f Mon Sep 17 00:00:00 2001 From: Peter Jausovec Date: Wed, 31 Oct 2018 10:59:13 -0700 Subject: [PATCH 1/6] Add more info to the inconsistent cardinality errors Signed-off-by: Peter Jausovec --- prometheus/counter.go | 3 ++- prometheus/gauge.go | 3 ++- prometheus/histogram.go | 3 ++- prometheus/labels.go | 2 +- prometheus/summary.go | 3 ++- 5 files changed, 9 insertions(+), 5 deletions(-) diff --git a/prometheus/counter.go b/prometheus/counter.go index 765e455..2f87690 100644 --- a/prometheus/counter.go +++ b/prometheus/counter.go @@ -136,7 +136,8 @@ func NewCounterVec(opts CounterOpts, labelNames []string) *CounterVec { return &CounterVec{ metricVec: newMetricVec(desc, func(lvs ...string) Metric { if len(lvs) != len(desc.variableLabels) { - panic(errInconsistentCardinality) + err := fmt.Errorf("%s: labels and values for '%s' don't match: labels %v, values %v", errInconsistentCardinality, desc.fqName, desc.variableLabels, lvs) + panic(err) } result := &counter{desc: desc, labelPairs: makeLabelPairs(desc, lvs)} result.init(result) // Init self-collection. diff --git a/prometheus/gauge.go b/prometheus/gauge.go index 17c72d7..f335458 100644 --- a/prometheus/gauge.go +++ b/prometheus/gauge.go @@ -147,7 +147,8 @@ func NewGaugeVec(opts GaugeOpts, labelNames []string) *GaugeVec { return &GaugeVec{ metricVec: newMetricVec(desc, func(lvs ...string) Metric { if len(lvs) != len(desc.variableLabels) { - panic(errInconsistentCardinality) + err := fmt.Errorf("%s: labels and values for '%s' don't match: labels %v, values %v", errInconsistentCardinality, desc.fqName, desc.variableLabels, labelValues) + panic(err) } result := &gauge{desc: desc, labelPairs: makeLabelPairs(desc, lvs)} result.init(result) // Init self-collection. diff --git a/prometheus/histogram.go b/prometheus/histogram.go index 4d7fa97..58b4f3b 100644 --- a/prometheus/histogram.go +++ b/prometheus/histogram.go @@ -165,7 +165,8 @@ func NewHistogram(opts HistogramOpts) Histogram { func newHistogram(desc *Desc, opts HistogramOpts, labelValues ...string) Histogram { if len(desc.variableLabels) != len(labelValues) { - panic(errInconsistentCardinality) + err := fmt.Errorf("%s: labels and values for '%s' don't match: labels %v, values %v", errInconsistentCardinality, desc.fqName, desc.variableLabels, labelValues) + panic(err) } for _, n := range desc.variableLabels { diff --git a/prometheus/labels.go b/prometheus/labels.go index e68f132..8173f56 100644 --- a/prometheus/labels.go +++ b/prometheus/labels.go @@ -39,7 +39,7 @@ var errInconsistentCardinality = errors.New("inconsistent label cardinality") func validateValuesInLabels(labels Labels, expectedNumberOfValues int) error { if len(labels) != expectedNumberOfValues { - return errInconsistentCardinality + return fmt.Errorf("%s: number of labels and values don't match: expected %d, actual %d, labels %v", errInconsistentCardinality, expectedNumberOfValues, len(labels), labels) } for name, val := range labels { diff --git a/prometheus/summary.go b/prometheus/summary.go index f7e92d8..402d73d 100644 --- a/prometheus/summary.go +++ b/prometheus/summary.go @@ -181,7 +181,8 @@ func NewSummary(opts SummaryOpts) Summary { func newSummary(desc *Desc, opts SummaryOpts, labelValues ...string) Summary { if len(desc.variableLabels) != len(labelValues) { - panic(errInconsistentCardinality) + err := fmt.Errorf("%s: labels and values for '%s' don't match: labels %v, values %v", errInconsistentCardinality, desc.fqName, desc.variableLabels, labelValues) + panic(err) } for _, n := range desc.variableLabels { From 4fe949f2fdc6741a4527e7c44c9ec5af822c1a1b Mon Sep 17 00:00:00 2001 From: Peter Jausovec Date: Wed, 31 Oct 2018 11:08:30 -0700 Subject: [PATCH 2/6] Add missing fmt import Signed-off-by: Peter Jausovec --- prometheus/counter.go | 1 + prometheus/gauge.go | 1 + 2 files changed, 2 insertions(+) diff --git a/prometheus/counter.go b/prometheus/counter.go index 2f87690..03965f9 100644 --- a/prometheus/counter.go +++ b/prometheus/counter.go @@ -15,6 +15,7 @@ package prometheus import ( "errors" + "fmt" "math" "sync/atomic" diff --git a/prometheus/gauge.go b/prometheus/gauge.go index f335458..6b0ac42 100644 --- a/prometheus/gauge.go +++ b/prometheus/gauge.go @@ -14,6 +14,7 @@ package prometheus import ( + "fmt" "math" "sync/atomic" "time" From ceb819208d49dfac81eb35186fb44010eb85d4c5 Mon Sep 17 00:00:00 2001 From: Peter Jausovec Date: Wed, 31 Oct 2018 11:16:04 -0700 Subject: [PATCH 3/6] copy/pasta error Signed-off-by: Peter Jausovec --- prometheus/gauge.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prometheus/gauge.go b/prometheus/gauge.go index 6b0ac42..f80d72b 100644 --- a/prometheus/gauge.go +++ b/prometheus/gauge.go @@ -148,7 +148,7 @@ func NewGaugeVec(opts GaugeOpts, labelNames []string) *GaugeVec { return &GaugeVec{ metricVec: newMetricVec(desc, func(lvs ...string) Metric { if len(lvs) != len(desc.variableLabels) { - err := fmt.Errorf("%s: labels and values for '%s' don't match: labels %v, values %v", errInconsistentCardinality, desc.fqName, desc.variableLabels, labelValues) + err := fmt.Errorf("%s: labels and values for '%s' don't match: labels %v, values %v", errInconsistentCardinality, desc.fqName, desc.variableLabels, lvs) panic(err) } result := &gauge{desc: desc, labelPairs: makeLabelPairs(desc, lvs)} From ea348d7c20ce64c3bccdac0311e8621285d1278a Mon Sep 17 00:00:00 2001 From: Peter Jausovec Date: Fri, 2 Nov 2018 09:01:14 -0700 Subject: [PATCH 4/6] Update code based on the PR feedback Signed-off-by: Peter Jausovec --- prometheus/counter.go | 3 +-- prometheus/gauge.go | 4 +--- prometheus/histogram.go | 3 +-- prometheus/labels.go | 21 +++++++++++++++++++-- prometheus/summary.go | 3 +-- 5 files changed, 23 insertions(+), 11 deletions(-) diff --git a/prometheus/counter.go b/prometheus/counter.go index 03965f9..756bb49 100644 --- a/prometheus/counter.go +++ b/prometheus/counter.go @@ -137,8 +137,7 @@ func NewCounterVec(opts CounterOpts, labelNames []string) *CounterVec { return &CounterVec{ metricVec: newMetricVec(desc, func(lvs ...string) Metric { if len(lvs) != len(desc.variableLabels) { - err := fmt.Errorf("%s: labels and values for '%s' don't match: labels %v, values %v", errInconsistentCardinality, desc.fqName, desc.variableLabels, lvs) - panic(err) + panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels, lvs)) } result := &counter{desc: desc, labelPairs: makeLabelPairs(desc, lvs)} result.init(result) // Init self-collection. diff --git a/prometheus/gauge.go b/prometheus/gauge.go index f80d72b..71d406b 100644 --- a/prometheus/gauge.go +++ b/prometheus/gauge.go @@ -14,7 +14,6 @@ package prometheus import ( - "fmt" "math" "sync/atomic" "time" @@ -148,8 +147,7 @@ func NewGaugeVec(opts GaugeOpts, labelNames []string) *GaugeVec { return &GaugeVec{ metricVec: newMetricVec(desc, func(lvs ...string) Metric { if len(lvs) != len(desc.variableLabels) { - err := fmt.Errorf("%s: labels and values for '%s' don't match: labels %v, values %v", errInconsistentCardinality, desc.fqName, desc.variableLabels, lvs) - panic(err) + panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels, lvs)) } result := &gauge{desc: desc, labelPairs: makeLabelPairs(desc, lvs)} result.init(result) // Init self-collection. diff --git a/prometheus/histogram.go b/prometheus/histogram.go index 58b4f3b..f88da70 100644 --- a/prometheus/histogram.go +++ b/prometheus/histogram.go @@ -165,8 +165,7 @@ func NewHistogram(opts HistogramOpts) Histogram { func newHistogram(desc *Desc, opts HistogramOpts, labelValues ...string) Histogram { if len(desc.variableLabels) != len(labelValues) { - err := fmt.Errorf("%s: labels and values for '%s' don't match: labels %v, values %v", errInconsistentCardinality, desc.fqName, desc.variableLabels, labelValues) - panic(err) + panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels, labelValues)) } for _, n := range desc.variableLabels { diff --git a/prometheus/labels.go b/prometheus/labels.go index 8173f56..2744443 100644 --- a/prometheus/labels.go +++ b/prometheus/labels.go @@ -37,9 +37,22 @@ const reservedLabelPrefix = "__" var errInconsistentCardinality = errors.New("inconsistent label cardinality") +func makeInconsistentCardinalityError(fqName string, labels, labelValues []string) error { + return fmt.Errorf( + "%s: %q has %d variable labels named %q but %d values %q were provided", + errInconsistentCardinality, fqName, + len(labels), labels, + len(labelValues), labelValues, + ) +} + func validateValuesInLabels(labels Labels, expectedNumberOfValues int) error { if len(labels) != expectedNumberOfValues { - return fmt.Errorf("%s: number of labels and values don't match: expected %d, actual %d, labels %v", errInconsistentCardinality, expectedNumberOfValues, len(labels), labels) + return fmt.Errorf( + "%s: expected %d label values but got %d in %#v", + errInconsistentCardinality, expectedNumberOfValues, + len(labels), labels, + ) } for name, val := range labels { @@ -53,7 +66,11 @@ func validateValuesInLabels(labels Labels, expectedNumberOfValues int) error { func validateLabelValues(vals []string, expectedNumberOfValues int) error { if len(vals) != expectedNumberOfValues { - return errInconsistentCardinality + return fmt.Errorf( + "%s: expected %d label values but got %d in %#v", + errInconsistentCardinality, expectedNumberOfValues, + len(vals), vals, + ) } for _, val := range vals { diff --git a/prometheus/summary.go b/prometheus/summary.go index 402d73d..2980614 100644 --- a/prometheus/summary.go +++ b/prometheus/summary.go @@ -181,8 +181,7 @@ func NewSummary(opts SummaryOpts) Summary { func newSummary(desc *Desc, opts SummaryOpts, labelValues ...string) Summary { if len(desc.variableLabels) != len(labelValues) { - err := fmt.Errorf("%s: labels and values for '%s' don't match: labels %v, values %v", errInconsistentCardinality, desc.fqName, desc.variableLabels, labelValues) - panic(err) + panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels, labelValues)) } for _, n := range desc.variableLabels { From b686a9e02e4eea8f7b7d42b04a43c98491d4173b Mon Sep 17 00:00:00 2001 From: Peter Jausovec Date: Fri, 2 Nov 2018 09:21:12 -0700 Subject: [PATCH 5/6] Remove fmt from import Signed-off-by: Peter Jausovec --- prometheus/counter.go | 1 - 1 file changed, 1 deletion(-) diff --git a/prometheus/counter.go b/prometheus/counter.go index 756bb49..d463e36 100644 --- a/prometheus/counter.go +++ b/prometheus/counter.go @@ -15,7 +15,6 @@ package prometheus import ( "errors" - "fmt" "math" "sync/atomic" From f1bec54758e6a1c253d275d1ae000903216a400d Mon Sep 17 00:00:00 2001 From: Peter Jausovec Date: Fri, 2 Nov 2018 09:46:03 -0700 Subject: [PATCH 6/6] Update the ExampleRegister test Signed-off-by: Peter Jausovec --- prometheus/examples_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prometheus/examples_test.go b/prometheus/examples_test.go index 538a239..a382479 100644 --- a/prometheus/examples_test.go +++ b/prometheus/examples_test.go @@ -282,7 +282,7 @@ func ExampleRegister() { // taskCounter unregistered. // taskCounterVec not registered: a previously registered descriptor with the same fully-qualified name as Desc{fqName: "worker_pool_completed_tasks_total", help: "Total number of tasks completed.", constLabels: {}, variableLabels: [worker_id]} has different label names or a different help string // taskCounterVec registered. - // Worker initialization failed: inconsistent label cardinality + // Worker initialization failed: inconsistent label cardinality: expected 1 label values but got 2 in []string{"42", "spurious arg"} // notMyCounter is nil. // taskCounterForWorker42 registered. // taskCounterForWorker2001 registered.