1
+ use log:: { info, Level } ;
1
2
use once_cell:: sync:: Lazy ;
2
3
use opentelemetry_api:: global;
3
- use opentelemetry_api:: global:: shutdown_tracer_provider;
4
+ use opentelemetry_api:: global:: {
5
+ logger_provider, shutdown_logger_provider, shutdown_tracer_provider,
6
+ } ;
7
+ use opentelemetry_api:: logs:: LogError ;
4
8
use opentelemetry_api:: trace:: TraceError ;
5
9
use opentelemetry_api:: {
6
10
metrics,
7
11
trace:: { TraceContextExt , Tracer } ,
8
12
Key , KeyValue ,
9
13
} ;
14
+ use opentelemetry_appender_log:: OpenTelemetryLogBridge ;
10
15
use opentelemetry_otlp:: { ExportConfig , WithExportConfig } ;
16
+ use opentelemetry_sdk:: logs:: Config ;
11
17
use opentelemetry_sdk:: { metrics:: MeterProvider , runtime, trace as sdktrace, Resource } ;
12
18
use std:: error:: Error ;
13
19
@@ -22,7 +28,7 @@ fn init_tracer() -> Result<sdktrace::Tracer, TraceError> {
22
28
. with_trace_config (
23
29
sdktrace:: config ( ) . with_resource ( Resource :: new ( vec ! [ KeyValue :: new(
24
30
opentelemetry_semantic_conventions:: resource:: SERVICE_NAME ,
25
- "trace-demo " ,
31
+ "basic-otlp-tracing-example " ,
26
32
) ] ) ) ,
27
33
)
28
34
. install_batch ( runtime:: Tokio )
@@ -40,9 +46,30 @@ fn init_metrics() -> metrics::Result<MeterProvider> {
40
46
. tonic ( )
41
47
. with_export_config ( export_config) ,
42
48
)
49
+ . with_resource ( Resource :: new ( vec ! [ KeyValue :: new(
50
+ opentelemetry_semantic_conventions:: resource:: SERVICE_NAME ,
51
+ "basic-otlp-metrics-example" ,
52
+ ) ] ) )
43
53
. build ( )
44
54
}
45
55
56
+ fn init_logs ( ) -> Result < opentelemetry_sdk:: logs:: Logger , LogError > {
57
+ opentelemetry_otlp:: new_pipeline ( )
58
+ . logging ( )
59
+ . with_log_config (
60
+ Config :: default ( ) . with_resource ( Resource :: new ( vec ! [ KeyValue :: new(
61
+ opentelemetry_semantic_conventions:: resource:: SERVICE_NAME ,
62
+ "basic-otlp-logging-example" ,
63
+ ) ] ) ) ,
64
+ )
65
+ . with_exporter (
66
+ opentelemetry_otlp:: new_exporter ( )
67
+ . tonic ( )
68
+ . with_endpoint ( "http://localhost:4317" ) ,
69
+ )
70
+ . install_batch ( runtime:: Tokio )
71
+ }
72
+
46
73
const LEMONS_KEY : Key = Key :: from_static_str ( "lemons" ) ;
47
74
const ANOTHER_KEY : Key = Key :: from_static_str ( "ex.com/another" ) ;
48
75
@@ -63,6 +90,17 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
63
90
let _ = init_tracer ( ) ?;
64
91
let meter_provider = init_metrics ( ) ?;
65
92
93
+ // Initialize logs, which sets the global loggerprovider.
94
+ let _ = init_logs ( ) ;
95
+
96
+ // Retrieve the global LoggerProvider.
97
+ let logger_provider = logger_provider ( ) ;
98
+
99
+ // Create a new OpenTelemetryLogBridge using the above LoggerProvider.
100
+ let otel_log_appender = OpenTelemetryLogBridge :: new ( & logger_provider) ;
101
+ log:: set_boxed_logger ( Box :: new ( otel_log_appender) ) . unwrap ( ) ;
102
+ log:: set_max_level ( Level :: Info . to_level_filter ( ) ) ;
103
+
66
104
let tracer = global:: tracer ( "ex.com/basic" ) ;
67
105
let meter = global:: meter ( "ex.com/basic" ) ;
68
106
@@ -86,6 +124,8 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
86
124
) ;
87
125
span. set_attribute ( ANOTHER_KEY . string ( "yes" ) ) ;
88
126
127
+ info ! ( target: "my-target" , "hello from {}. My price is {}. I am also inside a Span!" , "banana" , 2.99 ) ;
128
+
89
129
tracer. in_span ( "Sub operation..." , |cx| {
90
130
let span = cx. span ( ) ;
91
131
span. set_attribute ( LEMONS_KEY . string ( "five" ) ) ;
@@ -96,7 +136,10 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
96
136
} ) ;
97
137
} ) ;
98
138
139
+ info ! ( target: "my-target" , "hello from {}. My price is {}" , "apple" , 1.99 ) ;
140
+
99
141
shutdown_tracer_provider ( ) ;
142
+ shutdown_logger_provider ( ) ;
100
143
meter_provider. shutdown ( ) ?;
101
144
102
145
Ok ( ( ) )
0 commit comments