diff --git a/transformer/ban.go b/transformer/ban.go index 83993f1a..ae1fb775 100644 --- a/transformer/ban.go +++ b/transformer/ban.go @@ -11,37 +11,34 @@ type Ban struct { } func (b *Ban) Transform(c *skogul.Container) error { + for pathKey, pathValue := range b.LookupData { - for k, mi := range c.Metrics { + newMetrics := make([]*skogul.Metric, 0, len(c.Metrics)) + for _, mi := range c.Metrics { var ptr interface{} - ptr, _ = jsonptr.Get(mi.Data, pathKey) - if ptr == pathValue { - if k == len(c.Metrics)-1 { - c.Metrics = c.Metrics[:k] - } else { - c.Metrics = append(c.Metrics[:k], c.Metrics[k+1:]...) - } + if ptr != pathValue { + newMetrics = append(newMetrics, mi) } } + c.Metrics = newMetrics } for pathKey, pathValue := range b.LookupMetadata { - for k, mi := range c.Metrics { + newMetrics := make([]*skogul.Metric, 0, len(c.Metrics)) + for _, mi := range c.Metrics { var ptr interface{} ptr, _ = jsonptr.Get(mi.Metadata, pathKey) - if ptr == pathValue { - if k == len(c.Metrics)-1 { - c.Metrics = c.Metrics[:k] - } else { - c.Metrics = append(c.Metrics[:k], c.Metrics[k+1:]...) - } - continue + if ptr != pathValue { + newMetrics = append(newMetrics, mi) } } + c.Metrics = newMetrics } - + newMetrics := make([]*skogul.Metric, len(c.Metrics)) + copy(newMetrics, c.Metrics) + c.Metrics = newMetrics return nil } diff --git a/transformer/ban_test.go b/transformer/ban_test.go index b9fb58db..393efae9 100644 --- a/transformer/ban_test.go +++ b/transformer/ban_test.go @@ -99,11 +99,20 @@ func TestBan(t *testing.T) { "funny": "notfunny", }, } + metric5 := skogul.Metric{ + Metadata: map[string]interface{}{ + "funny": "", + }, + } + metric6 := skogul.Metric{ + Metadata: map[string]interface{}{ + "funny": "", + }, + } c := skogul.Container{} - c.Metrics = []*skogul.Metric{&metric, &metric2, &metric3, &metric4} + c.Metrics = []*skogul.Metric{&metric, &metric2, &metric3, &metric4, &metric5, &metric6} - originalMetricsCount := len(c.Metrics) ban := &transformer.Ban{} ban.LookupData = map[string]interface{}{ @@ -113,16 +122,17 @@ func TestBan(t *testing.T) { } ban.LookupMetadata = map[string]interface{}{ - "/funny": "notfunny", + "/funny": "", } err := ban.Transform(&c) if err != nil { t.Fatalf("error occurred %v", err.Error()) } - - if originalMetricsCount == len(c.Metrics) { - t.Fatal("Metrics slice has same length even after the banning of values") + if len(c.Metrics) != 1 { + t.Fatalf("expected exactly 1 metric to remain, got %d", len(c.Metrics)) + } + if cap(c.Metrics) != 1 { + t.Fatalf("expected exactly len(metrics) == 1, got %d", cap(c.Metrics)) } - }