From 8961609f911516b04f81ac75fc4b0e0b8e455c2e Mon Sep 17 00:00:00 2001 From: Tom Wilkie Date: Thu, 4 Jun 2020 10:30:51 +0100 Subject: [PATCH] Ensure that nil registers are treat as a no-op, even when wrapping. Signed-off-by: Tom Wilkie --- prometheus/promauto/auto_test.go | 29 +++++++++++++++++++++++++++++ prometheus/wrap.go | 9 +++++++++ 2 files changed, 38 insertions(+) create mode 100644 prometheus/promauto/auto_test.go diff --git a/prometheus/promauto/auto_test.go b/prometheus/promauto/auto_test.go new file mode 100644 index 0000000..5b9c7fe --- /dev/null +++ b/prometheus/promauto/auto_test.go @@ -0,0 +1,29 @@ +// Copyright 2020 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package promauto + +import ( + "testing" + + "github.com/prometheus/client_golang/prometheus" +) + +func TestWrapNil(t *testing.T) { + // A nil registerer should be treated as a no-op by promauto, even when wrapped. + registerer := prometheus.WrapRegistererWith(prometheus.Labels{"foo": "bar"}, nil) + c := With(registerer).NewCounter(prometheus.CounterOpts{ + Name: "test", + }) + c.Inc() +} diff --git a/prometheus/wrap.go b/prometheus/wrap.go index da6896a..ef6fdec 100644 --- a/prometheus/wrap.go +++ b/prometheus/wrap.go @@ -81,6 +81,9 @@ type wrappingRegisterer struct { } func (r *wrappingRegisterer) Register(c Collector) error { + if r.wrappedRegisterer == nil { + return nil + } return r.wrappedRegisterer.Register(&wrappingCollector{ wrappedCollector: c, prefix: r.prefix, @@ -89,6 +92,9 @@ func (r *wrappingRegisterer) Register(c Collector) error { } func (r *wrappingRegisterer) MustRegister(cs ...Collector) { + if r.wrappedRegisterer == nil { + return + } for _, c := range cs { if err := r.Register(c); err != nil { panic(err) @@ -97,6 +103,9 @@ func (r *wrappingRegisterer) MustRegister(cs ...Collector) { } func (r *wrappingRegisterer) Unregister(c Collector) bool { + if r.wrappedRegisterer == nil { + return false + } return r.wrappedRegisterer.Unregister(&wrappingCollector{ wrappedCollector: c, prefix: r.prefix,