-
-
Save NickLarsenNZ/fbbb477230e9992e9a4aa2603edcf54f to your computer and use it in GitHub Desktop.
OTLP Log Export (errors on shutdown)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[package] | |
name = "log-tracing" | |
version = "0.1.0" | |
edition = "2021" | |
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html | |
[dependencies] | |
log = { version = "0.4.21", default-features = false } | |
opentelemetry = { version = "0.22.0", features = ["logs", "metrics"] } | |
opentelemetry-otlp = { version = "0.15.0", features = ["logs", "metrics"] } | |
opentelemetry-semantic-conventions = "0.14.0" | |
opentelemetry_sdk = { version = "0.22.1", features = ["metrics", "rt-tokio", "logs"] } | |
tokio = { version = "1.37.0", features = ["full"] } | |
tracing = { version = "0.1.40", features = ["log", "attributes", "std", "tracing-attributes"], default-features = false } | |
tracing-subscriber = { version = "0.3.18", features = ["env-filter"] } | |
tracing-opentelemetry = "0.23.0" | |
opentelemetry-appender-tracing = "0.3.0" | |
tracing-log = "0.2.0" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
use std::time::Duration; | |
mod telemetry; | |
#[tokio::main] | |
async fn main() { | |
telemetry::init(); | |
async move { | |
log::info!("Hello"); | |
tracing::info!("World!"); | |
} | |
.await; | |
tokio::time::sleep(Duration::from_secs(2)).await; | |
opentelemetry::global::shutdown_tracer_provider(); | |
opentelemetry::global::shutdown_logger_provider(); | |
// Without this sleep, I get a different error: | |
// OpenTelemetry log error occurred. Exporter otlp encountered the following errors: the grpc server returns error (Unknown error): , detailed error message: transport error | |
tokio::time::sleep(Duration::from_secs(2)).await; | |
println!("end of main"); | |
// Errors generated here as Tokio shuts down: | |
// OpenTelemetry log error occurred. cannot send message to batch processor as the channel is closed | |
// OpenTelemetry log error occurred. cannot send message to batch processor as the channel is closed | |
// OpenTelemetry log error occurred. cannot send message to batch processor as the channel is closed | |
// OpenTelemetry log error occurred. cannot send message to batch processor as the channel is closed | |
// OpenTelemetry log error occurred. cannot send message to batch processor as the channel is closed | |
// OpenTelemetry log error occurred. cannot send message to batch processor as the channel is closed | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
use opentelemetry::KeyValue; | |
use opentelemetry_appender_tracing::layer::OpenTelemetryTracingBridge; | |
use opentelemetry_sdk::{ | |
logs, | |
Resource, | |
}; | |
use opentelemetry_semantic_conventions::resource; | |
use tracing::level_filters::LevelFilter; | |
use tracing_subscriber::{layer::SubscriberExt as _, EnvFilter, Layer}; | |
pub fn init() { | |
let env_filter_layer = EnvFilter::builder() | |
.with_default_directive(LevelFilter::TRACE.into()) | |
.from_env_lossy(); | |
let console_output_layer = tracing_subscriber::fmt::layer().with_filter(env_filter_layer); | |
let mut layers = vec![console_output_layer.boxed()]; | |
// // We want to convert log::Records to tracing::Events which will then be part of Spans, and also be able to be shipped as logs | |
// tracing_log::LogTracer::init().expect( | |
// "unable to set the Log implementation that would convert log::Record as trace::Event", | |
// ); | |
let env_filter_layer = EnvFilter::builder() | |
.with_default_directive(LevelFilter::DEBUG.into()) | |
.from_env_lossy(); | |
let log_exporter = opentelemetry_otlp::new_exporter().tonic(); | |
let otel_log = opentelemetry_otlp::new_pipeline() | |
.logging() | |
.with_exporter(log_exporter) | |
.with_log_config( | |
logs::config().with_resource(Resource::new(vec![KeyValue::new( | |
resource::SERVICE_NAME, | |
"blah", | |
)])), | |
) | |
.install_batch(opentelemetry_sdk::runtime::Tokio) | |
.expect("install"); | |
// // Covert `tracing::Event` to OpenTelemetry logs. `log::Record`s will already be converted to `tracing::Event` by the `tacing-log` crate with the `log-tracer` feature. | |
layers.push( | |
OpenTelemetryTracingBridge::new(otel_log.provider()) | |
.with_filter(env_filter_layer) | |
.boxed(), | |
); | |
tracing::subscriber::set_global_default(tracing_subscriber::registry().with(layers)) | |
.expect("set gloabl default"); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I can see the trace events that occur after the
println!("end of main")
.