Merge pull request #764 from prometheus/wrap-nil

Ensure that nil registers are treat as a no-op, even when wrapping.
This commit is contained in:
Björn Rabenstein 2020-06-04 13:01:48 +02:00 committed by GitHub
commit 03575cad4e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 46 additions and 1 deletions

View File

@ -0,0 +1,25 @@
// 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 TestNil(t *testing.T) {
// A nil registerer should be treated as a no-op by promauto.
With(nil).NewCounter(prometheus.CounterOpts{Name: "test"}).Inc()
}

View File

@ -28,7 +28,8 @@ import (
// registered with the wrapped Registerer in a modified way. The modified // registered with the wrapped Registerer in a modified way. The modified
// Collector adds the provided Labels to all Metrics it collects (as // Collector adds the provided Labels to all Metrics it collects (as
// ConstLabels). The Metrics collected by the unmodified Collector must not // ConstLabels). The Metrics collected by the unmodified Collector must not
// duplicate any of those labels. // duplicate any of those labels. Wrapping a nil value is valid, resulting
// in a no-op Registerer.
// //
// WrapRegistererWith provides a way to add fixed labels to a subset of // WrapRegistererWith provides a way to add fixed labels to a subset of
// Collectors. It should not be used to add fixed labels to all metrics exposed. // Collectors. It should not be used to add fixed labels to all metrics exposed.
@ -51,6 +52,7 @@ func WrapRegistererWith(labels Labels, reg Registerer) Registerer {
// Registerer. Collectors registered with the returned Registerer will be // Registerer. Collectors registered with the returned Registerer will be
// registered with the wrapped Registerer in a modified way. The modified // registered with the wrapped Registerer in a modified way. The modified
// Collector adds the provided prefix to the name of all Metrics it collects. // Collector adds the provided prefix to the name of all Metrics it collects.
// Wrapping a nil value is valid, resulting in a no-op Registerer.
// //
// WrapRegistererWithPrefix is useful to have one place to prefix all metrics of // WrapRegistererWithPrefix is useful to have one place to prefix all metrics of
// a sub-system. To make this work, register metrics of the sub-system with the // a sub-system. To make this work, register metrics of the sub-system with the
@ -81,6 +83,9 @@ type wrappingRegisterer struct {
} }
func (r *wrappingRegisterer) Register(c Collector) error { func (r *wrappingRegisterer) Register(c Collector) error {
if r.wrappedRegisterer == nil {
return nil
}
return r.wrappedRegisterer.Register(&wrappingCollector{ return r.wrappedRegisterer.Register(&wrappingCollector{
wrappedCollector: c, wrappedCollector: c,
prefix: r.prefix, prefix: r.prefix,
@ -89,6 +94,9 @@ func (r *wrappingRegisterer) Register(c Collector) error {
} }
func (r *wrappingRegisterer) MustRegister(cs ...Collector) { func (r *wrappingRegisterer) MustRegister(cs ...Collector) {
if r.wrappedRegisterer == nil {
return
}
for _, c := range cs { for _, c := range cs {
if err := r.Register(c); err != nil { if err := r.Register(c); err != nil {
panic(err) panic(err)
@ -97,6 +105,9 @@ func (r *wrappingRegisterer) MustRegister(cs ...Collector) {
} }
func (r *wrappingRegisterer) Unregister(c Collector) bool { func (r *wrappingRegisterer) Unregister(c Collector) bool {
if r.wrappedRegisterer == nil {
return false
}
return r.wrappedRegisterer.Unregister(&wrappingCollector{ return r.wrappedRegisterer.Unregister(&wrappingCollector{
wrappedCollector: c, wrappedCollector: c,
prefix: r.prefix, prefix: r.prefix,

View File

@ -321,3 +321,12 @@ func TestWrap(t *testing.T) {
} }
} }
func TestNil(t *testing.T) {
// A wrapped nil registerer should be treated as a no-op, and not panic.
c := NewCounter(CounterOpts{Name: "test"})
err := WrapRegistererWith(Labels{"foo": "bar"}, nil).Register(c)
if err != nil {
t.Fatal("registering failed:", err)
}
}