Skip to content

Commit 7e9ab8c

Browse files
ndkstoewer
andauthored
Protect shared global Rand with a mutex to avoid out-of-range panic (#32)
Co-authored-by: A. Stoewer <[email protected]>
1 parent 890cbb3 commit 7e9ab8c

File tree

2 files changed

+23
-5
lines changed

2 files changed

+23
-5
lines changed

pkg/random/random.go

+21-3
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"math/big"
77
"math/rand"
88
"net/http"
9+
"sync"
910
"time"
1011

1112
"go.opentelemetry.io/collector/pdata/pcommon"
@@ -24,19 +25,24 @@ var (
2425
"order", "payment", "customer", "product", "stock", "inventory",
2526
"shipping", "billing", "checkout", "cart", "search", "analytics"}
2627

27-
rnd *rand.Rand
28+
rnd *rand.Rand
29+
randMtx = sync.Mutex{}
2830
)
2931

3032
func init() {
3133
seed, _ := crand.Int(crand.Reader, big.NewInt(int64(^uint64(0)>>1)))
3234
rnd = rand.New(rand.NewSource(seed.Int64()))
3335
}
3436

35-
func Rand() *rand.Rand {
36-
return rnd
37+
func Float32() float32 {
38+
randMtx.Lock()
39+
defer randMtx.Unlock()
40+
return rnd.Float32()
3741
}
3842

3943
func SelectElement[T any](elements []T) T {
44+
randMtx.Lock()
45+
defer randMtx.Unlock()
4046
return elements[rnd.Intn(len(elements))]
4147
}
4248

@@ -53,16 +59,22 @@ func K6String(n int) string {
5359
}
5460

5561
func IntBetween(min, max int) int {
62+
randMtx.Lock()
63+
defer randMtx.Unlock()
5664
n := rnd.Intn(max - min)
5765
return min + n
5866
}
5967

6068
func Duration(min, max time.Duration) time.Duration {
69+
randMtx.Lock()
70+
defer randMtx.Unlock()
6171
n := rnd.Int63n(int64(max) - int64(min))
6272
return min + time.Duration(n)
6373
}
6474

6575
func IPAddr() string {
76+
randMtx.Lock()
77+
defer randMtx.Unlock()
6678
return fmt.Sprintf("192.168.%d.%d", rnd.Intn(255), rnd.Intn(255))
6779
}
6880

@@ -115,12 +127,18 @@ func OperationForResource(resource string) string {
115127
}
116128

117129
func TraceID() pcommon.TraceID {
130+
randMtx.Lock()
131+
defer randMtx.Unlock()
132+
118133
var b [16]byte
119134
_, _ = rnd.Read(b[:]) // always returns nil error
120135
return b
121136
}
122137

123138
func SpanID() pcommon.SpanID {
139+
randMtx.Lock()
140+
defer randMtx.Unlock()
141+
124142
var b [8]byte
125143
_, _ = rnd.Read(b[:]) // always returns nil error
126144
return b

pkg/tracegen/templated.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ func (g *TemplatedGenerator) generateSpan(scopeSpans ptrace.ScopeSpans, tmpl *in
300300

301301
span.Events().EnsureCapacity(len(tmpl.events))
302302
for _, e := range tmpl.events {
303-
if e.rate > 0 && random.Rand().Float32() > e.rate {
303+
if e.rate > 0 && random.Float32() > e.rate {
304304
continue
305305
}
306306
if e.exceptionOnError && !hasError {
@@ -325,7 +325,7 @@ func (g *TemplatedGenerator) generateSpan(scopeSpans ptrace.ScopeSpans, tmpl *in
325325
// generate links
326326
span.Links().EnsureCapacity(len(tmpl.links))
327327
for _, l := range tmpl.links {
328-
if l.rate > 0 && random.Rand().Float32() > l.rate {
328+
if l.rate > 0 && random.Float32() > l.rate {
329329
continue
330330
}
331331

0 commit comments

Comments
 (0)