mirror of
https://github.com/prometheus/statsd_exporter.git
synced 2025-01-22 04:18:07 +00:00
remove noop cache, add helper function for tests
Signed-off-by: glightfoot <glightfoot@rsglab.com>
This commit is contained in:
parent
aa529c8884
commit
8b306c8c76
6 changed files with 55 additions and 123 deletions
2
main.go
2
main.go
|
@ -253,7 +253,7 @@ func getCache(cacheSize int, cacheType string, registerer prometheus.Registerer)
|
||||||
var cache mapper.MetricMapperCache
|
var cache mapper.MetricMapperCache
|
||||||
var err error
|
var err error
|
||||||
if cacheSize == 0 {
|
if cacheSize == 0 {
|
||||||
cache = mapper.NewMetricMapperNoopCache()
|
return nil, nil
|
||||||
} else {
|
} else {
|
||||||
switch cacheType {
|
switch cacheType {
|
||||||
case "lru":
|
case "lru":
|
||||||
|
|
|
@ -182,7 +182,6 @@ func TestNegativeCounter(t *testing.T) {
|
||||||
prev := getTelemetryCounterValue(errorCounter)
|
prev := getTelemetryCounterValue(errorCounter)
|
||||||
|
|
||||||
testMapper := mapper.MetricMapper{}
|
testMapper := mapper.MetricMapper{}
|
||||||
testMapper.UseCache(mapper.NewMetricMapperNoopCache())
|
|
||||||
|
|
||||||
ex := NewExporter(prometheus.DefaultRegisterer, &testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount)
|
ex := NewExporter(prometheus.DefaultRegisterer, &testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount)
|
||||||
ex.Listen(events)
|
ex.Listen(events)
|
||||||
|
@ -318,7 +317,6 @@ mappings:
|
||||||
`
|
`
|
||||||
|
|
||||||
testMapper := &mapper.MetricMapper{}
|
testMapper := &mapper.MetricMapper{}
|
||||||
testMapper.UseCache(mapper.NewMetricMapperNoopCache())
|
|
||||||
err := testMapper.InitFromYAMLString(config)
|
err := testMapper.InitFromYAMLString(config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Config load error: %s %s", config, err)
|
t.Fatalf("Config load error: %s %s", config, err)
|
||||||
|
|
|
@ -229,12 +229,10 @@ func (m *MetricMapper) InitFromYAMLString(fileContents string) error {
|
||||||
m.Defaults = n.Defaults
|
m.Defaults = n.Defaults
|
||||||
m.Mappings = n.Mappings
|
m.Mappings = n.Mappings
|
||||||
|
|
||||||
// If no cache has been configured, use a noop cache
|
|
||||||
if m.cache == nil {
|
|
||||||
m.cache = NewMetricMapperNoopCache()
|
|
||||||
}
|
|
||||||
// Reset the cache since this function can be used to reload config
|
// Reset the cache since this function can be used to reload config
|
||||||
|
if m.cache != nil {
|
||||||
m.cache.Reset()
|
m.cache.Reset()
|
||||||
|
}
|
||||||
|
|
||||||
if n.doFSM {
|
if n.doFSM {
|
||||||
var mappings []string
|
var mappings []string
|
||||||
|
@ -266,6 +264,8 @@ func (m *MetricMapper) InitFromFile(fileName string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *MetricMapper) UseCache(cache MetricMapperCache) {
|
func (m *MetricMapper) UseCache(cache MetricMapperCache) {
|
||||||
|
m.mutex.Lock()
|
||||||
|
defer m.mutex.Unlock()
|
||||||
m.cache = cache
|
m.cache = cache
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -273,16 +273,14 @@ func (m *MetricMapper) GetMapping(statsdMetric string, statsdMetricType MetricTy
|
||||||
m.mutex.RLock()
|
m.mutex.RLock()
|
||||||
defer m.mutex.RUnlock()
|
defer m.mutex.RUnlock()
|
||||||
|
|
||||||
// default cache to noop cache if used from an uninitialized mapper
|
// only use a cache if one is present
|
||||||
if m.cache == nil {
|
if m.cache != nil {
|
||||||
m.cache = NewMetricMapperNoopCache()
|
|
||||||
}
|
|
||||||
|
|
||||||
result, cached := m.cache.Get(formatKey(statsdMetric, statsdMetricType))
|
result, cached := m.cache.Get(formatKey(statsdMetric, statsdMetricType))
|
||||||
if cached {
|
if cached {
|
||||||
r := result.(MetricMapperCacheResult)
|
r := result.(MetricMapperCacheResult)
|
||||||
return r.Mapping, r.Labels, r.Matched
|
return r.Mapping, r.Labels, r.Matched
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// glob matching
|
// glob matching
|
||||||
if m.doFSM {
|
if m.doFSM {
|
||||||
|
@ -303,13 +301,17 @@ func (m *MetricMapper) GetMapping(statsdMetric string, statsdMetricType MetricTy
|
||||||
Labels: labels,
|
Labels: labels,
|
||||||
}
|
}
|
||||||
// add match to cache
|
// add match to cache
|
||||||
|
if m.cache != nil {
|
||||||
m.cache.Add(formatKey(statsdMetric, statsdMetricType), r)
|
m.cache.Add(formatKey(statsdMetric, statsdMetricType), r)
|
||||||
|
}
|
||||||
|
|
||||||
return result, labels, true
|
return result, labels, true
|
||||||
} else if !m.doRegex {
|
} else if !m.doRegex {
|
||||||
// if there's no regex match type, return immediately
|
// if there's no regex match type, return immediately
|
||||||
// Add miss cache
|
// Add miss to cache
|
||||||
|
if m.cache != nil {
|
||||||
m.cache.Add(formatKey(statsdMetric, statsdMetricType), MetricMapperCacheResult{})
|
m.cache.Add(formatKey(statsdMetric, statsdMetricType), MetricMapperCacheResult{})
|
||||||
|
}
|
||||||
return nil, nil, false
|
return nil, nil, false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -348,13 +350,17 @@ func (m *MetricMapper) GetMapping(statsdMetric string, statsdMetricType MetricTy
|
||||||
Labels: labels,
|
Labels: labels,
|
||||||
}
|
}
|
||||||
// Add Match to cache
|
// Add Match to cache
|
||||||
|
if m.cache != nil {
|
||||||
m.cache.Add(formatKey(statsdMetric, statsdMetricType), r)
|
m.cache.Add(formatKey(statsdMetric, statsdMetricType), r)
|
||||||
|
}
|
||||||
|
|
||||||
return &mapping, labels, true
|
return &mapping, labels, true
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add Miss to cache
|
// Add Miss to cache
|
||||||
|
if m.cache != nil {
|
||||||
m.cache.Add(formatKey(statsdMetric, statsdMetricType), MetricMapperCacheResult{})
|
m.cache.Add(formatKey(statsdMetric, statsdMetricType), MetricMapperCacheResult{})
|
||||||
|
}
|
||||||
return nil, nil, false
|
return nil, nil, false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -585,15 +585,7 @@ mappings:` + duplicateRules(100, ruleTemplateSingleMatchGlob)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, cacheType := range []string{"lru", "random"} {
|
for _, cacheType := range []string{"lru", "random"} {
|
||||||
mapper := MetricMapper{}
|
mapper := newTestMapperWithCache(cacheType, 1000)
|
||||||
var cache MetricMapperCache
|
|
||||||
switch cacheType {
|
|
||||||
case "lru":
|
|
||||||
cache, _ = lru.NewMetricMapperLRUCache(mapper.Registerer, 1000)
|
|
||||||
case "random":
|
|
||||||
cache, _ = randomreplacement.NewMetricMapperRRCache(mapper.Registerer, 1000)
|
|
||||||
}
|
|
||||||
mapper.UseCache(cache)
|
|
||||||
|
|
||||||
b.Run(cacheType, func(b *testing.B) {
|
b.Run(cacheType, func(b *testing.B) {
|
||||||
err := mapper.InitFromYAMLString(config)
|
err := mapper.InitFromYAMLString(config)
|
||||||
|
@ -700,15 +692,7 @@ mappings:` + duplicateRules(100, ruleTemplateSingleMatchGlob)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, cacheType := range []string{"lru", "random"} {
|
for _, cacheType := range []string{"lru", "random"} {
|
||||||
mapper := MetricMapper{}
|
mapper := newTestMapperWithCache(cacheType, 1000)
|
||||||
var cache MetricMapperCache
|
|
||||||
switch cacheType {
|
|
||||||
case "lru":
|
|
||||||
cache, _ = lru.NewMetricMapperLRUCache(mapper.Registerer, 1000)
|
|
||||||
case "random":
|
|
||||||
cache, _ = randomreplacement.NewMetricMapperRRCache(mapper.Registerer, 1000)
|
|
||||||
}
|
|
||||||
mapper.UseCache(cache)
|
|
||||||
|
|
||||||
b.Run(cacheType, func(b *testing.B) {
|
b.Run(cacheType, func(b *testing.B) {
|
||||||
err := mapper.InitFromYAMLString(config)
|
err := mapper.InitFromYAMLString(config)
|
||||||
|
@ -845,15 +829,7 @@ mappings:` + duplicateRules(100, ruleTemplateMultipleMatchGlob)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, cacheType := range []string{"lru", "random"} {
|
for _, cacheType := range []string{"lru", "random"} {
|
||||||
mapper := MetricMapper{}
|
mapper := newTestMapperWithCache(cacheType, 1000)
|
||||||
var cache MetricMapperCache
|
|
||||||
switch cacheType {
|
|
||||||
case "lru":
|
|
||||||
cache, _ = lru.NewMetricMapperLRUCache(mapper.Registerer, 1000)
|
|
||||||
case "random":
|
|
||||||
cache, _ = randomreplacement.NewMetricMapperRRCache(mapper.Registerer, 1000)
|
|
||||||
}
|
|
||||||
mapper.UseCache(cache)
|
|
||||||
|
|
||||||
b.Run(cacheType, func(b *testing.B) {
|
b.Run(cacheType, func(b *testing.B) {
|
||||||
err := mapper.InitFromYAMLString(config)
|
err := mapper.InitFromYAMLString(config)
|
||||||
|
@ -927,15 +903,7 @@ mappings:` + duplicateRules(100, ruleTemplateMultipleMatchRegex)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, cacheType := range []string{"lru", "random"} {
|
for _, cacheType := range []string{"lru", "random"} {
|
||||||
mapper := MetricMapper{}
|
mapper := newTestMapperWithCache(cacheType, 1000)
|
||||||
var cache MetricMapperCache
|
|
||||||
switch cacheType {
|
|
||||||
case "lru":
|
|
||||||
cache, _ = lru.NewMetricMapperLRUCache(mapper.Registerer, 1000)
|
|
||||||
case "random":
|
|
||||||
cache, _ = randomreplacement.NewMetricMapperRRCache(mapper.Registerer, 1000)
|
|
||||||
}
|
|
||||||
mapper.UseCache(cache)
|
|
||||||
|
|
||||||
b.Run(cacheType, func(b *testing.B) {
|
b.Run(cacheType, func(b *testing.B) {
|
||||||
err := mapper.InitFromYAMLString(config)
|
err := mapper.InitFromYAMLString(config)
|
||||||
|
@ -968,16 +936,7 @@ mappings:` + duplicateRules(101, ruleTemplateSingleMatchGlob)
|
||||||
mappings := duplicateMetrics(100, "metric100")
|
mappings := duplicateMetrics(100, "metric100")
|
||||||
|
|
||||||
for _, cacheType := range []string{"lru", "random"} {
|
for _, cacheType := range []string{"lru", "random"} {
|
||||||
mapper := MetricMapper{}
|
mapper := newTestMapperWithCache(cacheType, 1000)
|
||||||
|
|
||||||
var cache MetricMapperCache
|
|
||||||
switch cacheType {
|
|
||||||
case "lru":
|
|
||||||
cache, _ = lru.NewMetricMapperLRUCache(mapper.Registerer, 1000)
|
|
||||||
case "random":
|
|
||||||
cache, _ = randomreplacement.NewMetricMapperRRCache(mapper.Registerer, 1000)
|
|
||||||
}
|
|
||||||
mapper.UseCache(cache)
|
|
||||||
|
|
||||||
b.Run(cacheType, func(b *testing.B) {
|
b.Run(cacheType, func(b *testing.B) {
|
||||||
err := mapper.InitFromYAMLString(config)
|
err := mapper.InitFromYAMLString(config)
|
||||||
|
@ -1006,15 +965,7 @@ mappings:` + duplicateRules(100, ruleTemplateSingleMatchGlob)
|
||||||
mappings := duplicateMetrics(100, "metric100")
|
mappings := duplicateMetrics(100, "metric100")
|
||||||
|
|
||||||
for _, cacheType := range []string{"lru", "random"} {
|
for _, cacheType := range []string{"lru", "random"} {
|
||||||
mapper := MetricMapper{}
|
mapper := newTestMapperWithCache(cacheType, 1000)
|
||||||
var cache MetricMapperCache
|
|
||||||
switch cacheType {
|
|
||||||
case "lru":
|
|
||||||
cache, _ = lru.NewMetricMapperLRUCache(mapper.Registerer, 50)
|
|
||||||
case "random":
|
|
||||||
cache, _ = randomreplacement.NewMetricMapperRRCache(mapper.Registerer, 50)
|
|
||||||
}
|
|
||||||
mapper.UseCache(cache)
|
|
||||||
|
|
||||||
b.Run(cacheType, func(b *testing.B) {
|
b.Run(cacheType, func(b *testing.B) {
|
||||||
err := mapper.InitFromYAMLString(config)
|
err := mapper.InitFromYAMLString(config)
|
||||||
|
@ -1050,18 +1001,8 @@ mappings:` + duplicateRules(100, ruleTemplateSingleMatchGlob)
|
||||||
})
|
})
|
||||||
|
|
||||||
for _, cacheType := range []string{"lru", "random"} {
|
for _, cacheType := range []string{"lru", "random"} {
|
||||||
mapper := MetricMapper{}
|
mapper := newTestMapperWithCache(cacheType, 50)
|
||||||
var cache MetricMapperCache
|
|
||||||
switch cacheType {
|
|
||||||
case "lru":
|
|
||||||
cache, _ = lru.NewMetricMapperLRUCache(mapper.Registerer, 50)
|
|
||||||
case "random":
|
|
||||||
cache, _ = randomreplacement.NewMetricMapperRRCache(mapper.Registerer, 50)
|
|
||||||
}
|
|
||||||
mapper.UseCache(cache)
|
|
||||||
|
|
||||||
b.Run(cacheType, func(b *testing.B) {
|
b.Run(cacheType, func(b *testing.B) {
|
||||||
mapper := MetricMapper{}
|
|
||||||
err := mapper.InitFromYAMLString(config)
|
err := mapper.InitFromYAMLString(config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
b.Fatalf("Config load error: %s %s", config, err)
|
b.Fatalf("Config load error: %s %s", config, err)
|
||||||
|
|
|
@ -69,20 +69,6 @@ type MetricMapperCache interface {
|
||||||
Reset()
|
Reset()
|
||||||
}
|
}
|
||||||
|
|
||||||
type MetricMapperNoopCache struct{}
|
|
||||||
|
|
||||||
func NewMetricMapperNoopCache() *MetricMapperNoopCache {
|
|
||||||
return &MetricMapperNoopCache{}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *MetricMapperNoopCache) Get(metricKey string) (interface{}, bool) {
|
|
||||||
return nil, false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *MetricMapperNoopCache) Add(metricKey string, result interface{}) {}
|
|
||||||
|
|
||||||
func (m *MetricMapperNoopCache) Reset() {}
|
|
||||||
|
|
||||||
func formatKey(metricString string, metricType MetricType) string {
|
func formatKey(metricString string, metricType MetricType) string {
|
||||||
return string(metricType) + "." + metricString
|
return string(metricType) + "." + metricString
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,7 @@ import (
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
|
|
||||||
"github.com/prometheus/statsd_exporter/pkg/mappercache/lru"
|
"github.com/prometheus/statsd_exporter/pkg/mappercache/lru"
|
||||||
|
"github.com/prometheus/statsd_exporter/pkg/mappercache/randomreplacement"
|
||||||
)
|
)
|
||||||
|
|
||||||
type mappings []struct {
|
type mappings []struct {
|
||||||
|
@ -36,6 +37,21 @@ type mappings []struct {
|
||||||
buckets []float64
|
buckets []float64
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func newTestMapperWithCache(cacheType string, size int) *MetricMapper {
|
||||||
|
mapper := MetricMapper{}
|
||||||
|
var cache MetricMapperCache
|
||||||
|
switch cacheType {
|
||||||
|
case "lru":
|
||||||
|
cache, _ = lru.NewMetricMapperLRUCache(mapper.Registerer, size)
|
||||||
|
case "random":
|
||||||
|
cache, _ = randomreplacement.NewMetricMapperRRCache(mapper.Registerer, size)
|
||||||
|
case "none":
|
||||||
|
return &mapper
|
||||||
|
}
|
||||||
|
mapper.UseCache(cache)
|
||||||
|
return &mapper
|
||||||
|
}
|
||||||
|
|
||||||
func TestMetricMapperYAML(t *testing.T) {
|
func TestMetricMapperYAML(t *testing.T) {
|
||||||
scenarios := []struct {
|
scenarios := []struct {
|
||||||
testName string
|
testName string
|
||||||
|
@ -1575,11 +1591,6 @@ mappings:
|
||||||
labels:
|
labels:
|
||||||
app: "$2"
|
app: "$2"
|
||||||
`
|
`
|
||||||
mapper := MetricMapper{}
|
|
||||||
err := mapper.InitFromYAMLString(config)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("config load error: %s ", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
names := map[string]string{
|
names := map[string]string{
|
||||||
"aa.bb.aa.myapp": "aa_bb_aa_total",
|
"aa.bb.aa.myapp": "aa_bb_aa_total",
|
||||||
|
@ -1588,24 +1599,14 @@ mappings:
|
||||||
"aa.bb.dd.myapp": "aa_bb_dd_total",
|
"aa.bb.dd.myapp": "aa_bb_dd_total",
|
||||||
}
|
}
|
||||||
|
|
||||||
lruCache, err := lru.NewMetricMapperLRUCache(mapper.Registerer, len(names))
|
scenarios := []string{"none", "lru"}
|
||||||
if err != nil {
|
|
||||||
t.Fatalf(err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
scenarios := []struct {
|
|
||||||
cache MetricMapperCache
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
cache: NewMetricMapperNoopCache(),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
cache: lruCache,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
for i, scenario := range scenarios {
|
for i, scenario := range scenarios {
|
||||||
mapper.UseCache(scenario.cache)
|
mapper := newTestMapperWithCache(scenario, 1000)
|
||||||
|
err := mapper.InitFromYAMLString(config)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("config load error: %s ", err)
|
||||||
|
}
|
||||||
|
|
||||||
// run multiple times to ensure cache works as expected
|
// run multiple times to ensure cache works as expected
|
||||||
for j := 0; j < 10; j++ {
|
for j := 0; j < 10; j++ {
|
||||||
|
|
Loading…
Reference in a new issue