Skip to content

Commit e39135a

Browse files
committed
address comments
Signed-off-by: TJ Zhang <[email protected]>
1 parent bef447c commit e39135a

File tree

3 files changed

+32
-12
lines changed

3 files changed

+32
-12
lines changed

ffi/src/lib.rs

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1469,8 +1469,14 @@ pub struct OpenTelemetryMetricsConfig {
14691469
pub endpoint: *const c_char,
14701470
}
14711471

1472+
/// Initializes OpenTelemetry with the given configuration.
1473+
///
1474+
/// # Safety
1475+
/// * `open_telemetry_config` and its underlying traces and metrics pointers must be valid until the function returns.
14721476
#[unsafe(no_mangle)]
1473-
pub extern "C" fn init_open_telemetry(open_telemetry_config: OpenTelemetryConfig) -> *const c_char {
1477+
pub unsafe extern "C" fn init_open_telemetry(
1478+
open_telemetry_config: OpenTelemetryConfig,
1479+
) -> *const c_char {
14741480
// At least one of traces or metrics must be provided
14751481
if !open_telemetry_config.has_traces && !open_telemetry_config.has_metrics {
14761482
let error_msg =
@@ -1540,21 +1546,29 @@ pub extern "C" fn init_open_telemetry(open_telemetry_config: OpenTelemetryConfig
15401546
config = config.with_flush_interval(std::time::Duration::from_millis(flush_interval_ms as u64));
15411547

15421548
// Initialize OpenTelemetry synchronously
1543-
match ensure_tokio_runtime().block_on(async { GlideOpenTelemetry::initialise(config.build()) })
1544-
{
1545-
Ok(_) => std::ptr::null(), // Success
1546-
Err(e) => {
1547-
let error_msg = format!("Failed to initialize OpenTelemetry: {}", e);
1548-
CString::new(error_msg)
1549-
.unwrap_or_else(|_| CString::new("Unknown error occurred").unwrap())
1550-
.into_raw()
1549+
match ensure_tokio_runtime() {
1550+
Ok(runtime) => {
1551+
match runtime.block_on(async { GlideOpenTelemetry::initialise(config.build()) }) {
1552+
Ok(_) => std::ptr::null(), // Success
1553+
Err(e) => {
1554+
let error_msg = format!("Failed to initialize OpenTelemetry: {}", e);
1555+
CString::new(error_msg)
1556+
.unwrap_or_else(|_| CString::new("Unknown error occurred").unwrap())
1557+
.into_raw()
1558+
}
1559+
}
15511560
}
1561+
Err(e) => CString::new(e)
1562+
.unwrap_or_else(|_| CString::new("Unknown error occurred").unwrap())
1563+
.into_raw(),
15521564
}
15531565
}
15541566

1555-
fn ensure_tokio_runtime() -> &'static Runtime {
1567+
fn ensure_tokio_runtime() -> Result<&'static Runtime, String> {
15561568
static TOKIO: OnceLock<Runtime> = OnceLock::new();
1557-
TOKIO.get_or_init(|| Runtime::new().expect("Failed to create Tokio runtime"))
1569+
Ok(TOKIO.get_or_init(|| {
1570+
Runtime::new().unwrap_or_else(|err| panic!("Failed to create Tokio runtime: {}", err))
1571+
}))
15581572
}
15591573

15601574
/// This function converts a raw pointer to a GlideSpan into a safe Rust reference.

go/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ long-timeout-test: export TEST_FILTER = -skip "TestGlideTestSuite/TestModule|Ope
168168
long-timeout-test: __it
169169

170170
# opentelemetry tests - run subtask with the opentelemetry flag enabled
171-
opentelemetry-test: export TEST_FILTER = -skip TestGlideTestSuite/TestModule -otel-test $(if $(test-filter), -testify.m $(test-filter))
171+
opentelemetry-test: export TEST_FILTER = -skip TestGlideTestSuite -otel-test -testify.m TestOpenTelemetry
172172
opentelemetry-test: __it
173173

174174
__it:

go/opentelemetry.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import "C"
1212
import (
1313
"crypto/rand"
1414
"fmt"
15+
"log"
1516
"math/big"
1617
"unsafe"
1718
)
@@ -133,8 +134,13 @@ func (o *OpenTelemetry) GetSamplePercentage() int32 {
133134
// Uses the configured sample percentage to randomly decide whether to create a span for this request.
134135
func (o *OpenTelemetry) ShouldSample() bool {
135136
percentage := o.GetSamplePercentage()
137+
if !o.IsInitialized() || percentage <= 0 {
138+
return false
139+
}
140+
136141
currentRandom, err := rand.Int(rand.Reader, big.NewInt(100))
137142
if err != nil {
143+
log.Printf("Not sampling otel span due to failure to generate random number: %v", err)
138144
return false
139145
}
140146
return o.IsInitialized() && percentage > 0 && float32(currentRandom.Int64()) < float32(percentage)

0 commit comments

Comments
 (0)