By default, Atla Insights instruments and logs all traces. In high-throughput scenarios, you may want to sample traces rather than logging every execution to manage trace limits while maintaining observability.

Built-in Sampling

Use pre-built sampling methods for common scenarios:
from atla_insights import configure
from atla_insights.sampling import TraceRatioSamplingOptions

# Log 20% of traces
sampling_options = TraceRatioSamplingOptions(ratio=0.20)

configure(
    token="<MY_ATLA_INSIGHTS_TOKEN>",
    sampling=sampling_options,
)

Custom Sampling

Implement your own sampling logic using OpenTelemetry samplers:
from atla_insights import configure
from opentelemetry.sdk.trace.sampling import Sampler, SamplingResult, Decision
from opentelemetry.trace import Link
from opentelemetry.util.types import Attributes
from typing import Optional, Sequence

class CustomSampler(Sampler):
    def __init__(self, base_ratio: float = 0.2):
        self.base_ratio = base_ratio
    
    def should_sample(
        self,
        parent_context,
        trace_id: int,
        name: str,
        kind,
        attributes: Optional[Attributes] = None,
        links: Optional[Sequence[Link]] = None,
        trace_state=None,
    ) -> SamplingResult:
        # Sample all error traces
        if attributes and attributes.get("error", False):
            return SamplingResult(Decision.RECORD_AND_SAMPLE)
        
        # Sample all user-facing interactions
        if attributes and attributes.get("user_facing", False):
            return SamplingResult(Decision.RECORD_AND_SAMPLE)
        
        # For other traces, use base sampling ratio
        if (trace_id % 100) < (self.base_ratio * 100):
            return SamplingResult(Decision.RECORD_AND_SAMPLE)
        
        return SamplingResult(Decision.NOT_RECORD)

my_sampler = CustomSampler(base_ratio=0.05)

configure(
    token="<MY_ATLA_INSIGHTS_TOKEN>",
    sampling=my_sampler,
)
The Atla Insights platform is not intended to work well with partial traces. We highly recommend using either ParentBased or StaticSampler samplers to ensure consistent trace handling.

ParentBased Sampling

Ensures all spans in the same trace are treated consistently:
from atla_insights import configure
from opentelemetry.sdk.trace.sampling import ParentBased, TraceIdRatioBasedSampler

# All spans in a trace will have the same sampling decision
sampler = ParentBased(root=TraceIdRatioBasedSampler(0.1))

configure(
    token="<MY_ATLA_INSIGHTS_TOKEN>",
    sampling=sampler,
)