@@ -4,6 +4,8 @@ use opentelemetry_sdk::metrics::{ManualReader, SdkMeterProvider};
44use std:: env:: args;
55use std:: fmt:: Debug ;
66use std:: str:: FromStr ;
7+ use std:: sync:: Arc ;
8+ use std:: sync:: atomic:: { AtomicBool , Ordering } ;
79use std:: thread:: { spawn, JoinHandle } ;
810use std:: time:: { Duration , Instant } ;
911
@@ -13,19 +15,27 @@ const RUN_TIME: Duration = Duration::from_secs(120);
1315
1416fn main ( ) {
1517 let mode: Mode = args ( ) . nth ( 1 ) . unwrap_or ( "shared" . to_string ( ) ) . parse ( ) . unwrap ( ) ;
18+ let exit_signal = Arc :: new ( AtomicBool :: new ( false ) ) ;
1619
1720 println ! ( "Running with mode: {:?}, Duration: {}s, Threads: {}" , mode, RUN_TIME . as_secs( ) , NUM_THREADS ) ;
1821
1922 let handles: Vec < JoinHandle < _ > > = match mode {
2023 Mode :: Shared => {
2124 let provider = create_meter_provider ( ) ;
22- ( 0 ..NUM_THREADS ) . map ( move |_|start_work ( provider. clone ( ) ) ) . collect ( )
25+ let signal = Arc :: clone ( & exit_signal) ;
26+ ( 0 ..NUM_THREADS ) . map ( move |_|start_work ( provider. clone ( ) , signal. clone ( ) ) ) . collect ( )
2327 }
2428 Mode :: PerThread => {
25- ( 0 ..NUM_THREADS ) . map ( move |_|start_work ( create_meter_provider ( ) ) ) . collect ( )
29+ let signal = Arc :: clone ( & exit_signal) ;
30+ ( 0 ..NUM_THREADS ) . map ( move |_|start_work ( create_meter_provider ( ) , signal. clone ( ) ) ) . collect ( )
2631 }
2732 } ;
2833
34+ _ = spawn ( move || {
35+ std:: thread:: sleep ( RUN_TIME ) ;
36+ exit_signal. store ( true , Ordering :: Relaxed ) ;
37+ } ) ;
38+
2939 let sum = handles
3040 . into_iter ( )
3141 . map ( |h| h. join ( ) . unwrap ( ) )
@@ -34,29 +44,17 @@ fn main() {
3444 println ! ( "Reported Metrics: {} millions" , ( sum / 1_000_000 ) ) ;
3545}
3646
37- fn start_work ( meter_provider : SdkMeterProvider ) -> JoinHandle < usize > {
47+ fn start_work ( meter_provider : SdkMeterProvider , exit_signal : Arc < AtomicBool > ) -> JoinHandle < usize > {
3848 let histogram = meter_provider. meter ( "dummy" ) . f64_histogram ( "histogram" ) . build ( ) ;
3949 spawn ( move || {
4050 let mut count = 0_usize ;
4151 let now = Instant :: now ( ) ;
4252
4353 loop {
44- histogram. record (
45- 10.5 ,
46- & [
47- KeyValue :: new ( "mykey1" , "myvalue1" ) ,
48- KeyValue :: new ( "mykey2" , "myvalue2" ) ,
49- KeyValue :: new ( "mykey3" , "myvalue3" ) ,
50- KeyValue :: new ( "mykey4" , "myvalue4" ) ,
51- KeyValue :: new ( "mykey5" , "myvalue5" ) ,
52- KeyValue :: new ( "mykey6" , "myvalue6" ) ,
53- KeyValue :: new ( "mykey7" , "myvalue7" ) ,
54- ] ,
55- ) ;
56-
54+ histogram. record ( 10.5 , & [ ] ) ;
5755 count = count. checked_add ( 1 ) . unwrap ( ) ;
5856
59- if now . elapsed ( ) > RUN_TIME {
57+ if exit_signal . load ( Ordering :: Relaxed ) {
6058 break ;
6159 }
6260 }
0 commit comments