|
| 1 | +use log::{error, Level}; |
| 2 | +use opentelemetry::KeyValue; |
| 3 | +use opentelemetry_appender_log::OpenTelemetryLogBridge; |
| 4 | +use opentelemetry_sdk::logs::LoggerProvider; |
| 5 | +use opentelemetry_sdk::thread_runtime::CustomThreadRuntime; |
| 6 | +use opentelemetry_sdk::Resource; |
| 7 | +use opentelemetry_semantic_conventions::resource::SERVICE_NAME; |
| 8 | + |
| 9 | +fn main() { |
| 10 | + // Setup LoggerProvider with a stdout exporter |
| 11 | + let exporter = opentelemetry_stdout::LogExporter::default(); |
| 12 | + let runtime = CustomThreadRuntime::new(2, 5); // 1 worker thread |
| 13 | + let logger_provider = LoggerProvider::builder() |
| 14 | + .with_resource(Resource::new([KeyValue::new( |
| 15 | + SERVICE_NAME, |
| 16 | + "logs-basic-example", |
| 17 | + )])) |
| 18 | + .with_batch_exporter(exporter, runtime) |
| 19 | + .build(); |
| 20 | + |
| 21 | + // Setup Log Appender for the log crate. |
| 22 | + let otel_log_appender = OpenTelemetryLogBridge::new(&logger_provider); |
| 23 | + log::set_boxed_logger(Box::new(otel_log_appender)).unwrap(); |
| 24 | + log::set_max_level(Level::Error.to_level_filter()); |
| 25 | + |
| 26 | + // Emit logs using macros from the log crate. |
| 27 | + // These logs gets piped through OpenTelemetry bridge and gets exported to stdout. |
| 28 | + // 10 error events |
| 29 | + for i in 0..10000 { |
| 30 | + error!(target: "my-target", "hello from {}. My price is {} at itr {}", "apple", 2.99, i); |
| 31 | + //sleep 1 sec every 100 secs |
| 32 | + if i % 10 == 0 { |
| 33 | + std::thread::sleep(std::time::Duration::from_secs(1)); |
| 34 | + } |
| 35 | + } |
| 36 | + println!("Flushing logs explicitly before exiting.."); |
| 37 | + logger_provider.force_flush(); |
| 38 | +} |
0 commit comments