...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package trace
16
17 import (
18 "encoding/binary"
19 )
20
21 const defaultSamplingProbability = 1e-4
22
23
24 type Sampler func(SamplingParameters) SamplingDecision
25
26
27 type SamplingParameters struct {
28 ParentContext SpanContext
29 TraceID TraceID
30 SpanID SpanID
31 Name string
32 HasRemoteParent bool
33 }
34
35
36 type SamplingDecision struct {
37 Sample bool
38 }
39
40
41
42
43 func ProbabilitySampler(fraction float64) Sampler {
44 if !(fraction >= 0) {
45 fraction = 0
46 } else if fraction >= 1 {
47 return AlwaysSample()
48 }
49
50 traceIDUpperBound := uint64(fraction * (1 << 63))
51 return Sampler(func(p SamplingParameters) SamplingDecision {
52 if p.ParentContext.IsSampled() {
53 return SamplingDecision{Sample: true}
54 }
55 x := binary.BigEndian.Uint64(p.TraceID[0:8]) >> 1
56 return SamplingDecision{Sample: x < traceIDUpperBound}
57 })
58 }
59
60
61
62
63
64 func AlwaysSample() Sampler {
65 return func(p SamplingParameters) SamplingDecision {
66 return SamplingDecision{Sample: true}
67 }
68 }
69
70
71 func NeverSample() Sampler {
72 return func(p SamplingParameters) SamplingDecision {
73 return SamplingDecision{Sample: false}
74 }
75 }
76
View as plain text