From cf8a18b359ebcea7905a28a26120289cfa2ad834 Mon Sep 17 00:00:00 2001 From: Francis Bogsanyi Date: Wed, 13 Sep 2023 17:15:47 -0400 Subject: [PATCH] fix: Optimize span and trace ID generation (#1521) --- api/benchmarks/id_generation_bench.rb | 48 +++++++++++++++++++++++++++ api/lib/opentelemetry/trace.rb | 14 ++++---- 2 files changed, 54 insertions(+), 8 deletions(-) create mode 100644 api/benchmarks/id_generation_bench.rb diff --git a/api/benchmarks/id_generation_bench.rb b/api/benchmarks/id_generation_bench.rb new file mode 100644 index 0000000000..83808a28aa --- /dev/null +++ b/api/benchmarks/id_generation_bench.rb @@ -0,0 +1,48 @@ +# frozen_string_literal: true + +# Copyright The OpenTelemetry Authors +# +# SPDX-License-Identifier: Apache-2.0 + +require 'benchmark/ipsa' + +INVALID_SPAN_ID = ("\0" * 8).b +INVALID_TRACE_ID = ("\0" * 16).b + +def generate_trace_id + loop do + id = Random.bytes(16) + return id unless id == INVALID_TRACE_ID + end +end + +def generate_trace_id_while + id = Random.bytes(16) + id = Random.bytes(16) while id == INVALID_TRACE_ID + id +end + +def generate_span_id + loop do + id = Random.bytes(8) + return id unless id == INVALID_SPAN_ID + end +end + +def generate_span_id_while + id = Random.bytes(8) + id = Random.bytes(8) while id == INVALID_SPAN_ID + id +end + +Benchmark.ipsa do |x| + x.report('generate_trace_id') { generate_trace_id } + x.report('generate_trace_id_while') { generate_trace_id_while } + x.compare! +end + +Benchmark.ipsa do |x| + x.report('generate_span_id') { generate_span_id } + x.report('generate_span_id_while') { generate_span_id_while } + x.compare! +end diff --git a/api/lib/opentelemetry/trace.rb b/api/lib/opentelemetry/trace.rb index 0ed218309f..34cfc31cd6 100644 --- a/api/lib/opentelemetry/trace.rb +++ b/api/lib/opentelemetry/trace.rb @@ -26,10 +26,9 @@ module Trace # # @return [String] a valid trace ID. def generate_trace_id - loop do - id = Random.bytes(16) - return id unless id == INVALID_TRACE_ID - end + id = Random.bytes(16) + id = Random.bytes(16) while id == INVALID_TRACE_ID + id end # Generates a valid span identifier, an 8-byte string with at least one @@ -37,10 +36,9 @@ def generate_trace_id # # @return [String] a valid span ID. def generate_span_id - loop do - id = Random.bytes(8) - return id unless id == INVALID_SPAN_ID - end + id = Random.bytes(8) + id = Random.bytes(8) while id == INVALID_SPAN_ID + id end # Returns the current span from the current or provided context