Class: Datadog::Sampling::RuleSampler
- Inherits:
-
Object
- Object
- Datadog::Sampling::RuleSampler
- Extended by:
- Forwardable
- Defined in:
- lib/ddtrace/sampling/rule_sampler.rb
Overview
Span Datadog::Sampler that applies a set of Rules to decide on sampling outcome. Then, a rate limiter is applied.
If a span does not conform to any rules, a default sampling strategy is applied.
Constant Summary collapse
- AGENT_RATE_METRIC_KEY =
'_dd.agent_psr'.freeze
Instance Attribute Summary collapse
-
#default_sampler ⇒ Object
readonly
Returns the value of attribute default_sampler.
-
#rate_limiter ⇒ Object
readonly
Returns the value of attribute rate_limiter.
-
#rules ⇒ Object
readonly
Returns the value of attribute rules.
Instance Method Summary collapse
-
#initialize(rules = [], rate_limit: Datadog.configuration.sampling.rate_limit, rate_limiter: nil, default_sample_rate: Datadog.configuration.sampling.default_rate, default_sampler: nil) ⇒ RuleSampler
constructor
A new instance of RuleSampler.
- #sample!(span) ⇒ Object
-
#sample?(_span) ⇒ Boolean
/RuleSampler's components (it's rate limiter, for example) are not be guaranteed to be size-effect free.
- #update(*args) ⇒ Object
Constructor Details
#initialize(rules = [], rate_limit: Datadog.configuration.sampling.rate_limit, rate_limiter: nil, default_sample_rate: Datadog.configuration.sampling.default_rate, default_sampler: nil) ⇒ RuleSampler
Returns a new instance of RuleSampler.
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
# File 'lib/ddtrace/sampling/rule_sampler.rb', line 31 def initialize(rules = [], rate_limit: Datadog.configuration.sampling.rate_limit, rate_limiter: nil, default_sample_rate: Datadog.configuration.sampling.default_rate, default_sampler: nil) @rules = rules @rate_limiter = if rate_limiter rate_limiter elsif rate_limit Datadog::Sampling::TokenBucket.new(rate_limit) else Datadog::Sampling::UnlimitedLimiter.new end @default_sampler = if default_sampler default_sampler elsif default_sample_rate # Add to the end of the rule list a rule always matches any span @rules << SimpleRule.new(sample_rate: default_sample_rate) else RateByServiceSampler.new(1.0, env: -> { Datadog.tracer.[:env] }) end end |
Instance Attribute Details
#default_sampler ⇒ Object (readonly)
Returns the value of attribute default_sampler.
23 24 25 |
# File 'lib/ddtrace/sampling/rule_sampler.rb', line 23 def default_sampler @default_sampler end |
#rate_limiter ⇒ Object (readonly)
Returns the value of attribute rate_limiter.
23 24 25 |
# File 'lib/ddtrace/sampling/rule_sampler.rb', line 23 def rate_limiter @rate_limiter end |
#rules ⇒ Object (readonly)
Returns the value of attribute rules.
23 24 25 |
# File 'lib/ddtrace/sampling/rule_sampler.rb', line 23 def rules @rules end |
Instance Method Details
#sample!(span) ⇒ Object
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
# File 'lib/ddtrace/sampling/rule_sampler.rb', line 67 def sample!(span) sampled = sample_span(span) do |s| @default_sampler.sample!(s).tap do # We want to make sure the span is tagged with the agent-derived # service rate. Retrieve this from the rate by service sampler. # Only do this if it was set by a RateByServiceSampler. if @default_sampler.is_a?(RateByServiceSampler) s.set_metric(AGENT_RATE_METRIC_KEY, @default_sampler.sample_rate(span)) end end end sampled.tap do span.sampled = sampled end end |
#sample?(_span) ⇒ Boolean
63 64 65 |
# File 'lib/ddtrace/sampling/rule_sampler.rb', line 63 def sample?(_span) raise 'RuleSampler cannot be evaluated without side-effects' end |
#update(*args) ⇒ Object
84 85 86 87 88 |
# File 'lib/ddtrace/sampling/rule_sampler.rb', line 84 def update(*args) return false unless @default_sampler.respond_to?(:update) @default_sampler.update(*args) end |