Ai
1 Star 0 Fork 0

golang108/go-metrics

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
metrics_test.go 13.49 KB
一键复制 编辑 原始数据 按行查看 历史
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575
// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MIT
package metrics
import (
"reflect"
"runtime"
"testing"
"time"
)
func mockMetric() (*MockSink, *Metrics) {
m := &MockSink{}
met := &Metrics{Config: Config{FilterDefault: true}, sink: m}
return m, met
}
func TestMetrics_SetGauge(t *testing.T) {
m, met := mockMetric()
met.SetGauge([]string{"key"}, float32(1))
if m.getKeys()[0][0] != "key" {
t.Fatalf("")
}
if m.vals[0] != 1 {
t.Fatalf("")
}
m, met = mockMetric()
labels := []Label{{"a", "b"}}
met.SetGaugeWithLabels([]string{"key"}, float32(1), labels)
if m.getKeys()[0][0] != "key" {
t.Fatalf("")
}
if m.vals[0] != 1 {
t.Fatalf("")
}
if !reflect.DeepEqual(m.labels[0], labels) {
t.Fatalf("")
}
m, met = mockMetric()
met.HostName = "test"
met.EnableHostname = true
met.SetGauge([]string{"key"}, float32(1))
if m.getKeys()[0][0] != "test" || m.getKeys()[0][1] != "key" {
t.Fatalf("")
}
if m.vals[0] != 1 {
t.Fatalf("")
}
m, met = mockMetric()
met.EnableTypePrefix = true
met.SetGauge([]string{"key"}, float32(1))
if m.getKeys()[0][0] != "gauge" || m.getKeys()[0][1] != "key" {
t.Fatalf("")
}
if m.vals[0] != 1 {
t.Fatalf("")
}
m, met = mockMetric()
met.ServiceName = "service"
met.SetGauge([]string{"key"}, float32(1))
if m.getKeys()[0][0] != "service" || m.getKeys()[0][1] != "key" {
t.Fatalf("")
}
if m.vals[0] != 1 {
t.Fatalf("")
}
}
func TestMetrics_SetPrecisionGauge(t *testing.T) {
m, met := mockMetric()
met.SetPrecisionGauge([]string{"key"}, float64(1))
if m.getKeys()[0][0] != "key" {
t.Fatalf("")
}
if m.precisionVals[0] != 1 {
t.Fatalf("")
}
m, met = mockMetric()
labels := []Label{{"a", "b"}}
met.SetPrecisionGaugeWithLabels([]string{"key"}, float64(1), labels)
if m.getKeys()[0][0] != "key" {
t.Fatalf("")
}
if m.precisionVals[0] != 1 {
t.Fatalf("")
}
if !reflect.DeepEqual(m.labels[0], labels) {
t.Fatalf("")
}
m, met = mockMetric()
met.HostName = "test"
met.EnableHostname = true
met.SetPrecisionGauge([]string{"key"}, float64(1))
if m.getKeys()[0][0] != "test" || m.getKeys()[0][1] != "key" {
t.Fatalf("")
}
if m.precisionVals[0] != 1 {
t.Fatalf("")
}
m, met = mockMetric()
met.EnableTypePrefix = true
met.SetPrecisionGauge([]string{"key"}, float64(1))
if m.getKeys()[0][0] != "gauge" || m.getKeys()[0][1] != "key" {
t.Fatalf("")
}
if m.precisionVals[0] != 1 {
t.Fatalf("")
}
m, met = mockMetric()
met.ServiceName = "service"
met.SetPrecisionGauge([]string{"key"}, float64(1))
if m.getKeys()[0][0] != "service" || m.getKeys()[0][1] != "key" {
t.Fatalf("")
}
if m.precisionVals[0] != 1 {
t.Fatalf("")
}
}
func TestMetrics_EmitKey(t *testing.T) {
m, met := mockMetric()
met.EmitKey([]string{"key"}, float32(1))
if m.getKeys()[0][0] != "key" {
t.Fatalf("")
}
if m.vals[0] != 1 {
t.Fatalf("")
}
m, met = mockMetric()
met.EnableTypePrefix = true
met.EmitKey([]string{"key"}, float32(1))
if m.getKeys()[0][0] != "kv" || m.getKeys()[0][1] != "key" {
t.Fatalf("")
}
if m.vals[0] != 1 {
t.Fatalf("")
}
m, met = mockMetric()
met.ServiceName = "service"
met.EmitKey([]string{"key"}, float32(1))
if m.getKeys()[0][0] != "service" || m.getKeys()[0][1] != "key" {
t.Fatalf("")
}
if m.vals[0] != 1 {
t.Fatalf("")
}
}
func TestMetrics_IncrCounter(t *testing.T) {
m, met := mockMetric()
met.IncrCounter([]string{"key"}, float32(1))
if m.getKeys()[0][0] != "key" {
t.Fatalf("")
}
if m.vals[0] != 1 {
t.Fatalf("")
}
m, met = mockMetric()
labels := []Label{{"a", "b"}}
met.IncrCounterWithLabels([]string{"key"}, float32(1), labels)
if m.getKeys()[0][0] != "key" {
t.Fatalf("")
}
if m.vals[0] != 1 {
t.Fatalf("")
}
if !reflect.DeepEqual(m.labels[0], labels) {
t.Fatalf("")
}
m, met = mockMetric()
met.EnableTypePrefix = true
met.IncrCounter([]string{"key"}, float32(1))
if m.getKeys()[0][0] != "counter" || m.getKeys()[0][1] != "key" {
t.Fatalf("")
}
if m.vals[0] != 1 {
t.Fatalf("")
}
m, met = mockMetric()
met.ServiceName = "service"
met.IncrCounter([]string{"key"}, float32(1))
if m.getKeys()[0][0] != "service" || m.getKeys()[0][1] != "key" {
t.Fatalf("")
}
if m.vals[0] != 1 {
t.Fatalf("")
}
}
func TestMetrics_AddSample(t *testing.T) {
m, met := mockMetric()
met.AddSample([]string{"key"}, float32(1))
if m.getKeys()[0][0] != "key" {
t.Fatalf("")
}
if m.vals[0] != 1 {
t.Fatalf("")
}
m, met = mockMetric()
labels := []Label{{"a", "b"}}
met.AddSampleWithLabels([]string{"key"}, float32(1), labels)
if m.getKeys()[0][0] != "key" {
t.Fatalf("")
}
if m.vals[0] != 1 {
t.Fatalf("")
}
if !reflect.DeepEqual(m.labels[0], labels) {
t.Fatalf("")
}
m, met = mockMetric()
met.EnableTypePrefix = true
met.AddSample([]string{"key"}, float32(1))
if m.getKeys()[0][0] != "sample" || m.getKeys()[0][1] != "key" {
t.Fatalf("")
}
if m.vals[0] != 1 {
t.Fatalf("")
}
m, met = mockMetric()
met.ServiceName = "service"
met.AddSample([]string{"key"}, float32(1))
if m.getKeys()[0][0] != "service" || m.getKeys()[0][1] != "key" {
t.Fatalf("")
}
if m.vals[0] != 1 {
t.Fatalf("")
}
}
func TestMetrics_MeasureSince(t *testing.T) {
m, met := mockMetric()
met.TimerGranularity = time.Millisecond
n := time.Now()
met.MeasureSince([]string{"key"}, n)
if m.getKeys()[0][0] != "key" {
t.Fatalf("")
}
if m.vals[0] > 0.1 {
t.Fatalf("")
}
m, met = mockMetric()
met.TimerGranularity = time.Millisecond
labels := []Label{{"a", "b"}}
met.MeasureSinceWithLabels([]string{"key"}, n, labels)
if m.getKeys()[0][0] != "key" {
t.Fatalf("")
}
if m.vals[0] > 0.1 {
t.Fatalf("")
}
if !reflect.DeepEqual(m.labels[0], labels) {
t.Fatalf("")
}
m, met = mockMetric()
met.TimerGranularity = time.Millisecond
met.EnableTypePrefix = true
met.MeasureSince([]string{"key"}, n)
if m.getKeys()[0][0] != "timer" || m.getKeys()[0][1] != "key" {
t.Fatalf("")
}
if m.vals[0] > 0.1 {
t.Fatalf("")
}
m, met = mockMetric()
met.TimerGranularity = time.Millisecond
met.ServiceName = "service"
met.MeasureSince([]string{"key"}, n)
if m.getKeys()[0][0] != "service" || m.getKeys()[0][1] != "key" {
t.Fatalf("")
}
if m.vals[0] > 0.1 {
t.Fatalf("")
}
}
func TestMetrics_EmitRuntimeStats(t *testing.T) {
runtime.GC()
m, met := mockMetric()
met.EmitRuntimeStats()
if m.getKeys()[0][0] != "runtime" || m.getKeys()[0][1] != "num_goroutines" {
t.Fatalf("bad key %v", m.getKeys())
}
if m.vals[0] <= 1 {
t.Fatalf("bad val: %v", m.vals)
}
if m.getKeys()[1][0] != "runtime" || m.getKeys()[1][1] != "alloc_bytes" {
t.Fatalf("bad key %v", m.getKeys())
}
if m.vals[1] <= 40000 {
t.Fatalf("bad val: %v", m.vals)
}
if m.getKeys()[2][0] != "runtime" || m.getKeys()[2][1] != "sys_bytes" {
t.Fatalf("bad key %v", m.getKeys())
}
if m.vals[2] <= 100000 {
t.Fatalf("bad val: %v", m.vals)
}
if m.getKeys()[3][0] != "runtime" || m.getKeys()[3][1] != "malloc_count" {
t.Fatalf("bad key %v", m.getKeys())
}
if m.vals[3] <= 100 {
t.Fatalf("bad val: %v", m.vals)
}
if m.getKeys()[4][0] != "runtime" || m.getKeys()[4][1] != "free_count" {
t.Fatalf("bad key %v", m.getKeys())
}
if m.vals[4] <= 100 {
t.Fatalf("bad val: %v", m.vals)
}
if m.getKeys()[5][0] != "runtime" || m.getKeys()[5][1] != "heap_objects" {
t.Fatalf("bad key %v", m.getKeys())
}
if m.vals[5] <= 100 {
t.Fatalf("bad val: %v", m.vals)
}
if m.getKeys()[6][0] != "runtime" || m.getKeys()[6][1] != "total_gc_pause_ns" {
t.Fatalf("bad key %v", m.getKeys())
}
if m.vals[6] <= 100 {
t.Fatalf("bad val: %v\nkeys: %v", m.vals, m.getKeys())
}
if m.getKeys()[7][0] != "runtime" || m.getKeys()[7][1] != "total_gc_runs" {
t.Fatalf("bad key %v", m.getKeys())
}
if m.vals[7] < 1 {
t.Fatalf("bad val: %v", m.vals)
}
if m.getKeys()[8][0] != "runtime" || m.getKeys()[8][1] != "gc_pause_ns" {
t.Fatalf("bad key %v", m.getKeys())
}
if m.vals[8] <= 1000 {
t.Fatalf("bad val: %v", m.vals)
}
}
func TestInsert(t *testing.T) {
k := []string{"hi", "bob"}
exp := []string{"hi", "there", "bob"}
out := insert(1, "there", k)
if !reflect.DeepEqual(exp, out) {
t.Fatalf("bad insert %v %v", exp, out)
}
}
func TestMetrics_Filter_Blacklist(t *testing.T) {
m := &MockSink{}
conf := DefaultConfig("")
conf.AllowedPrefixes = []string{"service", "debug.thing"}
conf.BlockedPrefixes = []string{"debug"}
conf.EnableHostname = false
met, err := New(conf, m)
if err != nil {
t.Fatal(err)
}
// Allowed by default
key := []string{"thing"}
met.SetGauge(key, 1)
if !reflect.DeepEqual(m.getKeys()[0], key) {
t.Fatalf("key doesn't exist %v, %v", m.getKeys()[0], key)
}
if m.vals[0] != 1 {
t.Fatalf("bad val: %v", m.vals[0])
}
// Allowed by filter
key = []string{"service", "thing"}
met.SetGauge(key, 2)
if !reflect.DeepEqual(m.getKeys()[1], key) {
t.Fatalf("key doesn't exist")
}
if m.vals[1] != 2 {
t.Fatalf("bad val: %v", m.vals[1])
}
// Allowed by filter, subtree of a blocked entry
key = []string{"debug", "thing"}
met.SetGauge(key, 3)
if !reflect.DeepEqual(m.getKeys()[2], key) {
t.Fatalf("key doesn't exist")
}
if m.vals[2] != 3 {
t.Fatalf("bad val: %v", m.vals[2])
}
// Blocked by filter
key = []string{"debug", "other-thing"}
met.SetGauge(key, 4)
if len(m.getKeys()) != 3 {
t.Fatalf("key shouldn't exist")
}
}
func HasElem(s interface{}, elem interface{}) bool {
arrV := reflect.ValueOf(s)
if arrV.Kind() == reflect.Slice {
for i := 0; i < arrV.Len(); i++ {
if arrV.Index(i).Interface() == elem {
return true
}
}
}
return false
}
func TestMetrics_Filter_Whitelist(t *testing.T) {
m := &MockSink{}
conf := DefaultConfig("")
conf.AllowedPrefixes = []string{"service", "debug.thing"}
conf.BlockedPrefixes = []string{"debug"}
conf.FilterDefault = false
conf.EnableHostname = false
conf.BlockedLabels = []string{"bad_label"}
met, err := New(conf, m)
if err != nil {
t.Fatal(err)
}
// Blocked by default
key := []string{"thing"}
met.SetGauge(key, 1)
if len(m.getKeys()) != 0 {
t.Fatalf("key should not exist")
}
// Allowed by filter
key = []string{"service", "thing"}
met.SetGauge(key, 2)
if !reflect.DeepEqual(m.getKeys()[0], key) {
t.Fatalf("key doesn't exist")
}
if m.vals[0] != 2 {
t.Fatalf("bad val: %v", m.vals[0])
}
// Allowed by filter, subtree of a blocked entry
key = []string{"debug", "thing"}
met.SetGauge(key, 3)
if !reflect.DeepEqual(m.getKeys()[1], key) {
t.Fatalf("key doesn't exist")
}
if m.vals[1] != 3 {
t.Fatalf("bad val: %v", m.vals[1])
}
// Blocked by filter
key = []string{"debug", "other-thing"}
met.SetGauge(key, 4)
if len(m.getKeys()) != 2 {
t.Fatalf("key shouldn't exist")
}
// Test blacklisting of labels
key = []string{"debug", "thing"}
goodLabel := Label{Name: "good", Value: "should be present"}
badLabel := Label{Name: "bad_label", Value: "should not be there"}
labels := []Label{badLabel, goodLabel}
met.SetGaugeWithLabels(key, 3, labels)
if !reflect.DeepEqual(m.getKeys()[1], key) {
t.Fatalf("key doesn't exist")
}
if m.vals[2] != 3 {
t.Fatalf("bad val: %v", m.vals[1])
}
if HasElem(m.labels[2], badLabel) {
t.Fatalf("bad_label should not be present in %v", m.labels[2])
}
if !HasElem(m.labels[2], goodLabel) {
t.Fatalf("good label is not present in %v", m.labels[2])
}
}
func TestMetrics_Filter_Labels_Whitelist(t *testing.T) {
m := &MockSink{}
conf := DefaultConfig("")
conf.AllowedPrefixes = []string{"service", "debug.thing"}
conf.BlockedPrefixes = []string{"debug"}
conf.FilterDefault = false
conf.EnableHostname = false
conf.AllowedLabels = []string{"good_label"}
conf.BlockedLabels = []string{"bad_label"}
met, err := New(conf, m)
if err != nil {
t.Fatal(err)
}
// Blocked by default
key := []string{"debug", "thing"}
goodLabel := Label{Name: "good_label", Value: "should be present"}
notReallyGoodLabel := Label{Name: "not_really_good_label", Value: "not whitelisted, but not blacklisted"}
badLabel := Label{Name: "bad_label", Value: "should not be there"}
labels := []Label{badLabel, notReallyGoodLabel, goodLabel}
met.SetGaugeWithLabels(key, 1, labels)
if HasElem(m.labels[0], badLabel) {
t.Fatalf("bad_label should not be present in %v", m.labels[0])
}
if HasElem(m.labels[0], notReallyGoodLabel) {
t.Fatalf("not_really_good_label should not be present in %v", m.labels[0])
}
if !HasElem(m.labels[0], goodLabel) {
t.Fatalf("good label is not present in %v", m.labels[0])
}
conf.AllowedLabels = nil
met.UpdateFilterAndLabels(conf.AllowedPrefixes, conf.BlockedLabels, conf.AllowedLabels, conf.BlockedLabels)
met.SetGaugeWithLabels(key, 1, labels)
if HasElem(m.labels[1], badLabel) {
t.Fatalf("bad_label should not be present in %v", m.labels[1])
}
// Since no whitelist, not_really_good_label should be there
if !HasElem(m.labels[1], notReallyGoodLabel) {
t.Fatalf("not_really_good_label is not present in %v", m.labels[1])
}
if !HasElem(m.labels[1], goodLabel) {
t.Fatalf("good label is not present in %v", m.labels[1])
}
}
func TestMetrics_Filter_Labels_ModifyArgs(t *testing.T) {
m := &MockSink{}
conf := DefaultConfig("")
conf.FilterDefault = false
conf.EnableHostname = false
conf.AllowedLabels = []string{"keep"}
conf.BlockedLabels = []string{"delete"}
met, err := New(conf, m)
if err != nil {
t.Fatal(err)
}
// Blocked by default
key := []string{"debug", "thing"}
goodLabel := Label{Name: "keep", Value: "should be kept"}
badLabel := Label{Name: "delete", Value: "should be deleted"}
argLabels := []Label{badLabel, goodLabel, badLabel, goodLabel, badLabel, goodLabel, badLabel}
origLabels := append([]Label{}, argLabels...)
met.SetGaugeWithLabels(key, 1, argLabels)
if !reflect.DeepEqual(argLabels, origLabels) {
t.Fatalf("SetGaugeWithLabels modified the input argument")
}
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/golang108/go-metrics.git
git@gitee.com:golang108/go-metrics.git
golang108
go-metrics
go-metrics
master

搜索帮助