123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- // 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() {}
|