From 7d9c3d18170595bd47d4e15dbc4d39bba98235bb Mon Sep 17 00:00:00 2001 From: Jeremy HERGAULT Date: Tue, 3 Feb 2026 10:57:31 +0100 Subject: [PATCH 1/2] feat: update and improve OpenTelemetry Signed-off-by: Jeremy HERGAULT --- .gitignore | 2 +- Cargo.toml | 8 +- prosa/Cargo.toml | 13 +- prosa/src/core/main.rs | 230 ++++++++-------- prosa/src/core/proc.rs | 16 +- prosa/src/core/service.rs | 46 +++- prosa/src/io/stream.rs | 16 +- prosa_book/init.sh | 2 +- prosa_book/src/SUMMARY.md | 9 +- prosa_book/src/ch00-00-prosa.md | 2 +- prosa_book/src/ch01-02-01-observability.md | 31 +++ .../src/ch01-03-monitoring-grafana_graph.png | Bin 0 -> 77224 bytes .../src/ch01-03-monitoring-grafana_trace.png | Bin 0 -> 86272 bytes prosa_book/src/ch01-03-monitoring.md | 57 ++++ ...oud_run.md => ch01-05-01-gcp-cloud_run.md} | 0 ...er_cloud.md => ch01-05-02-clever_cloud.md} | 0 .../{ch01-04-cloud.md => ch01-05-cloud.md} | 4 +- prosa_macros/src/settings.rs | 1 + prosa_utils/Cargo.toml | 22 +- prosa_utils/src/config.rs | 90 ++++++- prosa_utils/src/config/observability.rs | 250 ++++++++++++++---- 21 files changed, 576 insertions(+), 223 deletions(-) create mode 100755 prosa_book/src/ch01-03-monitoring-grafana_graph.png create mode 100755 prosa_book/src/ch01-03-monitoring-grafana_trace.png create mode 100644 prosa_book/src/ch01-03-monitoring.md rename prosa_book/src/{ch01-04-01-gcp-cloud_run.md => ch01-05-01-gcp-cloud_run.md} (100%) rename prosa_book/src/{ch01-04-02-clever_cloud.md => ch01-05-02-clever_cloud.md} (100%) rename prosa_book/src/{ch01-04-cloud.md => ch01-05-cloud.md} (94%) diff --git a/.gitignore b/.gitignore index 8d45a54..bdd6f98 100644 --- a/.gitignore +++ b/.gitignore @@ -8,5 +8,5 @@ # For book prosa_book/book -prosa_book/src/ch01-03-puppet.md +prosa_book/src/ch01-04-puppet.md *.html diff --git a/Cargo.toml b/Cargo.toml index f3d1ace..bf9a94f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,7 +22,7 @@ include = [ ] [workspace.dependencies] -prosa-utils = { version = "0.4.0", path = "prosa_utils", default-features = false } +prosa-utils = { version = "0.4.1", path = "prosa_utils" } prosa-macros = { version = "0.4.1", path = "prosa_macros" } thiserror = "2" aquamarine = "0.6" @@ -35,9 +35,9 @@ toml = "0.9" # Config Observability log = "0.4" -opentelemetry = { version = "0.29", features = ["metrics", "trace", "logs"] } -opentelemetry_sdk = { version = "0.29", features = ["metrics", "trace", "logs", "rt-tokio"] } -prometheus = { version = "0.14" } +opentelemetry = { version = "0.31.0", features = ["metrics", "trace", "logs"] } +opentelemetry_sdk = { version = "0.31.0", features = ["metrics", "trace", "logs", "rt-tokio"] } +prometheus = { version = "0.14", default-features = false } # Config SSL openssl-sys = { version = "0.9" } diff --git a/prosa/Cargo.toml b/prosa/Cargo.toml index 5b93bdb..944230d 100644 --- a/prosa/Cargo.toml +++ b/prosa/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "prosa" -version = "0.4.0" +version = "0.4.1" authors.workspace = true description = "ProSA core" homepage.workspace = true @@ -10,10 +10,12 @@ license.workspace = true include.workspace = true [features] -default = ["http-proxy", "openssl"] +default = ["system-metrics", "http-proxy", "openssl", "prometheus"] +system-metrics = ["dep:memory-stats"] http-proxy = ["dep:async-http-proxy"] openssl = ["dep:openssl", "dep:tokio-openssl", "prosa-utils/config-openssl"] openssl-vendored = ["openssl", "openssl/vendored", "prosa-utils/config-openssl-vendored"] +prometheus = ["dep:prometheus", "prosa-utils/config-observability-prometheus"] queue = ["prosa-utils/queue"] [[example]] @@ -38,12 +40,11 @@ settings = "stub::proc::StubSettings" adaptor = ["stub::adaptor::StubParotAdaptor"] [dependencies] -prosa-utils = { workspace = true, features = ["msg", "config", "config-observability", "config-observability-prometheus"] } +prosa-utils = { workspace = true, features = ["msg", "config", "config-observability"] } prosa-macros.workspace = true log.workspace = true tracing = "0.1" thiserror.workspace = true -base64 = "0.22" url = { version = "2", features = ["serde"] } rlimit = "0.10" @@ -62,8 +63,8 @@ serde_yaml = "0.9" opentelemetry.workspace = true opentelemetry_sdk.workspace = true -prometheus.workspace = true -memory-stats = "1" +prometheus = { workspace = true, optional = true } +memory-stats = { version = "1", optional = true } [dev-dependencies] futures-util = { version = "0.3", default-features = false } diff --git a/prosa/src/core/main.rs b/prosa/src/core/main.rs index 89aaa99..9cc6a53 100644 --- a/prosa/src/core/main.rs +++ b/prosa/src/core/main.rs @@ -19,11 +19,11 @@ use super::{ use opentelemetry::metrics::{Meter, MeterProvider as _}; use opentelemetry::trace::TracerProvider as _; use opentelemetry::{InstrumentationScope, KeyValue}; -use std::borrow::Cow; use std::sync::{ Arc, atomic::{AtomicBool, Ordering}, }; +use std::{borrow::Cow, collections::HashSet}; use std::{collections::HashMap, fmt::Debug}; use tokio::{signal, sync::mpsc}; use tracing::{debug, info, warn}; @@ -76,6 +76,8 @@ where { internal_tx_queue: mpsc::Sender>, name: String, + scope_attributes: Vec, + #[cfg(feature = "prometheus")] prometheus_registry: prometheus::Registry, meter_provider: opentelemetry_sdk::metrics::SdkMeterProvider, tracer_provider: opentelemetry_sdk::trace::SdkTracerProvider, @@ -105,18 +107,36 @@ where internal_tx_queue: mpsc::Sender>, settings: &S, ) -> Main { - let prometheus_registry = prometheus::Registry::new(); - let meter_provider = settings - .get_observability() - .build_meter_provider(&prometheus_registry); - - Main { - internal_tx_queue, - name: settings.get_prosa_name(), - prometheus_registry, - meter_provider, - tracer_provider: settings.get_observability().build_tracer_provider(), - stop: Arc::new(AtomicBool::new(false)), + #[cfg(feature = "prometheus")] + { + let prometheus_registry = prometheus::Registry::new(); + let meter_provider = settings + .get_observability() + .build_meter_provider(&prometheus_registry); + + Main { + internal_tx_queue, + name: settings.get_prosa_name(), + scope_attributes: settings.get_observability().get_scope_attributes(), + prometheus_registry, + meter_provider, + tracer_provider: settings.get_observability().build_tracer_provider(), + stop: Arc::new(AtomicBool::new(false)), + } + } + + #[cfg(not(feature = "prometheus"))] + { + let meter_provider = settings.get_observability().build_meter_provider(); + + Main { + internal_tx_queue, + name: settings.get_prosa_name(), + scope_attributes: settings.get_observability().get_scope_attributes(), + meter_provider, + tracer_provider: settings.get_observability().build_tracer_provider(), + stop: Arc::new(AtomicBool::new(false)), + } } } @@ -126,6 +146,7 @@ where } /// Getter of the Prometheus registry + #[cfg(feature = "prometheus")] pub fn get_prometheus_registry(&self) -> &prometheus::Registry { &self.prometheus_registry } @@ -236,16 +257,16 @@ where /// Provide the opentelemetry Meter based on ProSA settings pub fn meter(&self, name: &'static str) -> opentelemetry::metrics::Meter { - self.meter_provider.meter(name) + let scope = InstrumentationScope::builder(name) + .with_version(env!("CARGO_PKG_VERSION")) + .with_attributes(self.scope_attributes.clone()) + .build(); + self.meter_provider.meter_with_scope(scope) } /// Provide the opentelemetry Tracer based on ProSA settings pub fn tracer(&self, name: impl Into>) -> opentelemetry_sdk::trace::Tracer { - let scope = InstrumentationScope::builder(name) - .with_version(env!("CARGO_PKG_VERSION")) - .with_attributes([KeyValue::new("prosa_name", self.name.clone())]) - .build(); - self.tracer_provider.tracer_with_scope(scope) + self.tracer_provider.tracer(name) } } @@ -279,16 +300,6 @@ impl MainProc where M: Sized + Clone + Debug + Tvf + Default + 'static + std::marker::Send + std::marker::Sync, { - /// Getter of the number of processors' queues - fn get_proc_queue_len(&self) -> usize { - let mut proc_queue_len = 0; - for proc_queue in self.processors.values() { - proc_queue_len += proc_queue.len(); - } - - proc_queue_len - } - async fn remove_proc(&mut self, proc_id: u32) -> Option>> { if let Some(proc) = self.processors.remove(&proc_id) { let mut new_services = (*self.services).clone(); @@ -423,49 +434,49 @@ where } async fn run(mut self) { - // Monitor RAM usage - let prosa_name = self.name.clone(); + #[cfg(feature = "system-metrics")] + { + // Monitor RAM usage + self.meter + .u64_observable_gauge("prosa_main_ram") + .with_description("RAM consumed by ProSA") + .with_unit("bytes") + .with_callback(move |observer| { + if let Some(usage) = memory_stats::memory_stats() { + observer.observe( + usage.physical_mem as u64, + &[KeyValue::new("type", "physical")], + ); + observer.observe( + usage.virtual_mem as u64, + &[KeyValue::new("type", "virtual")], + ); + } + }) + .build(); + } + + // Monitor services + let (service_update, new_service) = tokio::sync::watch::channel(self.services.clone()); self.meter - .u64_observable_gauge("prosa_main_ram") - .with_description("RAM consumed by ProSA") - .with_unit("bytes") + .u64_observable_gauge("prosa_services") + .with_description("Services declared to the main task") .with_callback(move |observer| { - if let Some(usage) = memory_stats::memory_stats() { - observer.observe( - usage.physical_mem as u64, - &[ - KeyValue::new("prosa_name", prosa_name.clone()), - KeyValue::new("type", "physical"), - ], - ); - observer.observe( - usage.virtual_mem as u64, - &[ - KeyValue::new("prosa_name", prosa_name.clone()), - KeyValue::new("type", "virtual"), - ], - ); - } + new_service.borrow().observe_metrics(observer); }) .build(); - // Monitor services - let services_meter = self - .meter - .u64_gauge("prosa_main_services") - .with_description("Services declared to the main task") - .build(); + let mut proc_names = HashMap::new(); + // Monitor processors objects - let mut crashed_proc = 0; - let mut restarted_proc = 0; + let mut crashed_proc: HashSet = HashSet::new(); + let mut restarted_proc = HashMap::new(); let processors_meter = self .meter - .u64_gauge("prosa_processors") + .i64_gauge("prosa_processors") .with_description("Processors declared to the main task") .build(); - let prosa_name = self.name.clone(); - /// Macro to notify processors for a change about service list macro_rules! prosa_main_update_srv { ( ) => { @@ -475,47 +486,51 @@ where }; } - /// Macro to record a change to the services - macro_rules! prosa_main_record_services { - ( ) => { - services_meter.record( - self.services.len() as u64, - &[KeyValue::new("prosa_name", prosa_name.clone())], - ); - }; - } - /// Macro to record a change to the processors macro_rules! prosa_main_record_proc { ( ) => { - processors_meter.record( - self.processors.len() as u64, - &[ - KeyValue::new("prosa_name", prosa_name.clone()), - KeyValue::new("type", "tasks"), - ], - ); - processors_meter.record( - self.get_proc_queue_len() as u64, - &[ - KeyValue::new("prosa_name", prosa_name.clone()), - KeyValue::new("type", "queues"), - ], - ); - processors_meter.record( - crashed_proc, - &[ - KeyValue::new("prosa_name", prosa_name.clone()), - KeyValue::new("type", "crashed"), - ], - ); - processors_meter.record( - restarted_proc, - &[ - KeyValue::new("prosa_name", prosa_name.clone()), - KeyValue::new("type", "restarted"), - ], - ); + for (id, name) in proc_names.iter() { + if crashed_proc.contains(id) { + // The processor is crashed + processors_meter.record( + -2, + &[ + KeyValue::new("type", "node"), + KeyValue::new("id", *id as i64), + KeyValue::new("title", name.to_string()), + ], + ); + } else if let Some(proc_service) = self.processors.get(id) { + // The processor is running + let nb_restarted = *restarted_proc.get(id).unwrap_or(&0); + processors_meter.record( + proc_service.len() as i64, + &[ + KeyValue::new("type", "queues"), + KeyValue::new("id", *id as i64), + KeyValue::new("title", name.to_string()), + ], + ); + processors_meter.record( + nb_restarted as i64, + &[ + KeyValue::new("type", "node"), + KeyValue::new("id", *id as i64), + KeyValue::new("title", name.to_string()), + ], + ); + } else { + // The processor is not running + processors_meter.record( + -1, + &[ + KeyValue::new("type", "node"), + KeyValue::new("id", *id as i64), + KeyValue::new("title", name.to_string()), + ], + ); + } + } }; } @@ -530,6 +545,7 @@ where if let Some(proc_service) = self.processors.get_mut(&proc_id) { proc_service.insert(queue_id, proc); } else { + proc_names.insert(proc_id, proc.name().to_string()); self.processors.insert(proc_id, HashMap::from([ (queue_id, proc), ])); @@ -553,9 +569,13 @@ where if let Some(err) = proc_err { if err.recoverable() { - restarted_proc += 1; + if let Some(restarted) = restarted_proc.get_mut(&proc_id) { + *restarted += 1; + } else { + restarted_proc.insert(proc_id, 1); + } } else { - crashed_proc += 1; + crashed_proc.insert(proc_id); } } @@ -577,7 +597,7 @@ where } } self.services = Arc::new(new_services); - prosa_main_record_services!(); + let _ = service_update.send(self.services.clone()); prosa_main_update_srv!(); } }, @@ -588,7 +608,7 @@ where new_services.add_service(name, proc_queue.clone()); } self.services = Arc::new(new_services); - prosa_main_record_services!(); + let _ = service_update.send(self.services.clone()); prosa_main_update_srv!(); } }, @@ -598,7 +618,7 @@ where new_services.remove_service_proc(&name, proc_id); } self.services = Arc::new(new_services); - prosa_main_record_services!(); + let _ = service_update.send(self.services.clone()); prosa_main_update_srv!(); }, InternalMainMsg::DeleteService(names, proc_id, queue_id) => { @@ -607,7 +627,7 @@ where new_services.remove_service(&name, proc_id, queue_id); } self.services = Arc::new(new_services); - prosa_main_record_services!(); + let _ = service_update.send(self.services.clone()); prosa_main_update_srv!(); }, InternalMainMsg::Command(cmd)=> { diff --git a/prosa/src/core/proc.rs b/prosa/src/core/proc.rs index 78d2cb3..30cad38 100644 --- a/prosa/src/core/proc.rs +++ b/prosa/src/core/proc.rs @@ -417,6 +417,7 @@ where } /// Getter of the Prometheus registry + #[cfg(feature = "prometheus")] pub fn get_prometheus_registry(&self) -> &prometheus::Registry { self.main.get_prometheus_registry() } @@ -468,8 +469,9 @@ where macro_rules! proc_run { ( $self:ident ) => { info!( - target: $self.name(), - "Run processor on {} threads", + "Run processor[{}] {} on {} threads", + $self.get_proc_id(), + $self.name(), $self.get_proc_threads() ); @@ -489,8 +491,9 @@ macro_rules! proc_run { // Log and restart if needed if proc_err.recoverable() { warn!( - target: $self.name(), - "Processor encounter an error `{}`. Will restart after {}ms", + "Processor[{}] {} encounter an error `{}`. Will restart after {}ms", + $self.get_proc_id(), + $self.name(), proc_err, (wait_time + recovery_duration).as_millis() ); @@ -501,8 +504,9 @@ macro_rules! proc_run { } } else { error!( - target: $self.name(), - "Processor encounter a fatal error `{}`", + "Processor[{}] {} encounter a fatal error `{}`", + $self.get_proc_id(), + $self.name(), proc_err ); diff --git a/prosa/src/core/service.rs b/prosa/src/core/service.rs index d96ffdc..15a7e61 100644 --- a/prosa/src/core/service.rs +++ b/prosa/src/core/service.rs @@ -4,9 +4,10 @@ use super::{ msg::InternalMsg, proc::{ProcBusParam, ProcParam}, }; +use opentelemetry::{KeyValue, metrics::AsyncInstrument}; use prosa_utils::msg::tvf::{Tvf, TvfError}; use std::{ - collections::HashMap, + collections::{HashMap, HashSet}, fmt::{self, Debug}, sync::atomic, }; @@ -20,7 +21,7 @@ where M: Sized + Clone + Tvf, { /// HashMap that contain the service name as key and a vector of processor services with a round robin information - table: HashMap>, atomic::AtomicU64)>, + table: HashMap, (Vec>, atomic::AtomicU64)>, } impl ServiceTable @@ -37,6 +38,33 @@ where self.table.len() } + /// Method to record metrics on the service table + pub(crate) fn observe_metrics(&self, services_meter: &dyn AsyncInstrument) { + for (name, (services, _)) in self.table.iter() { + services_meter.observe( + services.len() as u64, + &[ + KeyValue::new("type", "node"), + KeyValue::new("id", name.to_string()), + ], + ); + let mut processor_link = HashSet::new(); + for service in services { + if processor_link.insert(service.proc_id) { + services_meter.observe( + 1, + &[ + KeyValue::new("type", "link"), + KeyValue::new("id", format!("{name}/{}", service.proc_id)), + KeyValue::new("source", name.to_string()), + KeyValue::new("target", service.proc_id as i64), + ], + ); + } + } + } + } + /// Method to know if the service is available from a processor /// /// Call by the processor to know if a service is available (service test) @@ -71,10 +99,8 @@ where services.push(proc_service); } } else { - self.table.insert( - name.to_string(), - (vec![proc_service], atomic::AtomicU64::new(0)), - ); + self.table + .insert(name.into(), (vec![proc_service], atomic::AtomicU64::new(0))); } } @@ -163,7 +189,7 @@ where M: Sized + Clone + Tvf, { proc_id: u32, - proc_name: String, + proc_name: Box, queue_id: u32, /// Processor queue use to send transactionnal message to the processor pub proc_queue: mpsc::Sender>, @@ -181,7 +207,7 @@ where ) -> ProcService { ProcService { proc_id: proc.get_proc_id(), - proc_name: proc.name().to_string(), + proc_name: proc.name().into(), queue_id, proc_queue, } @@ -191,7 +217,7 @@ where pub fn new_proc(proc: &ProcParam, queue_id: u32) -> ProcService { ProcService { proc_id: proc.get_proc_id(), - proc_name: proc.name().to_string(), + proc_name: proc.name().into(), queue_id, proc_queue: proc.get_service_queue(), } @@ -217,7 +243,7 @@ where } fn name(&self) -> &str { - self.proc_name.as_str() + self.proc_name.as_ref() } } diff --git a/prosa/src/io/stream.rs b/prosa/src/io/stream.rs index 39b58b3..cc2f8ab 100644 --- a/prosa/src/io/stream.rs +++ b/prosa/src/io/stream.rs @@ -9,11 +9,10 @@ use std::{ time::Duration, }; -use prosa_utils::config::ssl::SslConfig; +use prosa_utils::config::{ssl::SslConfig, url_authentication}; #[cfg(feature = "openssl")] use prosa_utils::config::ssl::SslConfigContext; -use base64::{Engine as _, engine::general_purpose::STANDARD}; use serde::{Deserialize, Serialize}; use tokio::{ io::{AsyncRead, AsyncWrite, ReadBuf}, @@ -816,18 +815,7 @@ impl TargetSetting { /// assert_eq!(Some(String::from("Bearer token")), bearer_auth_target.get_authentication()); /// ``` pub fn get_authentication(&self) -> Option { - if let Some(password) = self.url.password() { - if self.url.username().is_empty() { - Some(format!("Bearer {password}")) - } else { - Some(format!( - "Basic {}", - STANDARD.encode(format!("{}:{}", self.url.username(), password)) - )) - } - } else { - None - } + url_authentication(&self.url) } /// Method to init the ssl context out of the ssl target configuration. diff --git a/prosa_book/init.sh b/prosa_book/init.sh index 4847748..b8092a2 100755 --- a/prosa_book/init.sh +++ b/prosa_book/init.sh @@ -3,7 +3,7 @@ PROSA_DIR=`dirname $0` # Download puppet documentation to add it -if [ ! -f $PROSA_DIR/src/ch01-03-puppet.md ]; then curl -H 'Content-type:text/html' https://raw.githubusercontent.com/worldline/Puppet-ProSA/refs/heads/main/README.md -o $PROSA_DIR/src/ch01-03-puppet.md; fi +if [ ! -f $PROSA_DIR/src/ch01-04-puppet.md ]; then curl -H 'Content-type:text/html' https://raw.githubusercontent.com/worldline/Puppet-ProSA/refs/heads/main/README.md -o $PROSA_DIR/src/ch01-04-puppet.md; fi # Set ProSA version VERSION=`grep -oP '(?<=^version = ").*(?=")' $PROSA_DIR/../prosa/Cargo.toml` diff --git a/prosa_book/src/SUMMARY.md b/prosa_book/src/SUMMARY.md index 80cf4f6..f846bb9 100644 --- a/prosa_book/src/SUMMARY.md +++ b/prosa_book/src/SUMMARY.md @@ -11,10 +11,11 @@ - [SSL](ch01-02-02-ssl.md) - [Stream](ch01-02-03-stream.md) - [Run ProSA](ch01-02-04-run.md) - - [Puppet](ch01-03-puppet.md) - - [Cloud](ch01-04-cloud.md) - - [GCP - Cloud Run](ch01-04-01-gcp-cloud_run.md) - - [Clever Cloud](ch01-04-02-clever_cloud.md) + - [Monitoring](ch01-03-monitoring.md) + - [Puppet](ch01-04-puppet.md) + - [Cloud](ch01-05-cloud.md) + - [GCP - Cloud Run](ch01-05-01-gcp-cloud_run.md) + - [Clever Cloud](ch01-05-02-clever_cloud.md) - [Adaptor](ch02-00-adaptor.md) - [TVF](ch02-01-tvf.md) diff --git a/prosa_book/src/ch00-00-prosa.md b/prosa_book/src/ch00-00-prosa.md index f6512c6..365e968 100644 --- a/prosa_book/src/ch00-00-prosa.md +++ b/prosa_book/src/ch00-00-prosa.md @@ -22,4 +22,4 @@ In fact, ProSA contains no direct references to Worldline's private properties. ## Version -This book is intended for version 0.4.0 of ProSA. +This book is intended for version 0.4.1 of ProSA. diff --git a/prosa_book/src/ch01-02-01-observability.md b/prosa_book/src/ch01-02-01-observability.md index 463b2b1..cc149d8 100644 --- a/prosa_book/src/ch01-02-01-observability.md +++ b/prosa_book/src/ch01-02-01-observability.md @@ -12,6 +12,35 @@ You can also configure your processor to act as a server that exposes those metr Of course all configurations can be mixed. You can send your logs to an OpenTelemetry collector and to stdout simultaneously. +### Attributes + +For each of your observability data, you can configure attribute that will add labels on your data. + +These attribute should follow the [OpenTelemetry resource conventions](https://github.com/open-telemetry/semantic-conventions/blob/main/docs/resource/README.md). + +Some of these attributtes are automaticcaly field from ProSA depending of your environment: +- `service.name` took from _prosa name_ +- `host.arch` if detected from the compilation +- `os.type` if the OS was detected +- `service.version` the package version + +For your logs and traces (but not metrics to avoid overloading metrics indexes), you'll find: +- `process.creation.time` +- `process.pid` + +In the configuration you'll have: +```yaml +observability: + attributes: + # Override the service.name from ProSA + service.name: "my_service" + # Overried the version + service.version: "1.0.0" + metric: # metrics params + traces: # traces params + logs: # logs params +``` + ### Stdout If you want to direct all logs to stdout, you can do something like this: @@ -117,3 +146,5 @@ observability: prometheus: endpoint: "0.0.0.0:9090" ``` + +> You also need to enable the feature `prometheus` for ProSA. diff --git a/prosa_book/src/ch01-03-monitoring-grafana_graph.png b/prosa_book/src/ch01-03-monitoring-grafana_graph.png new file mode 100755 index 0000000000000000000000000000000000000000..ed8e082c8aad19c1fd3eafa356645221c73b6d2c GIT binary patch literal 77224 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 indicates that they are running + - orange if they experienced at least one restart + - grey if they are stopped + - red if they crashed +- Services â ¶ + - green if at least one processor exposes it + - grey if they are not available +- Links between processors and services representing processors that expose a service + +From that graph, you have a complete view of your ProSA state. + +### System metrics + +ProSA provides RAM metrics in order to keep track of process allocation. +This could be useful to know if on a VM ProSA is using the RAM, or it's another process on the host. + +It provides 2 `type` of metrics: +- `virtual` for virtual RAM used +- `physical` for physical RAM used + +> To have system metrics, you need to enable the feature `system-metrics` for ProSA. + +## Traces + +Since ProSA is a transactional framework, traces are a must-have to view transaction-relative information. + +![Grafana Trace](ch01-03-monitoring-grafana_trace.png) + +From this global trace, you can have [processor spans](ch02-04-observability.md#traces) attached to it. + +## Logs + +All logs generated by ProSA are available. +Normally processors should use the ProSA [logging](ch02-04-observability.md#logs) system. +If they do not, please refer to your processor to know how to handle them. diff --git a/prosa_book/src/ch01-04-01-gcp-cloud_run.md b/prosa_book/src/ch01-05-01-gcp-cloud_run.md similarity index 100% rename from prosa_book/src/ch01-04-01-gcp-cloud_run.md rename to prosa_book/src/ch01-05-01-gcp-cloud_run.md diff --git a/prosa_book/src/ch01-04-02-clever_cloud.md b/prosa_book/src/ch01-05-02-clever_cloud.md similarity index 100% rename from prosa_book/src/ch01-04-02-clever_cloud.md rename to prosa_book/src/ch01-05-02-clever_cloud.md diff --git a/prosa_book/src/ch01-04-cloud.md b/prosa_book/src/ch01-05-cloud.md similarity index 94% rename from prosa_book/src/ch01-04-cloud.md rename to prosa_book/src/ch01-05-cloud.md index 56ac6d6..9f82a0f 100644 --- a/prosa_book/src/ch01-04-cloud.md +++ b/prosa_book/src/ch01-05-cloud.md @@ -10,13 +10,13 @@ Most of the time, there are PaaS offerings that work with Docker containers and To build a Docker image for your ProSA, refer to the [Cargo-ProSA Container](ch01-01-cargo-prosa.md#container) Select a base image that suits your PaaS requirements and push the generated image to your cloud repository. -You'll find an example in the subsection for [GCP Cloud Run](ch01-04-01-gcp-cloud_run.md) +You'll find an example in the subsection for [GCP Cloud Run](ch01-05-01-gcp-cloud_run.md) ## Rust runtime If your PaaS allows you to use the Rust runtime to run ProSA, you need to use the project generated by [Cargo-ProSA](ch01-01-cargo-prosa.html#use). -For an example, refer to the subsection for [Clever Cloud](ch01-04-02-clever_cloud.md) +For an example, refer to the subsection for [Clever Cloud](ch01-05-02-clever_cloud.md) [^paas]: Platform as a service - Run ProSA as a software without worrying about hardware, system, or infrastructure. diff --git a/prosa_macros/src/settings.rs b/prosa_macros/src/settings.rs index db989fd..0f3c5f7 100644 --- a/prosa_macros/src/settings.rs +++ b/prosa_macros/src/settings.rs @@ -243,6 +243,7 @@ fn generate_struct_impl_settings( } fn set_prosa_name(&mut self, name: std::string::String) { + self.observability.set_prosa_name(name.as_ref()); self.name = Some(name); } diff --git a/prosa_utils/Cargo.toml b/prosa_utils/Cargo.toml index 4f0fdee..9f15fd5 100644 --- a/prosa_utils/Cargo.toml +++ b/prosa_utils/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "prosa-utils" -version = "0.4.0" +version = "0.4.1" authors.workspace = true description = "ProSA utils" homepage.workspace = true @@ -10,15 +10,14 @@ license.workspace = true include.workspace = true [features] -default = ["full"] +default = ["msg", "config", "config-openssl", "config-observability"] msg = [] -config = ["dep:glob","dep:serde","dep:serde_yaml"] +config = ["dep:glob","dep:serde","dep:serde_yaml", "dep:base64"] config-openssl = ["config", "dep:openssl"] config-openssl-vendored = ["config-openssl", "openssl/vendored"] -config-observability = ["dep:log", "dep:tracing-core", "dep:tracing-subscriber", "dep:tracing-opentelemetry", "dep:opentelemetry", "dep:opentelemetry_sdk", "dep:opentelemetry-stdout", "dep:opentelemetry-otlp", "dep:opentelemetry-appender-tracing", "dep:prometheus"] -config-observability-prometheus = ["config-observability", "dep:opentelemetry-prometheus", "dep:tokio", "dep:hyper", "dep:http-body-util", "dep:hyper-util"] +config-observability = ["dep:log", "dep:tracing-core", "dep:tracing-subscriber", "dep:tracing-opentelemetry", "dep:opentelemetry", "dep:opentelemetry_sdk", "dep:opentelemetry-stdout", "dep:opentelemetry-otlp", "dep:opentelemetry-appender-tracing"] +config-observability-prometheus = ["config-observability", "dep:prometheus", "dep:opentelemetry-prometheus", "dep:tokio", "dep:hyper", "dep:http-body-util", "dep:hyper-util"] queue = [] -full = ["msg", "config", "config-openssl", "config-observability", "config-observability-prometheus"] [package.metadata.docs.rs] all-features = true @@ -38,6 +37,7 @@ hex = "0.4" glob = { version = "0.3", optional = true } serde = { workspace = true, optional = true } serde_yaml = { version = "0.9", optional = true } +base64 = { version = "0.22", optional = true } # Config OpenSSL openssl = { workspace = true, optional = true } @@ -46,14 +46,14 @@ openssl = { workspace = true, optional = true } log = { workspace = true, optional = true } tracing-core = { version = "0.1", optional = true } tracing-subscriber = { version = "0.3", features = ["std", "env-filter"], optional = true } -tracing-opentelemetry = { version = "0.30", optional = true } +tracing-opentelemetry = { version = "0.32.1", optional = true } opentelemetry = { workspace = true, optional = true } opentelemetry_sdk = { workspace = true, optional = true } -opentelemetry-stdout = { version = "0.29", optional = true, features = ["metrics", "trace", "logs"]} -opentelemetry-otlp = { version = "0.29", optional = true, features = ["metrics", "trace", "logs", "grpc-tonic"]} +opentelemetry-stdout = { version = "0.31.0", optional = true, features = ["metrics", "trace", "logs"]} +opentelemetry-otlp = { version = "0.31.0", optional = true, features = ["metrics", "trace", "logs", "grpc-tonic"]} prometheus = { workspace = true, optional = true } -opentelemetry-prometheus = { version = "0.29", optional = true } -opentelemetry-appender-tracing = { version = "0.29", optional = true } +opentelemetry-prometheus = { version = "0.31.0", optional = true } +opentelemetry-appender-tracing = { version = "0.31.0", optional = true } # Web Observability tokio = { workspace = true, optional = true } diff --git a/prosa_utils/src/config.rs b/prosa_utils/src/config.rs index 4518a9a..af1fe71 100644 --- a/prosa_utils/src/config.rs +++ b/prosa_utils/src/config.rs @@ -4,9 +4,11 @@ #![doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/doc_assets/settings.svg"))] //! -use std::path::PathBuf; +use std::{path::PathBuf, process::Command}; use thiserror::Error; +use url::Url; +use base64::{Engine as _, engine::general_purpose::STANDARD}; // Feature openssl or rusttls,... pub mod ssl; @@ -40,7 +42,7 @@ pub enum ConfigError { OpenSsl(#[from] openssl::error::ErrorStack), } -/// Method to get the country name from the OS +/// Method to try get the country name from the OS pub fn os_country() -> Option { if let Some(lang) = option_env!("LANG") { let language = if let Some(pos) = lang.find('.') { @@ -57,6 +59,70 @@ pub fn os_country() -> Option { None } +/// Method to try get the hostname from the OS +pub fn hostname() -> Option { + #[cfg(target_family = "unix")] + if let Some(host) = option_env!("HOSTNAME").map(str::trim) + && !host.is_empty() + && !host.contains('\n') + { + return Some(String::from(host)); + } + + #[cfg(target_family = "unix")] + return Command::new("hostname") + .arg("-s") + .output() + .ok() + .and_then(|h| { + str::from_utf8(h.stdout.trim_ascii()) + .ok() + .filter(|h| !h.is_empty() && !h.contains('\n')) + .map(|h| h.to_string()) + }); + + #[cfg(target_family = "windows")] + return Command::new("hostname").output().ok().and_then(|h| { + str::from_utf8(h.stdout.trim_ascii()) + .ok() + .filter(|h| !h.is_empty() && !h.contains('\n')) + .map(|h| h.to_string()) + }); + + #[cfg(all(not(target_family = "unix"), not(target_family = "windows")))] + return None; +} + +/// Method to get authentication value out of URL username/password +/// +/// - If user password is provided, it return *Basic* authentication with base64 encoded username:password +/// - If only password is provided, it return *Bearer* authentication with the password as token +/// +/// ``` +/// use url::Url; +/// use prosa::io::stream::TargetSetting; +/// +/// let basic_auth_target = Url::parse("http://user:pass@localhost:8080").unwrap(); +/// assert_eq!(Some(String::from("Basic dXNlcjpwYXNz")), url_authentication(&basic_auth_target)); +/// +/// let bearer_auth_target = Url::parse("http://:token@localhost:8080").unwrap(); +/// assert_eq!(Some(String::from("Bearer token")), url_authentication(&bearer_auth_target)); +/// ``` +pub fn url_authentication(url: &Url) -> Option { + if let Some(password) = url.password() { + if url.username().is_empty() { + Some(format!("Bearer {password}")) + } else { + Some(format!( + "Basic {}", + STANDARD.encode(format!("{}:{}", url.username(), password)) + )) + } + } else { + None + } +} + #[cfg(test)] mod tests { use super::*; @@ -68,4 +134,24 @@ mod tests { assert_eq!(2, cn.len()); } } + + #[test] + fn test_hostname() { + let host = hostname(); + if let Some(hn) = host { + assert!(!hn.is_empty()); + } + } + + #[test] + fn test_url_authentication_basic() { + let basic_auth_target = Url::parse("http://user:pass@localhost:8080").unwrap(); + assert_eq!(Some(String::from("Basic dXNlcjpwYXNz")), url_authentication(&basic_auth_target)); + } + + #[test] + fn test_url_authentication_bearer() { + let bearer_auth_target = Url::parse("http://:token@localhost:8080").unwrap(); + assert_eq!(Some(String::from("Bearer token")), url_authentication(&bearer_auth_target)); + } } diff --git a/prosa_utils/src/config/observability.rs b/prosa_utils/src/config/observability.rs index fbb3236..1be86d5 100644 --- a/prosa_utils/src/config/observability.rs +++ b/prosa_utils/src/config/observability.rs @@ -1,53 +1,81 @@ //! Definition of Opentelemetry configuration -use opentelemetry::trace::TracerProvider as _; -use opentelemetry_otlp::{ExportConfig, ExporterBuildError, Protocol, WithExportConfig}; +use opentelemetry::{KeyValue, trace::TracerProvider as _}; +use opentelemetry_otlp::{ExportConfig, ExporterBuildError, Protocol, WithExportConfig, WithHttpConfig}; use opentelemetry_sdk::{ logs::SdkLoggerProvider, - metrics::{PeriodicReader, SdkMeterProvider}, + metrics::SdkMeterProvider, trace::{SdkTracerProvider, Tracer}, }; use serde::{Deserialize, Serialize}; -use std::time::Duration; +use std::{collections::HashMap, time::Duration}; use tracing_subscriber::{filter, prelude::*}; use tracing_subscriber::{layer::SubscriberExt, util::TryInitError}; use url::Url; +use crate::config::url_authentication; + use super::tracing::{TelemetryFilter, TelemetryLevel}; /// Configuration struct of an **O**pen **T**e**l**emetry **P**rotocol Exporter #[derive(Debug, Deserialize, Serialize, Clone)] pub(crate) struct OTLPExporterCfg { pub(crate) level: Option, - #[serde(default = "OTLPExporterCfg::get_default_name")] - name: String, endpoint: Url, #[serde(skip_serializing)] timeout_sec: Option, } impl OTLPExporterCfg { - pub(crate) const DEFAULT_TRACER_NAME: &'static str = "prosa"; - - fn get_default_name() -> String { - Self::DEFAULT_TRACER_NAME.into() + pub(crate) fn get_protocol(&self) -> Protocol { + match self.endpoint.scheme().to_lowercase().as_str() { + "grpc" => Protocol::Grpc, + "http/json" => Protocol::HttpJson, + _ => Protocol::HttpBinary, + } } - pub(crate) fn get_protocol(&self) -> Protocol { - if self.endpoint.scheme().to_lowercase() == "grpc" { - Protocol::Grpc - } else { - Protocol::HttpBinary + pub(crate) fn get_header(&self) -> HashMap { + let mut headers = HashMap::with_capacity(1); + if let Some(authorization) = url_authentication(&self.endpoint) { + headers.insert("Authorization".to_string(), authorization); } + headers + } + + pub(crate) fn get_resource( + &self, + attr: Vec, + ) -> opentelemetry_sdk::resource::Resource { + opentelemetry_sdk::resource::Resource::builder() + .with_attributes(attr) + .with_attribute(opentelemetry::KeyValue::new( + "process.creation.time", + chrono::Utc::now().to_rfc3339(), + )) + .with_attribute(opentelemetry::KeyValue::new( + "process.pid", + opentelemetry::Value::I64(std::process::id() as i64), + )) + .build() } } impl From for ExportConfig { fn from(value: OTLPExporterCfg) -> Self { + let protocol = value.get_protocol(); + let mut endpoint = value.endpoint; + if !endpoint.username().is_empty() { + let _ = endpoint.set_username(""); + } + if endpoint.password().is_some() { + let _ = endpoint.set_password(None); + } + ExportConfig { - endpoint: Some(value.endpoint.to_string()), + endpoint: Some(endpoint.to_string()), timeout: value.timeout_sec.map(Duration::from_secs), - protocol: value.get_protocol(), + protocol, } } } @@ -56,7 +84,6 @@ impl Default for OTLPExporterCfg { fn default() -> Self { Self { level: None, - name: Self::get_default_name(), endpoint: Url::parse("grpc://localhost:4317").unwrap(), timeout_sec: None, } @@ -124,6 +151,15 @@ impl PrometheusExporterCfg { Ok(()) } + + pub(crate) fn get_resource( + &self, + attr: Vec, + ) -> opentelemetry_sdk::resource::Resource { + opentelemetry_sdk::resource::Resource::builder() + .with_attributes(attr) + .build() + } } /// Configuration struct of an stdout exporter @@ -146,7 +182,8 @@ impl TelemetryMetrics { /// Build a meter provider based on the self configuration fn build_provider( &self, - registry: &prometheus::Registry, + #[cfg(feature = "config-observability-prometheus")] resource_attr: Vec, + #[cfg(feature = "config-observability-prometheus")] registry: &prometheus::Registry, ) -> Result { let mut meter_provider = SdkMeterProvider::builder(); if let Some(s) = &self.otlp { @@ -158,11 +195,11 @@ impl TelemetryMetrics { } else { opentelemetry_otlp::MetricExporter::builder() .with_http() + .with_headers(s.get_header()) .with_export_config(s.clone().into()) .build() }?; - let reader = PeriodicReader::builder(exporter).build(); - meter_provider = meter_provider.with_reader(reader); + meter_provider = meter_provider.with_periodic_exporter(exporter); } #[cfg(feature = "config-observability-prometheus")] @@ -170,11 +207,13 @@ impl TelemetryMetrics { // configure OpenTelemetry to use this registry let exporter = opentelemetry_prometheus::exporter() .with_registry(registry.clone()) + .with_resource_selector(opentelemetry_prometheus::ResourceSelector::All) .without_target_info() - .without_scope_info() .build() .map_err(|e| ExporterBuildError::InternalFailure(e.to_string()))?; - meter_provider = meter_provider.with_reader(exporter); + meter_provider = meter_provider + .with_resource(prom.get_resource(resource_attr)) + .with_reader(exporter); // Initialize the Prometheus server if needed prom.init_prometheus_server(registry)?; @@ -182,8 +221,7 @@ impl TelemetryMetrics { if self.stdout.is_some() { let exporter = opentelemetry_stdout::MetricExporter::default(); - let reader = PeriodicReader::builder(exporter).build(); - meter_provider = meter_provider.with_reader(reader); + meter_provider = meter_provider.with_periodic_exporter(exporter); } Ok(meter_provider.build()) @@ -220,6 +258,7 @@ impl TelemetryData { /// Build a logger provider based on the self configuration fn build_logger_provider( &self, + resource_attr: Vec, ) -> Result<(SdkLoggerProvider, TelemetryLevel), ExporterBuildError> { let logs_provider = SdkLoggerProvider::builder(); if let Some(s) = &self.otlp { @@ -231,11 +270,15 @@ impl TelemetryData { } else { opentelemetry_otlp::LogExporter::builder() .with_http() + .with_headers(s.get_header()) .with_export_config(s.clone().into()) .build() }?; Ok(( - logs_provider.with_batch_exporter(exporter).build(), + logs_provider + .with_resource(s.get_resource(resource_attr)) + .with_batch_exporter(exporter) + .build(), s.level.unwrap_or_default(), )) } else if let Some(stdout) = &self.stdout { @@ -251,7 +294,10 @@ impl TelemetryData { } /// Build a tracer provider based on the self configuration - fn build_tracer_provider(&self) -> Result { + fn build_tracer_provider( + &self, + resource_attr: Vec, + ) -> Result { let mut trace_provider = SdkTracerProvider::builder(); if let Some(s) = &self.otlp { let exporter = if s.get_protocol() == Protocol::Grpc { @@ -262,37 +308,27 @@ impl TelemetryData { } else { opentelemetry_otlp::SpanExporter::builder() .with_http() + .with_headers(s.get_header()) .with_export_config(s.clone().into()) .build() }?; - trace_provider = trace_provider.with_batch_exporter(exporter); + + trace_provider = trace_provider + .with_resource(s.get_resource(resource_attr)) + .with_batch_exporter(exporter); } Ok(trace_provider.build()) } /// Build a tracer provider based on the self configuration - fn build_tracer(&self) -> Result { - let mut trace_provider = SdkTracerProvider::builder(); - if let Some(s) = &self.otlp { - let exporter = if s.get_protocol() == Protocol::Grpc { - opentelemetry_otlp::SpanExporter::builder() - .with_tonic() - .with_export_config(s.clone().into()) - .build() - } else { - opentelemetry_otlp::SpanExporter::builder() - .with_http() - .with_export_config(s.clone().into()) - .build() - }?; - trace_provider = trace_provider.with_batch_exporter(exporter); - Ok(trace_provider.build().tracer(s.name.clone())) - } else { - Ok(trace_provider - .build() - .tracer(OTLPExporterCfg::DEFAULT_TRACER_NAME)) - } + fn build_tracer( + &self, + name: &str, + resource_attr: Vec, + ) -> Result { + self.build_tracer_provider(resource_attr) + .map(|p| p.tracer(name.to_string())) } } @@ -325,6 +361,11 @@ impl Default for TelemetryData { /// ``` #[derive(Debug, Deserialize, Serialize, Clone)] pub struct Observability { + /// Name of ProSA from observability perspective + service_name: Option, + /// Additional attributes for all telemetry data + #[serde(default)] + attributes: HashMap, /// Global level for observability #[serde(default)] level: TelemetryLevel, @@ -337,9 +378,40 @@ pub struct Observability { } impl Observability { + pub(crate) fn common_scope_attributes(service_name: String, capacity: usize) -> Vec { + let mut scope_attributes = Vec::with_capacity(capacity + 3); + scope_attributes.push(KeyValue::new("service.name", service_name)); + + if cfg!(target_arch = "x86_64") { + scope_attributes.push(KeyValue::new("host.arch", "amd64")); + } else if cfg!(target_arch = "aarch64") { + scope_attributes.push(KeyValue::new("host.arch", "arm64")); + } else if cfg!(target_arch = "arm") { + scope_attributes.push(KeyValue::new("host.arch", "arm32")); + } + + if cfg!(target_os = "linux") { + scope_attributes.push(KeyValue::new("os.type", "linux")); + } else if cfg!(target_os = "macos") { + scope_attributes.push(KeyValue::new("os.type", "darwin")); + } else if cfg!(target_os = "freebsd") { + scope_attributes.push(KeyValue::new("os.type", "freebsd")); + } else if cfg!(target_os = "openbsd") { + scope_attributes.push(KeyValue::new("os.type", "openbsd")); + } else if cfg!(target_os = "netbsd") { + scope_attributes.push(KeyValue::new("os.type", "netbsd")); + } else if cfg!(target_os = "windows") { + scope_attributes.push(KeyValue::new("os.type", "windows")); + } + + scope_attributes + } + /// Create an observability object with inline parameter instead of getting it from an external configuration pub fn new(level: TelemetryLevel) -> Observability { Observability { + service_name: None, + attributes: HashMap::new(), level, metrics: Some(TelemetryMetrics::default()), logs: Some(TelemetryData::default()), @@ -347,6 +419,49 @@ impl Observability { } } + /// Setter of the ProSA name for all observability `service.name` attributes + pub fn set_prosa_name(&mut self, name: &str) { + if self.service_name.is_none() { + self.service_name = Some(name.to_string()); + } + } + + /// Getter of the common scope attributes + pub fn get_scope_attributes(&self) -> Vec { + // start with common attributes + let mut scope_attr = if let Some(service_name) = self.attributes.get("service.name") { + Self::common_scope_attributes(service_name.clone(), self.attributes.len() + 2) + } else { + Self::common_scope_attributes( + self.service_name.clone().unwrap_or("prosa".to_string()), + self.attributes.len() + 2, + ) + }; + + if !self.attributes.contains_key("host.name") + && let Some(hostname) = super::hostname() + { + scope_attr.push(KeyValue::new("host.name", hostname)); + } + + if !self.attributes.contains_key("service.version") { + scope_attr.push(KeyValue::new("service.version", env!("CARGO_PKG_VERSION"))); + } + + // append custom attributes from configuration + scope_attr.append( + self.attributes + .iter() + .map(|(k, v)| { + KeyValue::new(k.clone(), opentelemetry::Value::String(v.clone().into())) + }) + .collect::>() + .as_mut(), + ); + + scope_attr + } + /// Getter of the log level (max value) pub fn get_logger_level(&self) -> TelemetryLevel { if let Some(logs) = &self.logs { @@ -362,9 +477,22 @@ impl Observability { } /// Meter provider builder + #[cfg(feature = "config-observability-prometheus")] pub fn build_meter_provider(&self, registry: &prometheus::Registry) -> SdkMeterProvider { if let Some(settings) = &self.metrics { - settings.build_provider(registry).unwrap_or_default() + settings + .build_provider(self.get_scope_attributes(), registry) + .unwrap_or_default() + } else { + SdkMeterProvider::default() + } + } + + /// Meter provider builder + #[cfg(not(feature = "config-observability-prometheus"))] + pub fn build_meter_provider(&self) -> SdkMeterProvider { + if let Some(settings) = &self.metrics { + settings.build_provider().unwrap_or_default() } else { SdkMeterProvider::default() } @@ -373,7 +501,7 @@ impl Observability { /// Logger provider builder pub fn build_logger_provider(&self) -> (SdkLoggerProvider, TelemetryLevel) { if let Some(settings) = &self.logs { - match settings.build_logger_provider() { + match settings.build_logger_provider(self.get_scope_attributes()) { Ok(m) => m, Err(_) => ( SdkLoggerProvider::builder().build(), @@ -401,7 +529,9 @@ impl Observability { /// ``` pub fn build_tracer_provider(&self) -> SdkTracerProvider { if let Some(settings) = &self.traces { - settings.build_tracer_provider().unwrap_or_default() + settings + .build_tracer_provider(self.get_scope_attributes()) + .unwrap_or_default() } else { SdkTracerProvider::default() } @@ -419,12 +549,17 @@ impl Observability { /// ``` pub fn build_tracer(&self) -> Tracer { if let Some(settings) = &self.traces { - match settings.build_tracer() { + match settings.build_tracer( + self.service_name.as_deref().unwrap_or("prosa"), + self.get_scope_attributes(), + ) { Ok(m) => m, - Err(_) => SdkTracerProvider::default().tracer(OTLPExporterCfg::DEFAULT_TRACER_NAME), + Err(_) => SdkTracerProvider::default() + .tracer(self.service_name.clone().unwrap_or("prosa".to_string())), } } else { - SdkTracerProvider::default().tracer(OTLPExporterCfg::DEFAULT_TRACER_NAME) + SdkTracerProvider::default() + .tracer(self.service_name.clone().unwrap_or("prosa".to_string())) } } @@ -461,7 +596,8 @@ impl Observability { subscriber.try_init() } } else if let Some(logs) = &self.logs - && let Ok((logger_provider, level)) = logs.build_logger_provider() + && let Ok((logger_provider, level)) = + logs.build_logger_provider(self.get_scope_attributes()) && level > TelemetryLevel::OFF { let logger_filter = filter.clone_with_level(level); @@ -482,6 +618,8 @@ impl Observability { impl Default for Observability { fn default() -> Self { Self { + service_name: None, + attributes: HashMap::new(), level: TelemetryLevel::default(), metrics: Some(TelemetryMetrics::default()), logs: Some(TelemetryData { From 376d1ce4ca39c7db0febeff7e500f783cd7cb247 Mon Sep 17 00:00:00 2001 From: Jeremy HERGAULT Date: Tue, 3 Feb 2026 11:17:57 +0100 Subject: [PATCH 2/2] fix: doc tests and fmt Signed-off-by: Jeremy HERGAULT --- prosa/src/io/stream.rs | 2 +- prosa_utils/src/config.rs | 14 ++++++++++---- prosa_utils/src/config/observability.rs | 4 +++- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/prosa/src/io/stream.rs b/prosa/src/io/stream.rs index cc2f8ab..fb19ad2 100644 --- a/prosa/src/io/stream.rs +++ b/prosa/src/io/stream.rs @@ -9,9 +9,9 @@ use std::{ time::Duration, }; -use prosa_utils::config::{ssl::SslConfig, url_authentication}; #[cfg(feature = "openssl")] use prosa_utils::config::ssl::SslConfigContext; +use prosa_utils::config::{ssl::SslConfig, url_authentication}; use serde::{Deserialize, Serialize}; use tokio::{ diff --git a/prosa_utils/src/config.rs b/prosa_utils/src/config.rs index af1fe71..60658a7 100644 --- a/prosa_utils/src/config.rs +++ b/prosa_utils/src/config.rs @@ -6,9 +6,9 @@ use std::{path::PathBuf, process::Command}; +use base64::{Engine as _, engine::general_purpose::STANDARD}; use thiserror::Error; use url::Url; -use base64::{Engine as _, engine::general_purpose::STANDARD}; // Feature openssl or rusttls,... pub mod ssl; @@ -100,7 +100,7 @@ pub fn hostname() -> Option { /// /// ``` /// use url::Url; -/// use prosa::io::stream::TargetSetting; +/// use prosa_utils::config::url_authentication; /// /// let basic_auth_target = Url::parse("http://user:pass@localhost:8080").unwrap(); /// assert_eq!(Some(String::from("Basic dXNlcjpwYXNz")), url_authentication(&basic_auth_target)); @@ -146,12 +146,18 @@ mod tests { #[test] fn test_url_authentication_basic() { let basic_auth_target = Url::parse("http://user:pass@localhost:8080").unwrap(); - assert_eq!(Some(String::from("Basic dXNlcjpwYXNz")), url_authentication(&basic_auth_target)); + assert_eq!( + Some(String::from("Basic dXNlcjpwYXNz")), + url_authentication(&basic_auth_target) + ); } #[test] fn test_url_authentication_bearer() { let bearer_auth_target = Url::parse("http://:token@localhost:8080").unwrap(); - assert_eq!(Some(String::from("Bearer token")), url_authentication(&bearer_auth_target)); + assert_eq!( + Some(String::from("Bearer token")), + url_authentication(&bearer_auth_target) + ); } } diff --git a/prosa_utils/src/config/observability.rs b/prosa_utils/src/config/observability.rs index 1be86d5..f3e2c15 100644 --- a/prosa_utils/src/config/observability.rs +++ b/prosa_utils/src/config/observability.rs @@ -1,7 +1,9 @@ //! Definition of Opentelemetry configuration use opentelemetry::{KeyValue, trace::TracerProvider as _}; -use opentelemetry_otlp::{ExportConfig, ExporterBuildError, Protocol, WithExportConfig, WithHttpConfig}; +use opentelemetry_otlp::{ + ExportConfig, ExporterBuildError, Protocol, WithExportConfig, WithHttpConfig, +}; use opentelemetry_sdk::{ logs::SdkLoggerProvider, metrics::SdkMeterProvider,