@@ -59,12 +59,9 @@ fn init_logs() -> SdkLoggerProvider {
5959 . build ( )
6060}
6161
62- // #[tokio::main]
63- fn main ( ) -> Result < ( ) , Box < dyn Error + Send + Sync + ' static > > {
64- let rt = tokio:: runtime:: Runtime :: new ( ) ?;
65- let logger_provider = rt. block_on ( async {
66- init_logs ( )
67- } ) ;
62+ #[ tokio:: main]
63+ async fn main ( ) -> Result < ( ) , Box < dyn Error + Send + Sync + ' static > > {
64+ let logger_provider = init_logs ( ) ;
6865
6966 // Create a new OpenTelemetryTracingBridge using the above LoggerProvider.
7067 let otel_layer = OpenTelemetryTracingBridge :: new ( & logger_provider) ;
@@ -101,8 +98,67 @@ fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
10198 . with ( otel_layer)
10299 . with ( fmt_layer)
103100 . init ( ) ;
101+
102+ // At this point Logs (OTel Logs and Fmt Logs) are initialized, which will
103+ // allow internal-logs from Tracing/Metrics initializer to be captured.
104+
105+ let tracer_provider = init_traces ( ) ;
106+ // Set the global tracer provider using a clone of the tracer_provider.
107+ // Setting global tracer provider is required if other parts of the application
108+ // uses global::tracer() or global::tracer_with_version() to get a tracer.
109+ // Cloning simply creates a new reference to the same tracer provider. It is
110+ // important to hold on to the tracer_provider here, so as to invoke
111+ // shutdown on it when application ends.
112+ global:: set_tracer_provider ( tracer_provider. clone ( ) ) ;
113+
114+ let meter_provider = init_metrics ( ) ;
115+ // Set the global meter provider using a clone of the meter_provider.
116+ // Setting global meter provider is required if other parts of the application
117+ // uses global::meter() or global::meter_with_version() to get a meter.
118+ // Cloning simply creates a new reference to the same meter provider. It is
119+ // important to hold on to the meter_provider here, so as to invoke
120+ // shutdown on it when application ends.
121+ global:: set_meter_provider ( meter_provider. clone ( ) ) ;
122+
123+ let common_scope_attributes = vec ! [ KeyValue :: new( "scope-key" , "scope-value" ) ] ;
124+ let scope = InstrumentationScope :: builder ( "basic" )
125+ . with_version ( "1.0" )
126+ . with_attributes ( common_scope_attributes)
127+ . build ( ) ;
128+
129+ let tracer = global:: tracer_with_scope ( scope. clone ( ) ) ;
130+ let meter = global:: meter_with_scope ( scope) ;
131+
132+ let counter = meter
133+ . u64_counter ( "test_counter" )
134+ . with_description ( "a simple counter for demo purposes." )
135+ . with_unit ( "my_unit" )
136+ . build ( ) ;
137+ for _ in 0 ..10 {
138+ counter. add ( 1 , & [ KeyValue :: new ( "test_key" , "test_value" ) ] ) ;
139+ }
140+
141+ tracer. in_span ( "Main operation" , |cx| {
142+ let span = cx. span ( ) ;
143+ span. add_event (
144+ "Nice operation!" . to_string ( ) ,
145+ vec ! [ KeyValue :: new( "bogons" , 100 ) ] ,
146+ ) ;
147+ span. set_attribute ( KeyValue :: new ( "another.key" , "yes" ) ) ;
148+
149+ info ! ( name: "my-event-inside-span" , target: "my-target" , "hello from {}. My price is {}. I am also inside a Span!" , "banana" , 2.99 ) ;
150+
151+ tracer. in_span ( "Sub operation..." , |cx| {
152+ let span = cx. span ( ) ;
153+ span. set_attribute ( KeyValue :: new ( "another.key" , "yes" ) ) ;
154+ span. add_event ( "Sub span event" , vec ! [ ] ) ;
155+ } ) ;
156+ } ) ;
157+
104158 info ! ( name: "my-event" , target: "my-target" , "hello from {}. My price is {}" , "apple" , 1.99 ) ;
159+ tracer_provider. shutdown ( ) ?;
160+ meter_provider. shutdown ( ) ?;
105161 logger_provider. shutdown ( ) ?;
106162
107163 Ok ( ( ) )
108- }
164+ }
0 commit comments