| 
									
										
										
										
											2018-02-23 10:56:08 +01:00
										 |  |  | package metrics | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"testing" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func BenchmarkRegistry(b *testing.B) { | 
					
						
							|  |  |  | 	r := NewRegistry() | 
					
						
							|  |  |  | 	r.Register("foo", NewCounter()) | 
					
						
							|  |  |  | 	b.ResetTimer() | 
					
						
							|  |  |  | 	for i := 0; i < b.N; i++ { | 
					
						
							|  |  |  | 		r.Each(func(string, interface{}) {}) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestRegistry(t *testing.T) { | 
					
						
							|  |  |  | 	r := NewRegistry() | 
					
						
							|  |  |  | 	r.Register("foo", NewCounter()) | 
					
						
							|  |  |  | 	i := 0 | 
					
						
							|  |  |  | 	r.Each(func(name string, iface interface{}) { | 
					
						
							|  |  |  | 		i++ | 
					
						
							| 
									
										
										
										
											2019-11-22 16:04:35 +01:00
										 |  |  | 		if name != "foo" { | 
					
						
							| 
									
										
										
										
											2018-02-23 10:56:08 +01:00
										 |  |  | 			t.Fatal(name) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if _, ok := iface.(Counter); !ok { | 
					
						
							|  |  |  | 			t.Fatal(iface) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}) | 
					
						
							| 
									
										
										
										
											2019-11-22 16:04:35 +01:00
										 |  |  | 	if i != 1 { | 
					
						
							| 
									
										
										
										
											2018-02-23 10:56:08 +01:00
										 |  |  | 		t.Fatal(i) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	r.Unregister("foo") | 
					
						
							|  |  |  | 	i = 0 | 
					
						
							|  |  |  | 	r.Each(func(string, interface{}) { i++ }) | 
					
						
							| 
									
										
										
										
											2019-11-22 16:04:35 +01:00
										 |  |  | 	if i != 0 { | 
					
						
							| 
									
										
										
										
											2018-02-23 10:56:08 +01:00
										 |  |  | 		t.Fatal(i) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestRegistryDuplicate(t *testing.T) { | 
					
						
							|  |  |  | 	r := NewRegistry() | 
					
						
							|  |  |  | 	if err := r.Register("foo", NewCounter()); nil != err { | 
					
						
							|  |  |  | 		t.Fatal(err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if err := r.Register("foo", NewGauge()); nil == err { | 
					
						
							|  |  |  | 		t.Fatal(err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	i := 0 | 
					
						
							|  |  |  | 	r.Each(func(name string, iface interface{}) { | 
					
						
							|  |  |  | 		i++ | 
					
						
							|  |  |  | 		if _, ok := iface.(Counter); !ok { | 
					
						
							|  |  |  | 			t.Fatal(iface) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}) | 
					
						
							| 
									
										
										
										
											2019-11-22 16:04:35 +01:00
										 |  |  | 	if i != 1 { | 
					
						
							| 
									
										
										
										
											2018-02-23 10:56:08 +01:00
										 |  |  | 		t.Fatal(i) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestRegistryGet(t *testing.T) { | 
					
						
							|  |  |  | 	r := NewRegistry() | 
					
						
							|  |  |  | 	r.Register("foo", NewCounter()) | 
					
						
							| 
									
										
										
										
											2019-11-22 16:04:35 +01:00
										 |  |  | 	if count := r.Get("foo").(Counter).Count(); count != 0 { | 
					
						
							| 
									
										
										
										
											2018-02-23 10:56:08 +01:00
										 |  |  | 		t.Fatal(count) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	r.Get("foo").(Counter).Inc(1) | 
					
						
							| 
									
										
										
										
											2019-11-22 16:04:35 +01:00
										 |  |  | 	if count := r.Get("foo").(Counter).Count(); count != 1 { | 
					
						
							| 
									
										
										
										
											2018-02-23 10:56:08 +01:00
										 |  |  | 		t.Fatal(count) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestRegistryGetOrRegister(t *testing.T) { | 
					
						
							|  |  |  | 	r := NewRegistry() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// First metric wins with GetOrRegister | 
					
						
							|  |  |  | 	_ = r.GetOrRegister("foo", NewCounter()) | 
					
						
							|  |  |  | 	m := r.GetOrRegister("foo", NewGauge()) | 
					
						
							|  |  |  | 	if _, ok := m.(Counter); !ok { | 
					
						
							|  |  |  | 		t.Fatal(m) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	i := 0 | 
					
						
							|  |  |  | 	r.Each(func(name string, iface interface{}) { | 
					
						
							|  |  |  | 		i++ | 
					
						
							|  |  |  | 		if name != "foo" { | 
					
						
							|  |  |  | 			t.Fatal(name) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if _, ok := iface.(Counter); !ok { | 
					
						
							|  |  |  | 			t.Fatal(iface) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 	if i != 1 { | 
					
						
							|  |  |  | 		t.Fatal(i) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestRegistryGetOrRegisterWithLazyInstantiation(t *testing.T) { | 
					
						
							|  |  |  | 	r := NewRegistry() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// First metric wins with GetOrRegister | 
					
						
							|  |  |  | 	_ = r.GetOrRegister("foo", NewCounter) | 
					
						
							|  |  |  | 	m := r.GetOrRegister("foo", NewGauge) | 
					
						
							|  |  |  | 	if _, ok := m.(Counter); !ok { | 
					
						
							|  |  |  | 		t.Fatal(m) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	i := 0 | 
					
						
							|  |  |  | 	r.Each(func(name string, iface interface{}) { | 
					
						
							|  |  |  | 		i++ | 
					
						
							|  |  |  | 		if name != "foo" { | 
					
						
							|  |  |  | 			t.Fatal(name) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if _, ok := iface.(Counter); !ok { | 
					
						
							|  |  |  | 			t.Fatal(iface) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 	if i != 1 { | 
					
						
							|  |  |  | 		t.Fatal(i) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestRegistryUnregister(t *testing.T) { | 
					
						
							|  |  |  | 	l := len(arbiter.meters) | 
					
						
							|  |  |  | 	r := NewRegistry() | 
					
						
							|  |  |  | 	r.Register("foo", NewCounter()) | 
					
						
							|  |  |  | 	r.Register("bar", NewMeter()) | 
					
						
							|  |  |  | 	r.Register("baz", NewTimer()) | 
					
						
							|  |  |  | 	if len(arbiter.meters) != l+2 { | 
					
						
							|  |  |  | 		t.Errorf("arbiter.meters: %d != %d\n", l+2, len(arbiter.meters)) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	r.Unregister("foo") | 
					
						
							|  |  |  | 	r.Unregister("bar") | 
					
						
							|  |  |  | 	r.Unregister("baz") | 
					
						
							|  |  |  | 	if len(arbiter.meters) != l { | 
					
						
							|  |  |  | 		t.Errorf("arbiter.meters: %d != %d\n", l+2, len(arbiter.meters)) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestPrefixedChildRegistryGetOrRegister(t *testing.T) { | 
					
						
							|  |  |  | 	r := NewRegistry() | 
					
						
							|  |  |  | 	pr := NewPrefixedChildRegistry(r, "prefix.") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	_ = pr.GetOrRegister("foo", NewCounter()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	i := 0 | 
					
						
							|  |  |  | 	r.Each(func(name string, m interface{}) { | 
					
						
							|  |  |  | 		i++ | 
					
						
							|  |  |  | 		if name != "prefix.foo" { | 
					
						
							|  |  |  | 			t.Fatal(name) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 	if i != 1 { | 
					
						
							|  |  |  | 		t.Fatal(i) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestPrefixedRegistryGetOrRegister(t *testing.T) { | 
					
						
							|  |  |  | 	r := NewPrefixedRegistry("prefix.") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	_ = r.GetOrRegister("foo", NewCounter()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	i := 0 | 
					
						
							|  |  |  | 	r.Each(func(name string, m interface{}) { | 
					
						
							|  |  |  | 		i++ | 
					
						
							|  |  |  | 		if name != "prefix.foo" { | 
					
						
							|  |  |  | 			t.Fatal(name) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 	if i != 1 { | 
					
						
							|  |  |  | 		t.Fatal(i) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestPrefixedRegistryRegister(t *testing.T) { | 
					
						
							|  |  |  | 	r := NewPrefixedRegistry("prefix.") | 
					
						
							|  |  |  | 	err := r.Register("foo", NewCounter()) | 
					
						
							|  |  |  | 	c := NewCounter() | 
					
						
							|  |  |  | 	Register("bar", c) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatal(err.Error()) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	i := 0 | 
					
						
							|  |  |  | 	r.Each(func(name string, m interface{}) { | 
					
						
							|  |  |  | 		i++ | 
					
						
							|  |  |  | 		if name != "prefix.foo" { | 
					
						
							|  |  |  | 			t.Fatal(name) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 	if i != 1 { | 
					
						
							|  |  |  | 		t.Fatal(i) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestPrefixedRegistryUnregister(t *testing.T) { | 
					
						
							|  |  |  | 	r := NewPrefixedRegistry("prefix.") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	_ = r.Register("foo", NewCounter()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	i := 0 | 
					
						
							|  |  |  | 	r.Each(func(name string, m interface{}) { | 
					
						
							|  |  |  | 		i++ | 
					
						
							|  |  |  | 		if name != "prefix.foo" { | 
					
						
							|  |  |  | 			t.Fatal(name) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 	if i != 1 { | 
					
						
							|  |  |  | 		t.Fatal(i) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	r.Unregister("foo") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	i = 0 | 
					
						
							|  |  |  | 	r.Each(func(name string, m interface{}) { | 
					
						
							|  |  |  | 		i++ | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if i != 0 { | 
					
						
							|  |  |  | 		t.Fatal(i) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestPrefixedRegistryGet(t *testing.T) { | 
					
						
							|  |  |  | 	pr := NewPrefixedRegistry("prefix.") | 
					
						
							|  |  |  | 	name := "foo" | 
					
						
							|  |  |  | 	pr.Register(name, NewCounter()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	fooCounter := pr.Get(name) | 
					
						
							|  |  |  | 	if fooCounter == nil { | 
					
						
							|  |  |  | 		t.Fatal(name) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestPrefixedChildRegistryGet(t *testing.T) { | 
					
						
							|  |  |  | 	r := NewRegistry() | 
					
						
							|  |  |  | 	pr := NewPrefixedChildRegistry(r, "prefix.") | 
					
						
							|  |  |  | 	name := "foo" | 
					
						
							|  |  |  | 	pr.Register(name, NewCounter()) | 
					
						
							|  |  |  | 	fooCounter := pr.Get(name) | 
					
						
							|  |  |  | 	if fooCounter == nil { | 
					
						
							|  |  |  | 		t.Fatal(name) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestChildPrefixedRegistryRegister(t *testing.T) { | 
					
						
							|  |  |  | 	r := NewPrefixedChildRegistry(DefaultRegistry, "prefix.") | 
					
						
							|  |  |  | 	err := r.Register("foo", NewCounter()) | 
					
						
							|  |  |  | 	c := NewCounter() | 
					
						
							|  |  |  | 	Register("bar", c) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatal(err.Error()) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	i := 0 | 
					
						
							|  |  |  | 	r.Each(func(name string, m interface{}) { | 
					
						
							|  |  |  | 		i++ | 
					
						
							|  |  |  | 		if name != "prefix.foo" { | 
					
						
							|  |  |  | 			t.Fatal(name) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 	if i != 1 { | 
					
						
							|  |  |  | 		t.Fatal(i) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestChildPrefixedRegistryOfChildRegister(t *testing.T) { | 
					
						
							|  |  |  | 	r := NewPrefixedChildRegistry(NewRegistry(), "prefix.") | 
					
						
							|  |  |  | 	r2 := NewPrefixedChildRegistry(r, "prefix2.") | 
					
						
							|  |  |  | 	err := r.Register("foo2", NewCounter()) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatal(err.Error()) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	err = r2.Register("baz", NewCounter()) | 
					
						
							| 
									
										
										
										
											2019-11-22 16:04:35 +01:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatal(err.Error()) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-02-23 10:56:08 +01:00
										 |  |  | 	c := NewCounter() | 
					
						
							|  |  |  | 	Register("bars", c) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	i := 0 | 
					
						
							|  |  |  | 	r2.Each(func(name string, m interface{}) { | 
					
						
							|  |  |  | 		i++ | 
					
						
							|  |  |  | 		if name != "prefix.prefix2.baz" { | 
					
						
							| 
									
										
										
										
											2019-11-22 16:04:35 +01:00
										 |  |  | 			t.Fatal(name) | 
					
						
							| 
									
										
										
										
											2018-02-23 10:56:08 +01:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 	if i != 1 { | 
					
						
							|  |  |  | 		t.Fatal(i) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestWalkRegistries(t *testing.T) { | 
					
						
							|  |  |  | 	r := NewPrefixedChildRegistry(NewRegistry(), "prefix.") | 
					
						
							|  |  |  | 	r2 := NewPrefixedChildRegistry(r, "prefix2.") | 
					
						
							|  |  |  | 	err := r.Register("foo2", NewCounter()) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatal(err.Error()) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	err = r2.Register("baz", NewCounter()) | 
					
						
							| 
									
										
										
										
											2019-11-22 16:04:35 +01:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatal(err.Error()) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-02-23 10:56:08 +01:00
										 |  |  | 	c := NewCounter() | 
					
						
							|  |  |  | 	Register("bars", c) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	_, prefix := findPrefix(r2, "") | 
					
						
							| 
									
										
										
										
											2019-11-22 16:04:35 +01:00
										 |  |  | 	if prefix != "prefix.prefix2." { | 
					
						
							| 
									
										
										
										
											2018-02-23 10:56:08 +01:00
										 |  |  | 		t.Fatal(prefix) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |