11use opentelemetry:: global;
22use opentelemetry:: KeyValue ;
33use opentelemetry_sdk:: metrics:: data:: Temporality ;
4- use opentelemetry_sdk:: metrics:: PeriodicReaderWithOwnThread ;
54use opentelemetry_sdk:: metrics:: { PeriodicReader , SdkMeterProvider } ;
65use opentelemetry_sdk:: { runtime, Resource } ;
7- use tracing_subscriber:: fmt;
8- use tracing_subscriber:: layer:: SubscriberExt ;
9- use tracing_subscriber:: util:: SubscriberInitExt ;
10- use tracing_subscriber:: EnvFilter ;
11- use tracing_subscriber:: Layer ;
126use std:: error:: Error ;
13- use std:: time :: Duration ;
7+ use std:: vec ;
148
159fn init_meter_provider ( ) -> opentelemetry_sdk:: metrics:: SdkMeterProvider {
1610 let exporter = opentelemetry_stdout:: MetricExporterBuilder :: default ( )
1711 // Build exporter using Delta Temporality (Defaults to Temporality::Cumulative)
1812 . with_temporality ( Temporality :: Delta )
1913 . build ( ) ;
20- let reader = PeriodicReaderWithOwnThread :: builder ( exporter)
21- . with_interval ( Duration :: from_secs ( 10 ) )
22- . build ( ) ;
14+ let reader = PeriodicReader :: builder ( exporter, runtime:: Tokio ) . build ( ) ;
2315 let provider = SdkMeterProvider :: builder ( )
2416 . with_reader ( reader)
2517 . with_resource ( Resource :: new ( [ KeyValue :: new (
@@ -33,16 +25,24 @@ fn init_meter_provider() -> opentelemetry_sdk::metrics::SdkMeterProvider {
3325
3426#[ tokio:: main]
3527async fn main ( ) -> Result < ( ) , Box < dyn Error + Send + Sync + ' static > > {
36- tracing_subscriber:: registry ( )
37- . with ( fmt:: layer ( ) . with_thread_names ( true ) )
38- . init ( ) ;
39-
4028 // Initialize the MeterProvider with the stdout Exporter.
4129 let meter_provider = init_meter_provider ( ) ;
4230
4331 // Create a meter from the above MeterProvider.
4432 let meter = global:: meter ( "mylibraryname" ) ;
4533
34+ // Create a Counter Instrument.
35+ let counter = meter. u64_counter ( "my_counter" ) . build ( ) ;
36+
37+ // Record measurements using the Counter instrument.
38+ counter. add (
39+ 10 ,
40+ & [
41+ KeyValue :: new ( "mykey1" , "myvalue1" ) ,
42+ KeyValue :: new ( "mykey2" , "myvalue2" ) ,
43+ ] ,
44+ ) ;
45+
4646 // Create a ObservableCounter instrument and register a callback that reports the measurement.
4747 let _observable_counter = meter
4848 . u64_observable_counter ( "my_observable_counter" )
@@ -59,20 +59,84 @@ tracing_subscriber::registry()
5959 } )
6060 . build ( ) ;
6161
62- // Create a Counter Instrument.
63- let counter = meter. u64_counter ( "my_counter ") . build ( ) ;
62+ // Create a UpCounter Instrument.
63+ let updown_counter = meter. i64_up_down_counter ( "my_updown_counter ") . build ( ) ;
6464
65- loop {
66- // Record measurements using the Counter instrument.
67- counter. add (
68- 10 ,
69- & [
70- KeyValue :: new ( "mykey1" , "myvalue1" ) ,
71- KeyValue :: new ( "mykey2" , "myvalue2" ) ,
72- ] ,
73- ) ;
74- tokio:: time:: sleep ( std:: time:: Duration :: from_secs ( 1 ) ) . await ;
75- }
65+ // Record measurements using the UpCounter instrument.
66+ updown_counter. add (
67+ -10 ,
68+ & [
69+ KeyValue :: new ( "mykey1" , "myvalue1" ) ,
70+ KeyValue :: new ( "mykey2" , "myvalue2" ) ,
71+ ] ,
72+ ) ;
73+
74+ // Create a Observable UpDownCounter instrument and register a callback that reports the measurement.
75+ let _observable_up_down_counter = meter
76+ . i64_observable_up_down_counter ( "my_observable_updown_counter" )
77+ . with_description ( "My observable updown counter example description" )
78+ . with_unit ( "myunit" )
79+ . with_callback ( |observer| {
80+ observer. observe (
81+ 100 ,
82+ & [
83+ KeyValue :: new ( "mykey1" , "myvalue1" ) ,
84+ KeyValue :: new ( "mykey2" , "myvalue2" ) ,
85+ ] ,
86+ )
87+ } )
88+ . build ( ) ;
89+
90+ // Create a Histogram Instrument.
91+ let histogram = meter
92+ . f64_histogram ( "my_histogram" )
93+ . with_description ( "My histogram example description" )
94+ // Setting boundaries is optional. By default, the boundaries are set to
95+ // [0.0, 5.0, 10.0, 25.0, 50.0, 75.0, 100.0, 250.0, 500.0, 750.0, 1000.0, 2500.0, 5000.0, 7500.0, 10000.0]
96+ . with_boundaries ( vec ! [ 0.0 , 5.0 , 10.0 , 15.0 , 20.0 , 25.0 ] )
97+ . build ( ) ;
98+
99+ // Record measurements using the histogram instrument.
100+ histogram. record (
101+ 10.5 ,
102+ & [
103+ KeyValue :: new ( "mykey1" , "myvalue1" ) ,
104+ KeyValue :: new ( "mykey2" , "myvalue2" ) ,
105+ ] ,
106+ ) ;
107+
108+ // Note that there is no ObservableHistogram instrument.
109+
110+ // Create a Gauge Instrument.
111+ let gauge = meter
112+ . f64_gauge ( "my_gauge" )
113+ . with_description ( "A gauge set to 1.0" )
114+ . with_unit ( "myunit" )
115+ . build ( ) ;
116+
117+ gauge. record (
118+ 1.0 ,
119+ & [
120+ KeyValue :: new ( "mykey1" , "myvalue1" ) ,
121+ KeyValue :: new ( "mykey2" , "myvalue2" ) ,
122+ ] ,
123+ ) ;
124+
125+ // Create a ObservableGauge instrument and register a callback that reports the measurement.
126+ let _observable_gauge = meter
127+ . f64_observable_gauge ( "my_observable_gauge" )
128+ . with_description ( "An observable gauge set to 1.0" )
129+ . with_unit ( "myunit" )
130+ . with_callback ( |observer| {
131+ observer. observe (
132+ 1.0 ,
133+ & [
134+ KeyValue :: new ( "mykey1" , "myvalue1" ) ,
135+ KeyValue :: new ( "mykey2" , "myvalue2" ) ,
136+ ] ,
137+ )
138+ } )
139+ . build ( ) ;
76140
77141 // Metrics are exported by default every 30 seconds when using stdout exporter,
78142 // however shutting down the MeterProvider here instantly flushes
0 commit comments