// Copyright (c) 2019 Uber Technologies, Inc. // // 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. package jaeger // SamplingDecision is returned by the V2 samplers. type SamplingDecision struct { Sample bool Retryable bool Tags []Tag } // SamplerV2 is an extension of the V1 samplers that allows sampling decisions // be made at different points of the span lifecycle. type SamplerV2 interface { OnCreateSpan(span *Span) SamplingDecision OnSetOperationName(span *Span, operationName string) SamplingDecision OnSetTag(span *Span, key string, value interface{}) SamplingDecision OnFinishSpan(span *Span) SamplingDecision // Close does a clean shutdown of the sampler, stopping any background // go-routines it may have started. Close() } // samplerV1toV2 wraps legacy V1 sampler into an adapter that make it look like V2. func samplerV1toV2(s Sampler) SamplerV2 { if s2, ok := s.(SamplerV2); ok { return s2 } type legacySamplerV1toV2Adapter struct { legacySamplerV1Base } return &legacySamplerV1toV2Adapter{ legacySamplerV1Base: legacySamplerV1Base{ delegate: s.IsSampled, }, } } // SamplerV2Base can be used by V2 samplers to implement dummy V1 methods. // Supporting V1 API is required because Tracer configuration only accepts V1 Sampler // for backwards compatibility reasons. // TODO (breaking change) remove this in the next major release type SamplerV2Base struct{} // IsSampled implements IsSampled of Sampler. func (SamplerV2Base) IsSampled(id TraceID, operation string) (sampled bool, tags []Tag) { return false, nil } // Close implements Close of Sampler. func (SamplerV2Base) Close() {} // Equal implements Equal of Sampler. func (SamplerV2Base) Equal(other Sampler) bool { return false } // legacySamplerV1Base is used as a base for simple samplers that only implement // the legacy isSampled() function that is not sensitive to its arguments. type legacySamplerV1Base struct { delegate func(id TraceID, operation string) (sampled bool, tags []Tag) } func (s *legacySamplerV1Base) OnCreateSpan(span *Span) SamplingDecision { isSampled, tags := s.delegate(span.context.traceID, span.operationName) return SamplingDecision{Sample: isSampled, Retryable: false, Tags: tags} } func (s *legacySamplerV1Base) OnSetOperationName(span *Span, operationName string) SamplingDecision { isSampled, tags := s.delegate(span.context.traceID, span.operationName) return SamplingDecision{Sample: isSampled, Retryable: false, Tags: tags} } func (s *legacySamplerV1Base) OnSetTag(span *Span, key string, value interface{}) SamplingDecision { return SamplingDecision{Sample: false, Retryable: true} } func (s *legacySamplerV1Base) OnFinishSpan(span *Span) SamplingDecision { return SamplingDecision{Sample: false, Retryable: true} } func (s *legacySamplerV1Base) Close() {}