Skip to content

Commit cf8a18b

Browse files
authored
fix: Optimize span and trace ID generation (#1521)
1 parent a5ed0b4 commit cf8a18b

File tree

2 files changed

+54
-8
lines changed

2 files changed

+54
-8
lines changed
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# frozen_string_literal: true
2+
3+
# Copyright The OpenTelemetry Authors
4+
#
5+
# SPDX-License-Identifier: Apache-2.0
6+
7+
require 'benchmark/ipsa'
8+
9+
INVALID_SPAN_ID = ("\0" * 8).b
10+
INVALID_TRACE_ID = ("\0" * 16).b
11+
12+
def generate_trace_id
13+
loop do
14+
id = Random.bytes(16)
15+
return id unless id == INVALID_TRACE_ID
16+
end
17+
end
18+
19+
def generate_trace_id_while
20+
id = Random.bytes(16)
21+
id = Random.bytes(16) while id == INVALID_TRACE_ID
22+
id
23+
end
24+
25+
def generate_span_id
26+
loop do
27+
id = Random.bytes(8)
28+
return id unless id == INVALID_SPAN_ID
29+
end
30+
end
31+
32+
def generate_span_id_while
33+
id = Random.bytes(8)
34+
id = Random.bytes(8) while id == INVALID_SPAN_ID
35+
id
36+
end
37+
38+
Benchmark.ipsa do |x|
39+
x.report('generate_trace_id') { generate_trace_id }
40+
x.report('generate_trace_id_while') { generate_trace_id_while }
41+
x.compare!
42+
end
43+
44+
Benchmark.ipsa do |x|
45+
x.report('generate_span_id') { generate_span_id }
46+
x.report('generate_span_id_while') { generate_span_id_while }
47+
x.compare!
48+
end

api/lib/opentelemetry/trace.rb

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,21 +26,19 @@ module Trace
2626
#
2727
# @return [String] a valid trace ID.
2828
def generate_trace_id
29-
loop do
30-
id = Random.bytes(16)
31-
return id unless id == INVALID_TRACE_ID
32-
end
29+
id = Random.bytes(16)
30+
id = Random.bytes(16) while id == INVALID_TRACE_ID
31+
id
3332
end
3433

3534
# Generates a valid span identifier, an 8-byte string with at least one
3635
# non-zero byte.
3736
#
3837
# @return [String] a valid span ID.
3938
def generate_span_id
40-
loop do
41-
id = Random.bytes(8)
42-
return id unless id == INVALID_SPAN_ID
43-
end
39+
id = Random.bytes(8)
40+
id = Random.bytes(8) while id == INVALID_SPAN_ID
41+
id
4442
end
4543

4644
# Returns the current span from the current or provided context

0 commit comments

Comments
 (0)