@@ -27,6 +27,12 @@ def sample(self, span):
2727 pass
2828
2929
30+ class BasePrioritySampler (six .with_metaclass (abc .ABCMeta )):
31+ @abc .abstractmethod
32+ def update_rate_by_service_sample_rates (self , sample_rates ):
33+ pass
34+
35+
3036class AllSampler (BaseSampler ):
3137 """Sampler sampling all the traces"""
3238
@@ -60,7 +66,7 @@ def sample(self, span):
6066 return ((span .trace_id * KNUTH_FACTOR ) % MAX_TRACE_ID ) <= self .sampling_id_threshold
6167
6268
63- class RateByServiceSampler (BaseSampler ):
69+ class RateByServiceSampler (BaseSampler , BasePrioritySampler ):
6470 """Sampler based on a rate, by service
6571
6672 Keep (100 * `sample_rate`)% of the traces.
@@ -97,7 +103,7 @@ def sample(self, span):
97103 span .set_metric (SAMPLING_AGENT_DECISION , sampler .sample_rate )
98104 return sampler .sample (span )
99105
100- def set_sample_rate_by_service (self , rate_by_service ):
106+ def update_rate_by_service_sample_rates (self , rate_by_service ):
101107 new_by_service_samplers = self ._get_new_by_service_sampler ()
102108 for key , sample_rate in iteritems (rate_by_service ):
103109 new_by_service_samplers [key ] = RateSampler (sample_rate )
@@ -109,30 +115,41 @@ def set_sample_rate_by_service(self, rate_by_service):
109115RateByServiceSampler ._default_key = RateByServiceSampler ._key ()
110116
111117
112- class DatadogSampler (BaseSampler ):
118+ class DatadogSampler (BaseSampler , BasePrioritySampler ):
113119 """
114120 This sampler is currently in ALPHA and it's API may change at any time, use at your own risk.
115121 """
116122 __slots__ = ('default_sampler' , 'limiter' , 'rules' )
117123
118124 NO_RATE_LIMIT = - 1
119125 DEFAULT_RATE_LIMIT = 100
120- DEFAULT_SAMPLE_RATE = 1.0
126+ DEFAULT_SAMPLE_RATE = None
121127
122128 def __init__ (self , rules = None , default_sample_rate = None , rate_limit = None ):
123129 """
124130 Constructor for DatadogSampler sampler
125131
126132 :param rules: List of :class:`SamplingRule` rules to apply to the root span of every trace, default no rules
127133 :type rules: :obj:`list` of :class:`SamplingRule`
128- :param default_sample_rate: The default sample rate to apply if no rules matched (default: 1.0)
134+ :param default_sample_rate: The default sample rate to apply if no rules matched (default: ``None`` /
135+ Use :class:`RateByServiceSampler` only)
129136 :type default_sample_rate: float 0 <= X <= 1.0
130137 :param rate_limit: Global rate limit (traces per second) to apply to all traces regardless of the rules
131138 applied to them, (default: ``100``)
132139 :type rate_limit: :obj:`int`
133140 """
134141 if default_sample_rate is None :
135- default_sample_rate = float (get_env ('trace' , 'sample_rate' , default = self .DEFAULT_SAMPLE_RATE ))
142+ # If no sample rate was provided explicitly in code, try to load from environment variable
143+ sample_rate = get_env ('trace' , 'sample_rate' , default = self .DEFAULT_SAMPLE_RATE )
144+
145+ # If no env variable was found, just use the default
146+ if sample_rate is None :
147+ default_sample_rate = self .DEFAULT_SAMPLE_RATE
148+
149+ # Otherwise, try to convert it to a float
150+ else :
151+ default_sample_rate = float (sample_rate )
152+
136153 if rate_limit is None :
137154 rate_limit = int (get_env ('trace' , 'rate_limit' , default = self .DEFAULT_RATE_LIMIT ))
138155
@@ -148,7 +165,16 @@ def __init__(self, rules=None, default_sample_rate=None, rate_limit=None):
148165
149166 # Configure rate limiter
150167 self .limiter = RateLimiter (rate_limit )
151- self .default_sampler = SamplingRule (sample_rate = default_sample_rate )
168+
169+ # Default to previous default behavior of RateByServiceSampler
170+ self .default_sampler = RateByServiceSampler ()
171+ if default_sample_rate is not None :
172+ self .default_sampler = SamplingRule (sample_rate = default_sample_rate )
173+
174+ def update_rate_by_service_sample_rates (self , sample_rates ):
175+ # Pass through the call to our RateByServiceSampler
176+ if isinstance (self .default_sampler , RateByServiceSampler ):
177+ self .default_sampler .update_rate_by_service_sample_rates (sample_rates )
152178
153179 def _set_priority (self , span , priority ):
154180 if span ._context :
@@ -175,7 +201,16 @@ def sample(self, span):
175201 matching_rule = rule
176202 break
177203 else :
178- # No rule matches, use the default sampler
204+ # If this is the old sampler, sample and return
205+ if isinstance (self .default_sampler , RateByServiceSampler ):
206+ if self .default_sampler .sample (span ):
207+ self ._set_priority (span , AUTO_KEEP )
208+ return True
209+ else :
210+ self ._set_priority (span , AUTO_REJECT )
211+ return False
212+
213+ # If no rules match, use our defualt sampler
179214 matching_rule = self .default_sampler
180215
181216 # Sample with the matching sampling rule
@@ -202,7 +237,7 @@ def sample(self, span):
202237 return True
203238
204239
205- class SamplingRule (object ):
240+ class SamplingRule (BaseSampler ):
206241 """
207242 Definition of a sampling rule used by :class:`DatadogSampler` for applying a sample rate on a span
208243 """
0 commit comments