From d1368dab4dbb4462da30fdd03d78dd371e76e7cf Mon Sep 17 00:00:00 2001 From: Mauro Stettler Date: Wed, 26 Jun 2019 21:55:07 +0000 Subject: [PATCH 1/2] remove tilde from name values when indexing tags --- idx/memory/memory.go | 6 +++--- idx/memory/tag_query.go | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/idx/memory/memory.go b/idx/memory/memory.go index 4f2eb2de99..293e82bff6 100755 --- a/idx/memory/memory.go +++ b/idx/memory/memory.go @@ -543,7 +543,7 @@ func (m *UnpartitionedMemoryIdx) indexTags(def *schema.MetricDefinition) { tagValue := tagSplits[1] tags.addTagId(tagName, tagValue, def.Id) } - tags.addTagId("name", def.Name, def.Id) + tags.addTagId("name", def.NameSanitizedAsTagValue(), def.Id) m.defByTagSet.add(def) } @@ -569,7 +569,7 @@ func (m *UnpartitionedMemoryIdx) deindexTags(tags TagIndex, def *schema.MetricDe tags.delTagId(tagName, tagValue, def.Id) } - tags.delTagId("name", def.Name, def.Id) + tags.delTagId("name", def.NameSanitizedAsTagValue(), def.Id) m.defByTagSet.del(def) @@ -968,7 +968,7 @@ func (m *UnpartitionedMemoryIdx) FindTagValuesWithQuery(orgId uint32, tag, prefi // special case if the tag to complete values for is "name" if tag == "name" { - valueMap[def.Name] = struct{}{} + valueMap[def.NameSanitizedAsTagValue()] = struct{}{} } else { for _, tag := range def.Tags { if !strings.HasPrefix(tag, tagPrefix) { diff --git a/idx/memory/tag_query.go b/idx/memory/tag_query.go index b1f4cecfee..afe6395592 100644 --- a/idx/memory/tag_query.go +++ b/idx/memory/tag_query.go @@ -326,7 +326,7 @@ func (q *TagQueryContext) testByMatch(def *idx.Archive, exprs []kvRe, not bool) EXPRS: for _, e := range exprs { if e.Key == "name" { - if e.Regex == nil || e.Regex.MatchString(def.Name) { + if e.Regex == nil || e.Regex.MatchString(def.NameSanitizedAsTagValue()) { if not { return false } @@ -447,7 +447,7 @@ func (q *TagQueryContext) testByFrom(def *idx.Archive) bool { func (q *TagQueryContext) testByPrefix(def *idx.Archive, exprs []kv) bool { EXPRS: for _, e := range exprs { - if e.Key == "name" && strings.HasPrefix(def.Name, e.Value) { + if e.Key == "name" && strings.HasPrefix(def.NameSanitizedAsTagValue(), e.Value) { continue EXPRS } From 23d3f14504c6b717eb15cef09d9068af108823e3 Mon Sep 17 00:00:00 2001 From: Mauro Stettler Date: Thu, 4 Jul 2019 21:27:49 +0000 Subject: [PATCH 2/2] add tests for removing leading tilde in tag index --- idx/memory/memory_test.go | 60 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/idx/memory/memory_test.go b/idx/memory/memory_test.go index 3b96bd72a4..d0c4942d1b 100644 --- a/idx/memory/memory_test.go +++ b/idx/memory/memory_test.go @@ -1014,6 +1014,66 @@ func testSingleNodeMetric(t *testing.T) { ix.AddOrUpdate(mkey, data, getPartition(data)) } +func TestMetricNameStartingWithTilde(t *testing.T) { + withAndWithoutPartitonedIndex(testMetricNameStartingWithTilde)(t) +} + +func testMetricNameStartingWithTilde(t *testing.T) { + ix := New() + ix.Init() + defer func() { + ix.Stop() + ix = nil + }() + + metricName := "~~~weird~.~metric~" + expectedNameTag := "weird~.~metric~" + + data := &schema.MetricData{ + Name: metricName, + Interval: 1, + OrgId: 1, + } + data.SetId() + mkey, err := schema.MKeyFromString(data.Id) + if err != nil { + t.Fatal(err) + } + + arch, _, _ := ix.AddOrUpdate(mkey, data, getPartition(data)) + if arch.Name != metricName { + t.Fatalf("Expected metric name to be %q, but it was %q", metricName, arch.Name) + } + + // query by the name minus the leading ~ characters + query, err := tagquery.NewQueryFromStrings([]string{"name=" + expectedNameTag}, 0) + if err != nil { + t.Fatalf("Unexpected error when parsing query expression: %q", err) + } + + findResult := ix.FindByTag(1, query) + if len(findResult) != 1 { + t.Fatalf("Expected 1 result, but got %d", len(findResult)) + } + + if findResult[0].Path != metricName { + t.Fatalf("Expected metric name to be %q, but it was %q", metricName, findResult[0].Path) + } + + tagDetails := ix.TagDetails(1, "name", nil, 0) + if len(tagDetails) != 1 { + t.Fatalf("Expected 1 result, but got %d", len(tagDetails)) + } + + count, ok := tagDetails[expectedNameTag] + if !ok { + t.Fatalf("Did not get expected name as tag value in result") + } + if count != 1 { + t.Fatalf("Expected 1 result, but got %d", count) + } +} + // TestMemoryIndexHeapUsageWithTagsUniqueNone5 gives a rough estimate of how much memory the index is using with tag support turned on. // It uses 0 unique tags and 10 identical tags func TestMemoryIndexHeapUsageWithTagsUniqueNone5(t *testing.T) {