From b43aa68130488ef9a4c0856921ae89b45a66eb96 Mon Sep 17 00:00:00 2001 From: Ondrej Vlach Date: Tue, 28 Nov 2023 17:09:50 +0100 Subject: [PATCH] Working open telemetry --- Cargo.lock | 259 ++++++++++++++++++++++++++++++++++++++++++++-- Cargo.toml | 4 +- src/main.rs | 32 +++++- src/routes/pdf.rs | 33 +++--- 4 files changed, 302 insertions(+), 26 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 160fee6..05cebed 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -124,6 +124,51 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "axum" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" +dependencies = [ + "async-trait", + "axum-core", + "bitflags 1.3.2", + "bytes", + "futures-util", + "http", + "http-body", + "hyper", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "sync_wrapper", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http", + "http-body", + "mime", + "rustversion", + "tower-layer", + "tower-service", +] + [[package]] name = "backtrace" version = "0.3.69" @@ -656,13 +701,19 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap", + "indexmap 2.1.0", "slab", "tokio", "tokio-util", "tracing", ] +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + [[package]] name = "hashbrown" version = "0.14.3" @@ -765,6 +816,18 @@ dependencies = [ "want", ] +[[package]] +name = "hyper-timeout" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" +dependencies = [ + "hyper", + "pin-project-lite", + "tokio", + "tokio-io-timeout", +] + [[package]] name = "iana-time-zone" version = "0.1.58" @@ -804,6 +867,16 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", +] + [[package]] name = "indexmap" version = "2.1.0" @@ -811,7 +884,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.14.3", "serde", ] @@ -832,6 +905,15 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.9" @@ -905,6 +987,12 @@ dependencies = [ "regex-automata 0.1.10", ] +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + [[package]] name = "memchr" version = "2.6.4" @@ -1009,7 +1097,7 @@ checksum = "1e32339a5dc40459130b3bd269e9892439f55b33e772d2a9d402a789baaf4e8a" dependencies = [ "futures-core", "futures-sink", - "indexmap", + "indexmap 2.1.0", "js-sys", "once_cell", "pin-project-lite", @@ -1017,6 +1105,46 @@ dependencies = [ "urlencoding", ] +[[package]] +name = "opentelemetry-otlp" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f24cda83b20ed2433c68241f918d0f6fdec8b1d43b7a9590ab4420c5095ca930" +dependencies = [ + "async-trait", + "futures-core", + "http", + "opentelemetry", + "opentelemetry-proto", + "opentelemetry-semantic-conventions", + "opentelemetry_sdk", + "prost", + "thiserror", + "tokio", + "tonic", +] + +[[package]] +name = "opentelemetry-proto" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2e155ce5cc812ea3d1dffbd1539aed653de4bf4882d60e6e04dcf0901d674e1" +dependencies = [ + "opentelemetry", + "opentelemetry_sdk", + "prost", + "tonic", +] + +[[package]] +name = "opentelemetry-semantic-conventions" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5774f1ef1f982ef2a447f6ee04ec383981a3ab99c8e77a1a7b30182e65bbc84" +dependencies = [ + "opentelemetry", +] + [[package]] name = "opentelemetry-stdout" version = "0.2.0" @@ -1092,6 +1220,8 @@ dependencies = [ "headless_chrome", "log", "opentelemetry", + "opentelemetry-otlp", + "opentelemetry-semantic-conventions", "opentelemetry-stdout", "opentelemetry_sdk", "ovlach_data", @@ -1160,6 +1290,26 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +[[package]] +name = "pin-project" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + [[package]] name = "pin-project-lite" version = "0.2.13" @@ -1206,6 +1356,29 @@ dependencies = [ "yansi 1.0.0-rc.1", ] +[[package]] +name = "prost" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-derive" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" +dependencies = [ + "anyhow", + "itertools", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "quote" version = "1.0.33" @@ -1346,7 +1519,7 @@ dependencies = [ "either", "figment", "futures", - "indexmap", + "indexmap 2.1.0", "log", "memchr", "multer", @@ -1378,7 +1551,7 @@ checksum = "a2238066abf75f21be6cd7dc1a09d5414a671f4246e384e49fe3f8a4936bd04c" dependencies = [ "devise", "glob", - "indexmap", + "indexmap 2.1.0", "proc-macro2", "quote", "rocket_http", @@ -1398,7 +1571,7 @@ dependencies = [ "futures", "http", "hyper", - "indexmap", + "indexmap 2.1.0", "log", "memchr", "pear", @@ -1535,7 +1708,7 @@ version = "0.9.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3cc7a1570e38322cfe4154732e5110f887ea57e22b76f4bfd32b5bdd3368666c" dependencies = [ - "indexmap", + "indexmap 2.1.0", "itoa", "ryu", "serde", @@ -1669,6 +1842,12 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + [[package]] name = "tempfile" version = "3.8.1" @@ -1774,6 +1953,16 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "tokio-io-timeout" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf" +dependencies = [ + "pin-project-lite", + "tokio", +] + [[package]] name = "tokio-macros" version = "2.2.0" @@ -1837,13 +2026,67 @@ version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" dependencies = [ - "indexmap", + "indexmap 2.1.0", "serde", "serde_spanned", "toml_datetime", "winnow", ] +[[package]] +name = "tonic" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3082666a3a6433f7f511c7192923fa1fe07c69332d3c6a2e6bb040b569199d5a" +dependencies = [ + "async-trait", + "axum", + "base64", + "bytes", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-timeout", + "percent-encoding", + "pin-project", + "prost", + "tokio", + "tokio-stream", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "indexmap 1.9.3", + "pin-project", + "pin-project-lite", + "rand", + "slab", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + [[package]] name = "tower-service" version = "0.3.2" diff --git a/Cargo.toml b/Cargo.toml index 5836d8d..316c296 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,7 +20,7 @@ tokio = { version = "1.34.0", features = ["macros"] } -tracing = "0.1.37" +tracing = { version = "0.1.40", features = ["attributes", "std"] } tracing-appender = "0.2.2" tracing-log = "0.2.0" tracing-subscriber = {version="0.3.17", features=["env-filter", "json", "registry", "smallvec"]} @@ -28,5 +28,7 @@ tracing-opentelemetry = "0.22.0" opentelemetry = {version="0.21"} opentelemetry_sdk = {version="0.21", features = ["trace", "rt-tokio", "logs"]} opentelemetry-stdout = { version = "0.2.0", features = ["trace", "logs", "metrics"] } +opentelemetry-otlp = { version="*", features = ["trace", "logs", "metrics"] } +opentelemetry-semantic-conventions = "0.13.0" uuid = {version="1.4.1", features = ["v4"]} yansi = "0.5.1" \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 6e33f71..d3e6ced 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,10 +1,13 @@ +use opentelemetry_otlp::WithExportConfig; +use opentelemetry_sdk::Resource; use ovlach_pdf::rocket_builder; use rocket::launch; -use opentelemetry::trace::TracerProvider as _; -use opentelemetry_sdk::trace::TracerProvider; +use opentelemetry::trace::{TracerProvider as _, TraceError}; +use opentelemetry_sdk::trace::{TracerProvider, Config}; use opentelemetry_stdout as stdout; +use tokio::net::unix::pipe; use tracing::{error, span}; use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt}; use tracing_subscriber::Registry; @@ -28,6 +31,23 @@ fn init_meterprovider() -> MeterProvider { } +fn init_tracer() -> Result { + opentelemetry_otlp::new_pipeline() + .tracing() + .with_exporter( + opentelemetry_otlp::new_exporter() + .tonic() + .with_endpoint("http://localhost:4317"), + ) + .with_trace_config( + opentelemetry_sdk::trace::config().with_resource(Resource::new(vec![KeyValue::new( + opentelemetry_semantic_conventions::resource::SERVICE_NAME, + "ovlach_pdf", + )])), + ) + .install_batch(runtime::Tokio) + //.install_simple() + } #[rocket::main] async fn main() { @@ -36,8 +56,12 @@ async fn main() { .with_simple_exporter(logger) .build(); - let telemetry = tracing_opentelemetry::layer().with_tracer(provider.tracer("default")); - let meter_provider = init_meterprovider(); + let telemetry = tracing_opentelemetry::layer().with_tracer( + provider.tracer("default") + ).with_tracer( + init_tracer().unwrap() + ); + let meter_provider = init_meterprovider(); Registry::default().with(telemetry).init(); let _ = rocket_builder().launch().await; } \ No newline at end of file diff --git a/src/routes/pdf.rs b/src/routes/pdf.rs index e336568..a05c635 100644 --- a/src/routes/pdf.rs +++ b/src/routes/pdf.rs @@ -5,14 +5,17 @@ use std::io::prelude::*; use headless_chrome::Browser; use headless_chrome::{types::PrintToPdfOptions, LaunchOptions}; use rocket::{get, Response, futures::Stream, tokio::net::UnixStream, fs::NamedFile}; -use tracing::{info_span, debug, info, error}; +use tracing::{info_span, debug, info, error, Span, instrument}; use crate::chromium::rocket::BrowserHolder; use crate::tools::rocket::TracingSpan; fn generate_pdf(browser: Browser) { let tab = browser.new_tab().unwrap(); - let tab = tab.navigate_to("file:///home/6a6996c0-1609-48b6-8ca6-affbef1b4d1d/Devel/Nanobyte/ovlach/ovlach_pdf/template.html").unwrap().wait_until_navigated().unwrap(); + info_span!("open_pdf").in_scope(|| { + tab.navigate_to("file:///home/6a6996c0-1609-48b6-8ca6-affbef1b4d1d/Devel/Nanobyte/ovlach/ovlach_pdf/template.html").unwrap().wait_until_navigated().unwrap(); + }); + let options = PrintToPdfOptions{ margin_bottom: Some(0.0), margin_left: Some(0.0), @@ -26,25 +29,29 @@ fn generate_pdf(browser: Browser) { //thread::sleep(Duration::from_secs(10)); - let bytes = tab.print_to_pdf(Some(options)).unwrap(); - let mut file = fs::OpenOptions::new() - // .create(true) // To create a new file - .write(true) - // either use the ? operator or unwrap since it returns a Result - .open("/tmp/foo.pdf").unwrap(); - file.write_all(&bytes).unwrap(); + let bytes = info_span!("print_pdf").in_scope(|| { + tab.print_to_pdf(Some(options)).unwrap() + }); + + info_span!("write_temporary_file").in_scope(|| { + let mut file = fs::OpenOptions::new() + // .create(true) // To create a new file + .write(true) + // either use the ? operator or unwrap since it returns a Result + .open("/tmp/foo.pdf").unwrap(); + file.write_all(&bytes).unwrap(); + }); } #[get("/cv//pdf")] pub async fn render_pdf_cv(username: &str, browser: BrowserHolder, tracing: TracingSpan) -> NamedFile { let entered_span = tracing.0.enter(); let span = info_span!("render_pdf", username = username); - let entered_inner_span = span.enter(); info!("generate PDF"); - generate_pdf(browser.browser); + span.in_scope(||{ + generate_pdf(browser.browser); + }); info!("done generating"); - drop(entered_inner_span); drop(entered_span); - "foo!".to_string(); NamedFile::open("/tmp/foo.pdf").await.expect("failed to open foo.pdf") } \ No newline at end of file