Source code for opencensus.trace.samplers
# Copyright 2017, OpenCensus Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
DEFAULT_SAMPLING_RATE = 1e-4
[docs]class Sampler(object):
"""Base class for opencensus trace request samplers.
Subclasses must override :meth:`should_sample`.
"""
[docs] def should_sample(self, span_context):
"""Whether to sample this request.
:type span_context: :class:`opencensus.trace.span_context.SpanContext`
:param span_context: The span context.
:rtype: bool
:returns: Whether to sample the request according to the context.
"""
raise NotImplementedError
[docs]class AlwaysOnSampler(Sampler):
"""Sampler that samples every request, regardless of trace options."""
[docs] def should_sample(self, span_context):
return True
[docs]class AlwaysOffSampler(Sampler):
"""Sampler that doesn't sample any request, regardless of trace options."""
[docs] def should_sample(self, span_context):
return False
[docs]class ProbabilitySampler(Sampler):
"""Sample a request at a fixed rate.
:type rate: float
:param rate: The rate of sampling.
"""
def __init__(self, rate=None):
if rate is None:
rate = DEFAULT_SAMPLING_RATE
if not 0 <= rate <= 1:
raise ValueError('Rate must between 0 and 1.')
self.rate = rate
[docs] def should_sample(self, span_context):
"""Make the sampling decision based on the lower 8 bytes of the trace
ID. If the value is less than the bound, return True, else False.
:type span_context: :class:`opencensus.trace.span_context.SpanContext`
:param span_context: The span context.
:rtype: bool
:returns: Whether to sample the request according to the context.
"""
if span_context.trace_options.get_enabled():
return True
lower_long = get_lower_long_from_trace_id(span_context.trace_id)
bound = self.rate * 0xffffffffffffffff
return lower_long <= bound
[docs]def get_lower_long_from_trace_id(trace_id):
"""Returns the lower 8 bytes of the trace ID as a long value, assuming
little endian order.
:rtype: long
:returns: Lower 8 bytes of trace ID
"""
lower_bytes = trace_id[16:]
lower_long = int(lower_bytes, 16)
return lower_long