diff --git a/ddtrace/tracer/rules_sampler.go b/ddtrace/tracer/rules_sampler.go index 28ac31d289..3deaf845ec 100644 --- a/ddtrace/tracer/rules_sampler.go +++ b/ddtrace/tracer/rules_sampler.go @@ -185,6 +185,9 @@ func (sr *SamplingRule) match(s *span) bool { defer s.Unlock() if sr.Tags != nil { for k, regex := range sr.Tags { + if regex == nil { + continue + } if s.Meta != nil { v, ok := s.Meta[k] if ok && regex.MatchString(v) { @@ -683,7 +686,7 @@ func newSingleSpanRateLimiter(mps float64) *rateLimiter { // globMatch compiles pattern string into glob format, i.e. regular expressions with only '?' // and '*' treated as regex metacharacters. func globMatch(pattern string) *regexp.Regexp { - if pattern == "" { + if pattern == "" || pattern == "*" { return nil } // escaping regex characters diff --git a/ddtrace/tracer/sampler_test.go b/ddtrace/tracer/sampler_test.go index 15326cc7ac..559da1ddc6 100644 --- a/ddtrace/tracer/sampler_test.go +++ b/ddtrace/tracer/sampler_test.go @@ -721,6 +721,11 @@ func TestRulesSampler(t *testing.T) { spanSrv: "test-service", spanName: "abcde", }, + { + rules: []SamplingRule{SpanTagsResourceRule(map[string]string{"hostname": "hn*", "tag": "*"}, "", "abc*", "test*", 1.0)}, + spanSrv: "test-service", + spanName: "abcde", + }, { rules: []SamplingRule{SpanNameServiceRule("", "web*", 1.0)}, spanSrv: "wEbServer", @@ -904,13 +909,20 @@ func TestRulesSampler(t *testing.T) { spanSrv: "wEbServer", spanName: "web.reqUEst", }, + { + rules: []SamplingRule{SpanTagsResourceRule(map[string]string{"hostname": "hn*", "tag": "2*"}, "", "abc*", "test*", 1.0)}, + spanSrv: "test-service", + spanName: "abcde", + }, } { t.Run("", func(t *testing.T) { assert := assert.New(t) c := newConfig(WithSamplingRules(tt.rules)) rs := newRulesSampler(nil, c.spanRules, globalSampleRate()) - span := makeFinishedSpan(tt.spanName, tt.spanSrv, "res-10", map[string]interface{}{"hostname": "hn-30"}) + span := makeFinishedSpan(tt.spanName, tt.spanSrv, "res-10", map[string]interface{}{"hostname": "hn-30", + "tag": 20.1, + }) result := rs.SampleSpan(span) assert.False(result) assert.NotContains(span.Metrics, keySpanSamplingMechanism)