1
1
use opentelemetry:: global;
2
2
use opentelemetry:: KeyValue ;
3
3
use opentelemetry_sdk:: metrics:: PeriodicReader ;
4
+ use opentelemetry_sdk:: Resource ;
4
5
use std:: error:: Error ;
5
6
use tracing:: info;
6
7
use tracing_subscriber:: fmt;
@@ -13,6 +14,10 @@ fn init_meter_provider() -> opentelemetry_sdk::metrics::SdkMeterProvider {
13
14
let reader = PeriodicReader :: builder ( exporter, opentelemetry_sdk:: runtime:: Tokio ) . build ( ) ;
14
15
15
16
let provider = opentelemetry_sdk:: metrics:: SdkMeterProvider :: builder ( )
17
+ . with_resource ( Resource :: new ( [ KeyValue :: new (
18
+ "service.name" ,
19
+ "self-diagnostics-example" ,
20
+ ) ] ) )
16
21
. with_reader ( reader)
17
22
. build ( ) ;
18
23
@@ -26,7 +31,7 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
26
31
// OpenTelemetry uses `tracing` crate for its internal logging. Unless a
27
32
// tracing subscriber is set, the logs will be discarded. In this example,
28
33
// we configure a `tracing` subscriber to:
29
- // 1. Print logs of level INFO or higher to stdout using tracing's fmt layer.
34
+ // 1. Print logs of level DEBUG or higher to stdout using tracing's fmt layer.
30
35
// 2. Filter logs from OpenTelemetry's dependencies (like tonic, hyper,
31
36
// reqwest etc. which are commonly used by the OTLP exporter) to only print
32
37
// ERROR-level logs. This filtering helps reduce repetitive log messages
@@ -39,7 +44,7 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
39
44
// Hence, one may use "add_directive("opentelemetry=off".parse().unwrap())"
40
45
// to turn off all logs from OpenTelemetry.
41
46
42
- let filter = EnvFilter :: new ( "info " )
47
+ let filter = EnvFilter :: new ( "debug " )
43
48
. add_directive ( "hyper=error" . parse ( ) . unwrap ( ) )
44
49
. add_directive ( "tonic=error" . parse ( ) . unwrap ( ) )
45
50
. add_directive ( "h2=error" . parse ( ) . unwrap ( ) )
@@ -54,11 +59,14 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
54
59
info ! ( "Starting self-diagnostics example" ) ;
55
60
56
61
let meter = global:: meter ( "example" ) ;
57
- // Create a counter using an invalid name to trigger
58
- // internal log about the same.
59
- let counter = meter. u64_counter ( "my_counter with_space" ) . build ( ) ;
62
+ let counter = meter. u64_counter ( "my_counter" ) . build ( ) ;
60
63
counter. add ( 10 , & [ KeyValue :: new ( "key" , "value" ) ] ) ;
61
64
65
+ let _observable_counter = meter
66
+ . u64_observable_counter ( "my_observable_counter" )
67
+ . with_callback ( |observer| observer. observe ( 10 , & [ KeyValue :: new ( "key" , "value" ) ] ) )
68
+ . build ( ) ;
69
+
62
70
meter_provider. shutdown ( ) ?;
63
71
info ! ( "Shutdown complete. Bye!" ) ;
64
72
Ok ( ( ) )
0 commit comments