update
This commit is contained in:
		| @@ -14,6 +14,9 @@ path = "src/main.rs" | ||||
| tracing = { version = "^0", features = ["log", "attributes"] } | ||||
| tracing-subscriber = { version = "^0", features = ["env-filter"] } | ||||
| tracing-appender = "^0" | ||||
| tracing-opentelemetry = "^0" | ||||
| opentelemetry = { version = "^0", features = ["rt-async-std"] } | ||||
| opentelemetry-otlp = { version = "^0", features = ["grpc-sys"] } | ||||
| clap = "^3" | ||||
| async-std = { version = "^1", features = ["unstable"] } | ||||
| async-tungstenite = { version = "^0", features = ["async-std-runtime", "async-tls"] } | ||||
|   | ||||
| @@ -61,6 +61,14 @@ fn do_clap_matches(default_config_path: &OsStr) -> Result<clap::ArgMatches, clap | ||||
|                 .conflicts_with("debug") | ||||
|                 .help("Turn on trace logging on the terminal"), | ||||
|         ) | ||||
|         .arg( | ||||
|             Arg::new("otlp") | ||||
|                 .long("otlp") | ||||
|                 .takes_value(true) | ||||
|                 .value_name("endpoint") | ||||
|                 .default_missing_value("http://localhost:4317") | ||||
|                 .help("Turn on OpenTelemetry tracing"), | ||||
|         ) | ||||
|         .arg( | ||||
|             Arg::new("subnode-index") | ||||
|                 .long("subnode-index") | ||||
| @@ -197,6 +205,19 @@ pub fn process_command_line() -> Result<(Settings, ArgMatches), String> { | ||||
|         settingsrw.logging.terminal.enabled = true; | ||||
|         settingsrw.logging.terminal.level = LogLevel::Trace; | ||||
|     } | ||||
|     if matches.occurrences_of("otlp") != 0 { | ||||
|         settingsrw.logging.otlp.enabled = true; | ||||
|         settingsrw.logging.otlp.grpc_endpoint = Some( | ||||
|             ParsedUrl::from_str( | ||||
|                 &matches | ||||
|                     .value_of("otlp") | ||||
|                     .expect("should not be null because of default missing value") | ||||
|                     .to_string(), | ||||
|             ) | ||||
|             .map_err(|e| format!("failed to parse OTLP url: {}", e))?, | ||||
|         ); | ||||
|         settingsrw.logging.otlp.level = LogLevel::Trace; | ||||
|     } | ||||
|     if matches.is_present("attach") { | ||||
|         settingsrw.auto_attach = !matches!(matches.value_of("attach"), Some("true")); | ||||
|     } | ||||
|   | ||||
| @@ -58,18 +58,21 @@ fn main() -> Result<(), String> { | ||||
|  | ||||
|     // Handle non-normal server modes | ||||
|     if !matches!(server_mode, ServerMode::Normal) { | ||||
|         // Init combined console/file logger | ||||
|         let _logs = VeilidLogs::setup(settings.clone())?; | ||||
|         // run the server to set the node id and quit | ||||
|         return task::block_on(async { run_veilid_server(settings, server_mode).await }) | ||||
|             .map(|v| { | ||||
|                 println!("{}", success); | ||||
|                 v | ||||
|             }) | ||||
|             .map_err(|e| { | ||||
|                 println!("{}", failure); | ||||
|                 e | ||||
|             }); | ||||
|         return task::block_on(async { | ||||
|             // Init combined console/file logger | ||||
|             let _logs = VeilidLogs::setup(settings.clone())?; | ||||
|  | ||||
|             run_veilid_server(settings, server_mode).await | ||||
|         }) | ||||
|         .map(|v| { | ||||
|             println!("{}", success); | ||||
|             v | ||||
|         }) | ||||
|         .map_err(|e| { | ||||
|             println!("{}", failure); | ||||
|             e | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     // --- Daemon Mode ---- | ||||
| @@ -83,9 +86,6 @@ fn main() -> Result<(), String> { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // Init combined console/file logger | ||||
|     let _logs = VeilidLogs::setup(settings.clone())?; | ||||
|  | ||||
|     // --- Normal Startup --- | ||||
|     ctrlc::set_handler(move || { | ||||
|         shutdown(); | ||||
| @@ -93,5 +93,10 @@ fn main() -> Result<(), String> { | ||||
|     .expect("Error setting Ctrl-C handler"); | ||||
|  | ||||
|     // Run the server loop | ||||
|     task::block_on(async { run_veilid_server(settings, server_mode).await }) | ||||
|     task::block_on(async { | ||||
|         // Init combined console/file logger | ||||
|         let _logs = VeilidLogs::setup(settings.clone())?; | ||||
|  | ||||
|         run_veilid_server(settings, server_mode).await | ||||
|     }) | ||||
| } | ||||
|   | ||||
| @@ -36,6 +36,10 @@ logging: | ||||
|     api: | ||||
|         enabled: false | ||||
|         level: 'info' | ||||
|     otlp: | ||||
|         enabled: false | ||||
|         level: 'trace' | ||||
|         grpc_endpoint: 'http://localhost:4317' | ||||
| testing: | ||||
|     subnode_index: 0 | ||||
| core: | ||||
| @@ -427,6 +431,13 @@ pub struct Api { | ||||
|     pub level: LogLevel, | ||||
| } | ||||
|  | ||||
| #[derive(Debug, Deserialize, Serialize)] | ||||
| pub struct Otlp { | ||||
|     pub enabled: bool, | ||||
|     pub level: LogLevel, | ||||
|     pub grpc_endpoint: Option<ParsedUrl>, | ||||
| } | ||||
|  | ||||
| #[derive(Debug, Deserialize, Serialize)] | ||||
| pub struct ClientApi { | ||||
|     pub enabled: bool, | ||||
| @@ -439,6 +450,7 @@ pub struct Logging { | ||||
|     pub terminal: Terminal, | ||||
|     pub file: File, | ||||
|     pub api: Api, | ||||
|     pub otlp: Otlp, | ||||
| } | ||||
|  | ||||
| #[derive(Debug, Deserialize, Serialize)] | ||||
| @@ -889,6 +901,9 @@ impl Settings { | ||||
|         set_config_value!(inner.logging.file.level, value); | ||||
|         set_config_value!(inner.logging.api.enabled, value); | ||||
|         set_config_value!(inner.logging.api.level, value); | ||||
|         set_config_value!(inner.logging.otlp.enabled, value); | ||||
|         set_config_value!(inner.logging.otlp.level, value); | ||||
|         set_config_value!(inner.logging.otlp.grpc_endpoint, value); | ||||
|         set_config_value!(inner.testing.subnode_index, value); | ||||
|         set_config_value!(inner.core.protected_store.allow_insecure_fallback, value); | ||||
|         set_config_value!( | ||||
| @@ -1404,6 +1419,12 @@ mod tests { | ||||
|         assert_eq!(s.logging.file.level, LogLevel::Info); | ||||
|         assert_eq!(s.logging.api.enabled, false); | ||||
|         assert_eq!(s.logging.api.level, LogLevel::Info); | ||||
|         assert_eq!(s.logging.otlp.enabled, false); | ||||
|         assert_eq!(s.logging.otlp.level, LogLevel::Trace); | ||||
|         assert_eq!( | ||||
|             s.logging.otlp.grpc_endpoint, | ||||
|             Some(ParsedUrl::from_str("http://127.0.0.1:4317").unwrap()) | ||||
|         ); | ||||
|         assert_eq!(s.testing.subnode_index, 0); | ||||
|  | ||||
|         assert_eq!( | ||||
|   | ||||
| @@ -95,16 +95,16 @@ pub fn run_daemon(settings: Settings, _matches: ArgMatches) -> Result<(), String | ||||
|         daemon | ||||
|     }; | ||||
|  | ||||
|     // Init combined console/file logger | ||||
|     let _logs = VeilidLogs::setup(settings.clone())?; | ||||
|  | ||||
|     // Daemonize | ||||
|     daemon | ||||
|         .start() | ||||
|         .map_err(|e| format!("Failed to daemonize: {}", e))?; | ||||
|  | ||||
|     // Now, run the server | ||||
|     task::block_on(async { | ||||
|         // Init combined console/file logger | ||||
|         let _logs = VeilidLogs::setup(settings.clone())?; | ||||
|  | ||||
|         // Daemonize | ||||
|         daemon | ||||
|             .start() | ||||
|             .map_err(|e| format!("Failed to daemonize: {}", e))?; | ||||
|  | ||||
|         // Catch signals | ||||
|         let signals = Signals::new(&[SIGHUP, SIGTERM, SIGINT, SIGQUIT]) | ||||
|             .map_err(|e| format!("failed to init signals: {}", e))?; | ||||
|   | ||||
| @@ -1,5 +1,6 @@ | ||||
| use crate::settings::*; | ||||
| use cfg_if::*; | ||||
| use opentelemetry_otlp::WithExportConfig; | ||||
| use std::path::*; | ||||
| use tracing::*; | ||||
| use tracing_appender::*; | ||||
| @@ -34,6 +35,7 @@ impl VeilidLogs { | ||||
|  | ||||
|         let subscriber = Registry::default(); | ||||
|  | ||||
|         // Terminal logger | ||||
|         let subscriber = subscriber.with(if settingsr.logging.terminal.enabled { | ||||
|             let terminal_max_log_level: level_filters::LevelFilter = | ||||
|                 convert_loglevel(settingsr.logging.terminal.level) | ||||
| @@ -53,6 +55,46 @@ impl VeilidLogs { | ||||
|             None | ||||
|         }); | ||||
|  | ||||
|         // OpenTelemetry logger | ||||
|         let subscriber = subscriber.with(if settingsr.logging.otlp.enabled { | ||||
|             let otlp_max_log_level: level_filters::LevelFilter = | ||||
|                 convert_loglevel(settingsr.logging.otlp.level) | ||||
|                     .to_tracing_level() | ||||
|                     .into(); | ||||
|             let grpc_endpoint = match &settingsr.logging.otlp.grpc_endpoint { | ||||
|                 Some(v) => &v.urlstring, | ||||
|                 None => { | ||||
|                     return Err("missing OTLP GRPC endpoint url".to_owned()); | ||||
|                 } | ||||
|             }; | ||||
|  | ||||
|             // Required for GRPC dns resolution to work | ||||
|             std::env::set_var("GRPC_DNS_RESOLVER", "native"); | ||||
|  | ||||
|             let tracer = opentelemetry_otlp::new_pipeline() | ||||
|                 .tracing() | ||||
|                 .with_exporter( | ||||
|                     opentelemetry_otlp::new_exporter() | ||||
|                         .grpcio() | ||||
|                         .with_endpoint(grpc_endpoint), | ||||
|                 ) | ||||
|                 .install_batch(opentelemetry::runtime::AsyncStd) | ||||
|                 .map_err(|e| format!("failed to install OpenTelemetry tracer: {}", e))?; | ||||
|  | ||||
|             let ignore_list = ignore_list.clone(); | ||||
|             Some( | ||||
|                 tracing_opentelemetry::layer() | ||||
|                     .with_tracer(tracer) | ||||
|                     .with_filter(otlp_max_log_level) | ||||
|                     .with_filter(filter::FilterFn::new(move |metadata| { | ||||
|                         logfilter(metadata, &ignore_list) | ||||
|                     })), | ||||
|             ) | ||||
|         } else { | ||||
|             None | ||||
|         }); | ||||
|  | ||||
|         // File logger | ||||
|         let mut guard = None; | ||||
|         let subscriber = subscriber.with(if settingsr.logging.file.enabled { | ||||
|             let file_max_log_level: level_filters::LevelFilter = | ||||
| @@ -98,6 +140,7 @@ impl VeilidLogs { | ||||
|             None | ||||
|         }); | ||||
|  | ||||
|         // API logger | ||||
|         let subscriber = subscriber.with(if settingsr.logging.api.enabled { | ||||
|             // Get layer from veilid core, filtering is done by ApiTracingLayer automatically | ||||
|             Some(veilid_core::ApiTracingLayer::get()) | ||||
| @@ -105,6 +148,7 @@ impl VeilidLogs { | ||||
|             None | ||||
|         }); | ||||
|  | ||||
|         // Systemd Journal logger | ||||
|         cfg_if! { | ||||
|             if #[cfg(target_os = "linux")] { | ||||
|                 let subscriber = subscriber.with(if settingsr.logging.system.enabled { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user