@@ -1469,8 +1469,14 @@ pub struct OpenTelemetryMetricsConfig {
1469
1469
pub endpoint : * const c_char ,
1470
1470
}
1471
1471
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.
1472
1476
#[ 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 {
1474
1480
// At least one of traces or metrics must be provided
1475
1481
if !open_telemetry_config. has_traces && !open_telemetry_config. has_metrics {
1476
1482
let error_msg =
@@ -1540,21 +1546,29 @@ pub extern "C" fn init_open_telemetry(open_telemetry_config: OpenTelemetryConfig
1540
1546
config = config. with_flush_interval ( std:: time:: Duration :: from_millis ( flush_interval_ms as u64 ) ) ;
1541
1547
1542
1548
// 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
+ }
1551
1560
}
1561
+ Err ( e) => CString :: new ( e)
1562
+ . unwrap_or_else ( |_| CString :: new ( "Unknown error occurred" ) . unwrap ( ) )
1563
+ . into_raw ( ) ,
1552
1564
}
1553
1565
}
1554
1566
1555
- fn ensure_tokio_runtime ( ) -> & ' static Runtime {
1567
+ fn ensure_tokio_runtime ( ) -> Result < & ' static Runtime , String > {
1556
1568
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
+ } ) )
1558
1572
}
1559
1573
1560
1574
/// This function converts a raw pointer to a GlideSpan into a safe Rust reference.
0 commit comments