| @@ -805,6 +805,8 @@ dependencies = [ | |||||
| "tokio", | "tokio", | ||||
| "tokio-stream", | "tokio-stream", | ||||
| "tokio-util 0.7.1", | "tokio-util 0.7.1", | ||||
| "tracing", | |||||
| "tracing-subscriber", | |||||
| "uuid 0.8.2", | "uuid 0.8.2", | ||||
| ] | ] | ||||
| @@ -861,6 +863,7 @@ dependencies = [ | |||||
| "thiserror", | "thiserror", | ||||
| "tokio", | "tokio", | ||||
| "tracing", | "tracing", | ||||
| "tracing-subscriber", | |||||
| "uuid 1.1.2", | "uuid 1.1.2", | ||||
| ] | ] | ||||
| @@ -871,6 +874,7 @@ dependencies = [ | |||||
| "dora-node-api", | "dora-node-api", | ||||
| "eyre", | "eyre", | ||||
| "flume", | "flume", | ||||
| "tracing", | |||||
| ] | ] | ||||
| [[package]] | [[package]] | ||||
| @@ -932,11 +936,12 @@ dependencies = [ | |||||
| "futures", | "futures", | ||||
| "futures-concurrency", | "futures-concurrency", | ||||
| "libloading", | "libloading", | ||||
| "log", | |||||
| "pyo3", | "pyo3", | ||||
| "serde_yaml", | "serde_yaml", | ||||
| "tokio", | "tokio", | ||||
| "tokio-stream", | "tokio-stream", | ||||
| "tracing", | |||||
| "tracing-subscriber", | |||||
| "zenoh", | "zenoh", | ||||
| "zenoh-config", | "zenoh-config", | ||||
| ] | ] | ||||
| @@ -2204,9 +2209,9 @@ dependencies = [ | |||||
| [[package]] | [[package]] | ||||
| name = "pin-project-lite" | name = "pin-project-lite" | ||||
| version = "0.2.8" | |||||
| version = "0.2.9" | |||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "e280fbe77cc62c91527259e9442153f4688736748d24660126286329742b4c6c" | |||||
| checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" | |||||
| [[package]] | [[package]] | ||||
| name = "pin-utils" | name = "pin-utils" | ||||
| @@ -2996,6 +3001,15 @@ dependencies = [ | |||||
| "opaque-debug 0.3.0", | "opaque-debug 0.3.0", | ||||
| ] | ] | ||||
| [[package]] | |||||
| name = "sharded-slab" | |||||
| version = "0.1.4" | |||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | |||||
| checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" | |||||
| dependencies = [ | |||||
| "lazy_static", | |||||
| ] | |||||
| [[package]] | [[package]] | ||||
| name = "shared_memory" | name = "shared_memory" | ||||
| version = "0.12.0" | version = "0.12.0" | ||||
| @@ -3215,6 +3229,15 @@ dependencies = [ | |||||
| "syn", | "syn", | ||||
| ] | ] | ||||
| [[package]] | |||||
| name = "thread_local" | |||||
| version = "1.1.4" | |||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | |||||
| checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180" | |||||
| dependencies = [ | |||||
| "once_cell", | |||||
| ] | |||||
| [[package]] | [[package]] | ||||
| name = "threadpool" | name = "threadpool" | ||||
| version = "1.8.1" | version = "1.8.1" | ||||
| @@ -3420,9 +3443,9 @@ checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" | |||||
| [[package]] | [[package]] | ||||
| name = "tracing" | name = "tracing" | ||||
| version = "0.1.33" | |||||
| version = "0.1.36" | |||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "80b9fa4360528139bc96100c160b7ae879f5567f49f1782b0b02035b0358ebf3" | |||||
| checksum = "2fce9567bd60a67d08a16488756721ba392f24f29006402881e43b19aac64307" | |||||
| dependencies = [ | dependencies = [ | ||||
| "cfg-if", | "cfg-if", | ||||
| "log", | "log", | ||||
| @@ -3433,9 +3456,9 @@ dependencies = [ | |||||
| [[package]] | [[package]] | ||||
| name = "tracing-attributes" | name = "tracing-attributes" | ||||
| version = "0.1.20" | |||||
| version = "0.1.22" | |||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "2e65ce065b4b5c53e73bb28912318cb8c9e9ad3921f1d669eb0e68b4c8143a2b" | |||||
| checksum = "11c75893af559bc8e10716548bdef5cb2b983f8e637db9d0e15126b61b484ee2" | |||||
| dependencies = [ | dependencies = [ | ||||
| "proc-macro2", | "proc-macro2", | ||||
| "quote", | "quote", | ||||
| @@ -3444,11 +3467,12 @@ dependencies = [ | |||||
| [[package]] | [[package]] | ||||
| name = "tracing-core" | name = "tracing-core" | ||||
| version = "0.1.23" | |||||
| version = "0.1.29" | |||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "aa31669fa42c09c34d94d8165dd2012e8ff3c66aca50f3bb226b68f216f2706c" | |||||
| checksum = "5aeea4303076558a00714b823f9ad67d58a3bbda1df83d8827d21193156e22f7" | |||||
| dependencies = [ | dependencies = [ | ||||
| "lazy_static", | |||||
| "once_cell", | |||||
| "valuable", | |||||
| ] | ] | ||||
| [[package]] | [[package]] | ||||
| @@ -3461,6 +3485,31 @@ dependencies = [ | |||||
| "tracing", | "tracing", | ||||
| ] | ] | ||||
| [[package]] | |||||
| name = "tracing-log" | |||||
| version = "0.1.3" | |||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | |||||
| checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" | |||||
| dependencies = [ | |||||
| "lazy_static", | |||||
| "log", | |||||
| "tracing-core", | |||||
| ] | |||||
| [[package]] | |||||
| name = "tracing-subscriber" | |||||
| version = "0.3.15" | |||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | |||||
| checksum = "60db860322da191b40952ad9affe65ea23e7dd6a5c442c2c42865810c6ab8e6b" | |||||
| dependencies = [ | |||||
| "ansi_term", | |||||
| "sharded-slab", | |||||
| "smallvec", | |||||
| "thread_local", | |||||
| "tracing-core", | |||||
| "tracing-log", | |||||
| ] | |||||
| [[package]] | [[package]] | ||||
| name = "try-lock" | name = "try-lock" | ||||
| version = "0.2.3" | version = "0.2.3" | ||||
| @@ -3632,6 +3681,12 @@ dependencies = [ | |||||
| "unzip-n", | "unzip-n", | ||||
| ] | ] | ||||
| [[package]] | |||||
| name = "valuable" | |||||
| version = "0.1.0" | |||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | |||||
| checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" | |||||
| [[package]] | [[package]] | ||||
| name = "value-bag" | name = "value-bag" | ||||
| version = "1.0.0-alpha.9" | version = "1.0.0-alpha.9" | ||||
| @@ -12,6 +12,7 @@ crate-type = ["staticlib"] | |||||
| [dependencies] | [dependencies] | ||||
| eyre = "0.6.8" | eyre = "0.6.8" | ||||
| flume = "0.10.14" | flume = "0.10.14" | ||||
| tracing = "0.1.33" | |||||
| [dependencies.dora-node-api] | [dependencies.dora-node-api] | ||||
| default-features = false | default-features = false | ||||
| @@ -30,7 +30,7 @@ pub extern "C" fn init_dora_context_from_env() -> *mut c_void { | |||||
| Ok(n) => n, | Ok(n) => n, | ||||
| Err(err) => { | Err(err) => { | ||||
| let err: eyre::Error = err; | let err: eyre::Error = err; | ||||
| eprintln!("{err:?}"); | |||||
| tracing::error!("{err:?}"); | |||||
| return ptr::null_mut(); | return ptr::null_mut(); | ||||
| } | } | ||||
| }; | }; | ||||
| @@ -175,7 +175,7 @@ pub unsafe extern "C" fn dora_send_output( | |||||
| match unsafe { try_send_output(context, id_ptr, id_len, data_ptr, data_len) } { | match unsafe { try_send_output(context, id_ptr, id_len, data_ptr, data_len) } { | ||||
| Ok(()) => 0, | Ok(()) => 0, | ||||
| Err(err) => { | Err(err) => { | ||||
| eprintln!("{err:?}"); | |||||
| tracing::error!("{err:?}"); | |||||
| -1 | -1 | ||||
| } | } | ||||
| } | } | ||||
| @@ -5,9 +5,10 @@ edition = "2021" | |||||
| license = "Apache-2.0" | license = "Apache-2.0" | ||||
| [features] | [features] | ||||
| default = ["zenoh", "iceoryx"] | |||||
| default = ["zenoh", "iceoryx", "tracing-subscriber"] | |||||
| zenoh = ["communication-layer-pub-sub/zenoh"] | zenoh = ["communication-layer-pub-sub/zenoh"] | ||||
| iceoryx = ["communication-layer-pub-sub/iceoryx"] | iceoryx = ["communication-layer-pub-sub/iceoryx"] | ||||
| tracing-subscriber = ["dep:tracing-subscriber"] | |||||
| [dependencies] | [dependencies] | ||||
| eyre = "0.6.7" | eyre = "0.6.7" | ||||
| @@ -16,6 +17,7 @@ serde = { version = "1.0.136", features = ["derive"] } | |||||
| serde_yaml = "0.8.23" | serde_yaml = "0.8.23" | ||||
| thiserror = "1.0.30" | thiserror = "1.0.30" | ||||
| tracing = "0.1.33" | tracing = "0.1.33" | ||||
| tracing-subscriber = { version = "0.3.15", optional = true } | |||||
| flume = "0.10.14" | flume = "0.10.14" | ||||
| communication-layer-pub-sub = { path = "../../../libraries/communication-layer", default-features = false } | communication-layer-pub-sub = { path = "../../../libraries/communication-layer", default-features = false } | ||||
| uuid = { version = "1.1.2", features = ["v4"] } | uuid = { version = "1.1.2", features = ["v4"] } | ||||
| @@ -19,6 +19,9 @@ pub struct DoraNode { | |||||
| impl DoraNode { | impl DoraNode { | ||||
| pub fn init_from_env() -> eyre::Result<Self> { | pub fn init_from_env() -> eyre::Result<Self> { | ||||
| #[cfg(feature = "tracing-subscriber")] | |||||
| set_up_tracing().context("failed to set up tracing subscriber")?; | |||||
| let id = { | let id = { | ||||
| let raw = | let raw = | ||||
| std::env::var("DORA_NODE_ID").wrap_err("env variable DORA_NODE_ID must be set")?; | std::env::var("DORA_NODE_ID").wrap_err("env variable DORA_NODE_ID must be set")?; | ||||
| @@ -84,6 +87,7 @@ impl DoraNode { | |||||
| } | } | ||||
| impl Drop for DoraNode { | impl Drop for DoraNode { | ||||
| #[tracing::instrument(skip(self), fields(self.id = %self.id))] | |||||
| fn drop(&mut self) { | fn drop(&mut self) { | ||||
| let self_id = &self.id; | let self_id = &self.id; | ||||
| let topic = format!("{self_id}/{STOP_TOPIC}"); | let topic = format!("{self_id}/{STOP_TOPIC}"); | ||||
| @@ -110,6 +114,16 @@ impl Drop for DoraNode { | |||||
| pub type BoxError = Box<dyn std::error::Error + Send + Sync + 'static>; | pub type BoxError = Box<dyn std::error::Error + Send + Sync + 'static>; | ||||
| #[cfg(feature = "tracing-subscriber")] | |||||
| fn set_up_tracing() -> eyre::Result<()> { | |||||
| use tracing_subscriber::prelude::__tracing_subscriber_SubscriberExt; | |||||
| let stdout_log = tracing_subscriber::fmt::layer().pretty(); | |||||
| let subscriber = tracing_subscriber::Registry::default().with(stdout_log); | |||||
| tracing::subscriber::set_global_default(subscriber) | |||||
| .context("failed to set tracing global subscriber") | |||||
| } | |||||
| #[cfg(test)] | #[cfg(test)] | ||||
| mod tests { | mod tests { | ||||
| use super::*; | use super::*; | ||||
| @@ -23,3 +23,5 @@ futures-concurrency = "2.0.3" | |||||
| rand = "0.8.5" | rand = "0.8.5" | ||||
| dora-core = { version = "0.1.0", path = "../../libraries/core" } | dora-core = { version = "0.1.0", path = "../../libraries/core" } | ||||
| dora-message = { path = "../../libraries/message" } | dora-message = { path = "../../libraries/message" } | ||||
| tracing = "0.1.36" | |||||
| tracing-subscriber = "0.3.15" | |||||
| @@ -137,6 +137,7 @@ async fn run_dataflow(dataflow_path: PathBuf, runtime: &Path) -> eyre::Result<() | |||||
| Ok(()) | Ok(()) | ||||
| } | } | ||||
| #[tracing::instrument] | |||||
| fn spawn_custom_node( | fn spawn_custom_node( | ||||
| node_id: NodeId, | node_id: NodeId, | ||||
| node: &descriptor::CustomNode, | node: &descriptor::CustomNode, | ||||
| @@ -180,7 +181,7 @@ fn spawn_custom_node( | |||||
| let result = tokio::spawn(async move { | let result = tokio::spawn(async move { | ||||
| let status = child.wait().await.context("child process failed")?; | let status = child.wait().await.context("child process failed")?; | ||||
| if status.success() { | if status.success() { | ||||
| println!("node {node_id} finished"); | |||||
| tracing::info!("node {node_id} finished"); | |||||
| Ok(()) | Ok(()) | ||||
| } else if let Some(code) = status.code() { | } else if let Some(code) = status.code() { | ||||
| Err(eyre!("node {node_id} failed with exit code: {code}")) | Err(eyre!("node {node_id} failed with exit code: {code}")) | ||||
| @@ -191,6 +192,7 @@ fn spawn_custom_node( | |||||
| Ok(result) | Ok(result) | ||||
| } | } | ||||
| #[tracing::instrument(skip(node))] | |||||
| fn spawn_runtime_node( | fn spawn_runtime_node( | ||||
| runtime: &Path, | runtime: &Path, | ||||
| node_id: NodeId, | node_id: NodeId, | ||||
| @@ -211,7 +213,7 @@ fn spawn_runtime_node( | |||||
| let result = tokio::spawn(async move { | let result = tokio::spawn(async move { | ||||
| let status = child.wait().await.context("child process failed")?; | let status = child.wait().await.context("child process failed")?; | ||||
| if status.success() { | if status.success() { | ||||
| println!("runtime node {node_id} finished"); | |||||
| tracing::info!("runtime node {node_id} finished"); | |||||
| Ok(()) | Ok(()) | ||||
| } else if let Some(code) = status.code() { | } else if let Some(code) = status.code() { | ||||
| Err(eyre!( | Err(eyre!( | ||||
| @@ -1,5 +1,18 @@ | |||||
| use eyre::Context; | |||||
| #[tokio::main] | #[tokio::main] | ||||
| async fn main() -> eyre::Result<()> { | async fn main() -> eyre::Result<()> { | ||||
| set_up_tracing().context("failed to set up tracing subscriber")?; | |||||
| let command = clap::Parser::parse(); | let command = clap::Parser::parse(); | ||||
| dora_coordinator::run(command).await | dora_coordinator::run(command).await | ||||
| } | } | ||||
| fn set_up_tracing() -> eyre::Result<()> { | |||||
| use tracing_subscriber::prelude::__tracing_subscriber_SubscriberExt; | |||||
| let stdout_log = tracing_subscriber::fmt::layer().pretty(); | |||||
| let subscriber = tracing_subscriber::Registry::default().with(stdout_log); | |||||
| tracing::subscriber::set_global_default(subscriber) | |||||
| .context("failed to set tracing global subscriber") | |||||
| } | |||||
| @@ -8,7 +8,10 @@ license = "Apache-2.0" | |||||
| [dependencies] | [dependencies] | ||||
| clap = { version = "3.1.12", features = ["derive"] } | clap = { version = "3.1.12", features = ["derive"] } | ||||
| dora-node-api = { path = "../../apis/rust/node" } | |||||
| dora-node-api = { path = "../../apis/rust/node", default-features = false, features = [ | |||||
| "zenoh", | |||||
| "iceoryx", | |||||
| ] } | |||||
| dora-operator-api-types = { path = "../../apis/rust/operator/types" } | dora-operator-api-types = { path = "../../apis/rust/operator/types" } | ||||
| dora-core = { version = "0.1.0", path = "../../libraries/core" } | dora-core = { version = "0.1.0", path = "../../libraries/core" } | ||||
| eyre = "0.6.8" | eyre = "0.6.8" | ||||
| @@ -20,8 +23,9 @@ tokio = { version = "1.17.0", features = ["full"] } | |||||
| tokio-stream = "0.1.8" | tokio-stream = "0.1.8" | ||||
| zenoh = { git = "https://github.com/eclipse-zenoh/zenoh.git" } | zenoh = { git = "https://github.com/eclipse-zenoh/zenoh.git" } | ||||
| zenoh-config = { git = "https://github.com/eclipse-zenoh/zenoh.git" } | zenoh-config = { git = "https://github.com/eclipse-zenoh/zenoh.git" } | ||||
| log = "0.4.17" | |||||
| fern = "0.6.1" | fern = "0.6.1" | ||||
| pyo3 = { version = "0.16.5", features = ["auto-initialize", "eyre"] } | pyo3 = { version = "0.16.5", features = ["auto-initialize", "eyre"] } | ||||
| flume = "0.10.14" | flume = "0.10.14" | ||||
| dora-message = { path = "../../libraries/message" } | dora-message = { path = "../../libraries/message" } | ||||
| tracing = "0.1.36" | |||||
| tracing-subscriber = "0.3.15" | |||||
| @@ -19,7 +19,7 @@ use tokio_stream::{wrappers::ReceiverStream, StreamMap}; | |||||
| mod operator; | mod operator; | ||||
| fn main() -> eyre::Result<()> { | fn main() -> eyre::Result<()> { | ||||
| set_up_logger()?; | |||||
| set_up_tracing().context("failed to set up tracing subscriber")?; | |||||
| let node_id = { | let node_id = { | ||||
| let raw = | let raw = | ||||
| @@ -94,7 +94,7 @@ async fn run( | |||||
| OperatorEvent::Panic(payload) => std::panic::resume_unwind(payload), | OperatorEvent::Panic(payload) => std::panic::resume_unwind(payload), | ||||
| OperatorEvent::Finished => { | OperatorEvent::Finished => { | ||||
| if let Some(stop_publisher) = operator_stop_publishers.remove(&id) { | if let Some(stop_publisher) = operator_stop_publishers.remove(&id) { | ||||
| println!("operator {node_id}/{id} finished"); | |||||
| tracing::info!("operator {node_id}/{id} finished"); | |||||
| stopped_operators.insert(id.clone()); | stopped_operators.insert(id.clone()); | ||||
| // send stopped message | // send stopped message | ||||
| tokio::task::spawn_blocking(move || stop_publisher.publish(&[])) | tokio::task::spawn_blocking(move || stop_publisher.publish(&[])) | ||||
| @@ -110,7 +110,7 @@ async fn run( | |||||
| break; | break; | ||||
| } | } | ||||
| } else { | } else { | ||||
| log::warn!("no stop publisher for {id}"); | |||||
| tracing::warn!("no stop publisher for {id}"); | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -143,22 +143,11 @@ enum Event { | |||||
| }, | }, | ||||
| } | } | ||||
| fn set_up_logger() -> Result<(), fern::InitError> { | |||||
| fern::Dispatch::new() | |||||
| .format(|out, message, record| { | |||||
| out.finish(format_args!( | |||||
| " [{}][{}] {}", | |||||
| record.target(), | |||||
| record.level(), | |||||
| message | |||||
| )) | |||||
| }) | |||||
| .level(log::LevelFilter::Debug) | |||||
| .level_for("zenoh", log::LevelFilter::Warn) | |||||
| .level_for("zenoh_transport", log::LevelFilter::Warn) | |||||
| .level_for("zenoh_link_tcp", log::LevelFilter::Warn) | |||||
| .chain(std::io::stdout()) | |||||
| .chain(fern::log_file("runtime.log")?) | |||||
| .apply()?; | |||||
| Ok(()) | |||||
| fn set_up_tracing() -> eyre::Result<()> { | |||||
| use tracing_subscriber::prelude::__tracing_subscriber_SubscriberExt; | |||||
| let stdout_log = tracing_subscriber::fmt::layer().pretty(); | |||||
| let subscriber = tracing_subscriber::Registry::default().with(stdout_log); | |||||
| tracing::subscriber::set_global_default(subscriber) | |||||
| .context("failed to set tracing global subscriber") | |||||
| } | } | ||||
| @@ -10,6 +10,7 @@ use tokio::sync::mpsc::Sender; | |||||
| mod python; | mod python; | ||||
| mod shared_lib; | mod shared_lib; | ||||
| #[tracing::instrument(skip(communication))] | |||||
| pub fn spawn_operator( | pub fn spawn_operator( | ||||
| node_id: &NodeId, | node_id: &NodeId, | ||||
| operator_definition: OperatorDefinition, | operator_definition: OperatorDefinition, | ||||
| @@ -59,7 +60,7 @@ pub fn spawn_operator( | |||||
| })?; | })?; | ||||
| } | } | ||||
| OperatorSource::Wasm(_path) => { | OperatorSource::Wasm(_path) => { | ||||
| eprintln!("WARNING: WASM operators are not supported yet"); | |||||
| tracing::error!("WASM operators are not supported yet"); | |||||
| } | } | ||||
| } | } | ||||
| Ok(()) | Ok(()) | ||||