Skip to content

Commit

Permalink
removed exactService and exactName
Browse files Browse the repository at this point in the history
  • Loading branch information
dianashevchenko committed Dec 1, 2023
1 parent 50bcd69 commit 30be83c
Show file tree
Hide file tree
Showing 2 changed files with 104 additions and 52 deletions.
65 changes: 25 additions & 40 deletions ddtrace/tracer/rules_sampler.go
Original file line number Diff line number Diff line change
Expand Up @@ -79,10 +79,8 @@ type SamplingRule struct {
// TargetRoot specifies whether sampling should be applied to the root spans only.
TargetRoot bool

ruleType SamplingRuleType
exactService string
exactName string
limiter *rateLimiter
ruleType SamplingRuleType
limiter *rateLimiter
}

// match returns true when the span's details match all the expected values in the rule.
Expand All @@ -92,13 +90,9 @@ func (sr *SamplingRule) match(s *span) bool {
}
if sr.Service != nil && !sr.Service.MatchString(s.Service) {
return false
} else if sr.exactService != "" && sr.exactService != s.Service {
return false
}
if sr.Name != nil && !sr.Name.MatchString(s.Name) {
return false
} else if sr.exactName != "" && sr.exactName != s.Name {
return false
}
if sr.Resource != nil && !sr.Resource.MatchString(s.Resource) {
return false
Expand Down Expand Up @@ -146,27 +140,27 @@ func (sr SamplingRuleType) String() string {
// to spans that match the service name provided.
func ServiceRule(service string, rate float64) SamplingRule {
return SamplingRule{
exactService: service,
Rate: rate,
Service: globMatch(service),
Rate: rate,
}
}

// NameRule returns a SamplingRule that applies the provided sampling rate
// to spans that match the operation name provided.
func NameRule(name string, rate float64) SamplingRule {
return SamplingRule{
exactName: name,
Rate: rate,
Name: globMatch(name),
Rate: rate,
}
}

// NameServiceRule returns a SamplingRule that applies the provided sampling rate
// to spans matching both the operation and service names provided.
func NameServiceRule(name string, service string, rate float64) SamplingRule {
return SamplingRule{
exactService: service,
exactName: name,
Rate: rate,
Service: globMatch(service),
Name: globMatch(name),
Rate: rate,
}
}

Expand Down Expand Up @@ -209,12 +203,11 @@ func SpanTagsResourceRule(tags map[string]*regexp.Regexp, resource, name, servic
// Operation and service fields must be valid glob patterns.
func SpanNameServiceRule(name, service string, rate float64) SamplingRule {
return SamplingRule{
Service: globMatch(service),
Name: globMatch(name),
Rate: rate,
ruleType: SamplingRuleSpan,
exactName: name,
limiter: newSingleSpanRateLimiter(0),
Service: globMatch(service),
Name: globMatch(name),
Rate: rate,
ruleType: SamplingRuleSpan,
limiter: newSingleSpanRateLimiter(0),
}
}

Expand All @@ -229,7 +222,6 @@ func SpanNameServiceMPSRule(name, service string, rate, limit float64) SamplingR
MaxPerSecond: limit,
Rate: rate,
ruleType: SamplingRuleSpan,
exactName: name,
limiter: newSingleSpanRateLimiter(limit),
}
}
Expand Down Expand Up @@ -624,17 +616,6 @@ func unmarshalSamplingRules(b []byte, spanType SamplingRuleType) ([]SamplingRule
errs = append(errs, fmt.Sprintf("at index %d: rate not provided", i))
continue
}
switch {
case v.Service != "" && v.Name != "":
rules = append(rules, NameServiceRule(v.Name, v.Service, rate))
continue
case v.Service != "":
rules = append(rules, ServiceRule(v.Service, rate))
continue
case v.Name != "":
rules = append(rules, NameRule(v.Name, rate))
continue
}
var targetRoot bool
switch strings.ToLower(v.TargetSpan) {
case "", "root":
Expand All @@ -645,7 +626,15 @@ func unmarshalSamplingRules(b []byte, spanType SamplingRuleType) ([]SamplingRule
errs = append(errs, fmt.Sprintf(`at index %d: "target_span" value is not expected, must be in ["any", "root", ""]`, i))
continue
}
rules = append(rules, TagsResourceRule(tagGlobs, v.Resource, v.Name, v.Service, rate, targetRoot))
rules = append(rules, SamplingRule{
Service: globMatch(v.Service),
Name: globMatch(v.Name),
Rate: rate,
Resource: globMatch(v.Resource),
Tags: tagGlobs,
TargetRoot: targetRoot,
ruleType: SamplingRuleTrace,
})
}
}
if len(errs) != 0 {
Expand All @@ -666,14 +655,10 @@ func (sr *SamplingRule) MarshalJSON() ([]byte, error) {
Type string `json:"type"`
MaxPerSecond *float64 `json:"max_per_second,omitempty"`
}{}
if sr.exactService != "" {
s.Service = sr.exactService
} else if sr.Service != nil {
if sr.Service != nil {
s.Service = fmt.Sprintf("%s", sr.Service)
}
if sr.exactName != "" {
s.Name = sr.exactName
} else if sr.Name != nil {
if sr.Name != nil {
s.Name = fmt.Sprintf("%s", sr.Name)
}
if sr.MaxPerSecond != 0 {
Expand Down
91 changes: 79 additions & 12 deletions ddtrace/tracer/sampler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -465,6 +465,75 @@ func TestRulesSampler(t *testing.T) {
assert.False(result)
})

t.Run("matching-trace-rules-env", func(t *testing.T) {
defer os.Unsetenv("DD_TRACE_SAMPLING_RULES")
for _, tt := range []struct {
rules string
spanSrv string
spanName string
spanRsc string
spanTags map[string]string
}{
{
rules: `[{"service": "web.non-matching*", "sample_rate": 0}, {"service": "web*", "sample_rate": 1}]`,
spanSrv: "web.service",
},
{
rules: `[{"service": "web.srv", "name":"web.req","sample_rate": 1, "resource": "res/bar"}]`,
spanSrv: "web.srv",
spanName: "web.req",
spanRsc: "res/bar",
},
{
rules: `[{"service": "web.service", "sample_rate": 1}]`,
spanSrv: "web.service",
},
{
rules: `[{"resource": "http_*", "sample_rate": 1}]`,
spanSrv: "web.service",
spanRsc: "http_rec",
},
{
rules: `[{"target_span": "any", "service":"web*", "sample_rate": 1}]`,
spanSrv: "web.service",
},
{
rules: `[{"target_span": "root", "service":"web*", "sample_rate": 1}]`,
spanSrv: "web.service",
},
{
rules: `[{"resource": "http_*", "tags":{"host":"COMP-*"}, "sample_rate": 1}]`,
spanSrv: "web.service",
spanRsc: "http_rec",
spanTags: map[string]string{"host": "COMP-1234"},
},
{
rules: `[{"tags":{"host":"COMP-*"}, "sample_rate": 1}]`,
spanSrv: "web.service",
spanTags: map[string]string{"host": "COMP-1234"},
},
{
rules: `[{"tags":{"host":"COMP-*"}, "sample_rate": 1}]`,
spanSrv: "web.service",
spanTags: map[string]string{"host": "COMP-1234"},
},
} {
t.Run("", func(t *testing.T) {
os.Setenv("DD_TRACE_SAMPLING_RULES", tt.rules)
rules, _, err := samplingRulesFromEnv()
assert.Nil(t, err)

assert := assert.New(t)
rs := newRulesSampler(rules, nil, globalSampleRate())

span := makeFinishedSpan(tt.spanName, tt.spanSrv, tt.spanRsc, tt.spanTags)

result := rs.SampleTrace(span)
assert.True(result)
})
}
})

t.Run("matching", func(t *testing.T) {
traceRules := [][]SamplingRule{
{ServiceRule("test-service", 1.0)},
Expand Down Expand Up @@ -1151,21 +1220,19 @@ func TestSamplingRuleMarshall(t *testing.T) {
in SamplingRule
out string
}{
{SamplingRule{nil, nil, 0, 0, nil, nil, false, 0, "srv", "ops", nil},
`{"service":"srv","name":"ops","sample_rate":0,"target_span":"any","type":"trace(0)"}`},
{SamplingRule{regexp.MustCompile("srv.[0-9]+"), nil, 0, 0, nil, nil, false, 0, "srv", "ops", nil},
`{"service":"srv","name":"ops","sample_rate":0,"target_span":"any","type":"trace(0)"}`},
{SamplingRule{regexp.MustCompile("srv.*"), regexp.MustCompile("ops.[0-9]+"), 0, 0, nil, nil, false, 0, "", "", nil},
{SamplingRule{regexp.MustCompile("srv.[0-9]+"), nil, 0, 0, nil, nil, false, 0, nil},
`{"service":"srv.[0-9]+","name":"","sample_rate":0,"target_span":"any","type":"trace(0)"}`},
{SamplingRule{regexp.MustCompile("srv.*"), regexp.MustCompile("ops.[0-9]+"), 0, 0, nil, nil, false, 0, nil},
`{"service":"srv.*","name":"ops.[0-9]+","sample_rate":0,"target_span":"any","type":"trace(0)"}`},
{SamplingRule{regexp.MustCompile("srv.[0-9]+"), regexp.MustCompile("ops.[0-9]+"), 0.55, 0, nil, nil, false, 0, "", "", nil},
{SamplingRule{regexp.MustCompile("srv.[0-9]+"), regexp.MustCompile("ops.[0-9]+"), 0.55, 0, nil, nil, false, 0, nil},
`{"service":"srv.[0-9]+","name":"ops.[0-9]+","sample_rate":0.55,"target_span":"any","type":"trace(0)"}`},
{SamplingRule{nil, nil, 0.35, 0, regexp.MustCompile("http_get"), nil, false, 0, "srv", "ops", nil},
`{"service":"srv","name":"ops","resource":"http_get","sample_rate":0.35,"target_span":"any","type":"trace(0)"}`},
{SamplingRule{nil, nil, 0.35, 0, regexp.MustCompile("http_get"), map[string]*regexp.Regexp{"host": regexp.MustCompile("hn-*")}, false, 0, "srv", "ops", nil},
`{"service":"srv","name":"ops","resource":"http_get","sample_rate":0.35,"target_span":"any","tags":{"host":"hn-*"},"type":"trace(0)"}`},
{SamplingRule{regexp.MustCompile("srv.[0-9]+"), regexp.MustCompile("ops.[0-9]+"), 0.55, 0, nil, nil, false, 1, "", "", nil},
{SamplingRule{nil, nil, 0.35, 0, regexp.MustCompile("http_get"), nil, false, 0, nil},
`{"service":"","name":"","resource":"http_get","sample_rate":0.35,"target_span":"any","type":"trace(0)"}`},
{SamplingRule{nil, nil, 0.35, 0, regexp.MustCompile("http_get"), map[string]*regexp.Regexp{"host": regexp.MustCompile("hn-*")}, false, 0, nil},
`{"service":"","name":"","resource":"http_get","sample_rate":0.35,"target_span":"any","tags":{"host":"hn-*"},"type":"trace(0)"}`},
{SamplingRule{regexp.MustCompile("srv.[0-9]+"), regexp.MustCompile("ops.[0-9]+"), 0.55, 0, nil, nil, false, 1, nil},
`{"service":"srv.[0-9]+","name":"ops.[0-9]+","sample_rate":0.55,"type":"span(1)"}`},
{SamplingRule{regexp.MustCompile("srv.[0-9]+"), regexp.MustCompile("ops.[0-9]+"), 0.55, 1000, nil, nil, false, 1, "", "", nil},
{SamplingRule{regexp.MustCompile("srv.[0-9]+"), regexp.MustCompile("ops.[0-9]+"), 0.55, 1000, nil, nil, false, 1, nil},
`{"service":"srv.[0-9]+","name":"ops.[0-9]+","sample_rate":0.55,"type":"span(1)","max_per_second":1000}`},
} {
m, err := tt.in.MarshalJSON()
Expand Down

0 comments on commit 30be83c

Please sign in to comment.