From 32e296238bf359134d8a0ead71915ded66daa38e Mon Sep 17 00:00:00 2001 From: brotoskyj Date: Mon, 17 Nov 2025 10:50:02 -0500 Subject: [PATCH] Closes #27 Implemented Opt-in/Opt-Out logic --- airlock_libs/Cargo.lock | 2 +- airlock_libs/Cargo.toml | 2 +- airlock_libs/pyproject.toml | 2 +- airlock_libs/src/services.rs | 68 +++++++++++++++++++++++++++--------- requirements.txt | 2 +- 5 files changed, 55 insertions(+), 21 deletions(-) diff --git a/airlock_libs/Cargo.lock b/airlock_libs/Cargo.lock index 5378795..d087dca 100644 --- a/airlock_libs/Cargo.lock +++ b/airlock_libs/Cargo.lock @@ -26,7 +26,7 @@ dependencies = [ [[package]] name = "airlock_libs" -version = "3.0.0" +version = "3.1.0" dependencies = [ "chrono", "indicatif", diff --git a/airlock_libs/Cargo.toml b/airlock_libs/Cargo.toml index 782fd33..57b50bf 100644 --- a/airlock_libs/Cargo.toml +++ b/airlock_libs/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "airlock_libs" -version = "3.0.0" +version = "3.1.0" edition = "2024" [lib] diff --git a/airlock_libs/pyproject.toml b/airlock_libs/pyproject.toml index e6e5151..995ef7f 100644 --- a/airlock_libs/pyproject.toml +++ b/airlock_libs/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "maturin" [project] name = "airlock_libs" -version = "3.0.0" +version = "3.1.0" description = "Airlock Digital API Wrapper" readme = "README.md" license = { text = "AGPL-3.0-only" } diff --git a/airlock_libs/src/services.rs b/airlock_libs/src/services.rs index bcde4ce..5d14698 100644 --- a/airlock_libs/src/services.rs +++ b/airlock_libs/src/services.rs @@ -3,6 +3,7 @@ use indicatif::{MultiProgress, ProgressBar, ProgressDrawTarget, ProgressStyle}; use mongodb::bson::oid::ObjectId; use opentelemetry::global::shutdown_tracer_provider; use opentelemetry::sdk::Resource; +use opentelemetry::trace::noop::NoopTracerProvider; use opentelemetry::trace::{Status, TraceContextExt, TraceError}; use opentelemetry::{Context, KeyValue, sdk::trace as sdktrace, trace::Tracer}; use opentelemetry::{Key, global}; @@ -23,7 +24,12 @@ use std::{ path::PathBuf, str::FromStr, }; -use tracing_subscriber::prelude::*; + +#[derive(Deserialize, Debug)] +struct TelemetryConfig { + TELEMETRY: bool, + TELEM_URL: Option, +} #[derive(Debug, Deserialize, Serialize)] struct ApiResponse { @@ -140,7 +146,6 @@ pub fn pull_policy_exec_histories( let span = cx.span(); span.set_attribute(Key::new("Days").string(days.to_string().to_string())); loop { - tracing::info!("Starting Airlock Data Retrieval"); f.seek(SeekFrom::Start(0)).unwrap(); let execution_histories = tracer.in_span(checkpoint_number.to_string(), |cx| { let results: ApiResponse = history_logging( @@ -329,19 +334,48 @@ fn skipback(days: i64) -> ObjectId { ObjectId::parse_str(&objectid_hex).expect("Invalid ObjectId hex") } -fn init_tracer() -> Result { - opentelemetry_otlp::new_pipeline() - .tracing() - .with_exporter( - opentelemetry_otlp::new_exporter() - .tonic() - .with_endpoint("https://signoz.racooncity.org"), - ) - .with_trace_config( - sdktrace::config().with_resource(Resource::new(vec![KeyValue::new( - "service.name", - "LoxideLibs", - )])), - ) - .install_simple() +fn load_telemetry_config() -> TelemetryConfig { + let cfg_path = get_base_directory().join("config\\user_config.json"); + if !cfg_path.exists() { + return TelemetryConfig { + TELEMETRY: false, + TELEM_URL: None, + }; + } + match fs::read_to_string(&cfg_path) { + Ok(contents) => { + serde_json::from_str::(&contents).unwrap_or(TelemetryConfig { + TELEMETRY: false, + TELEM_URL: None, + }) + } + Err(_) => TelemetryConfig { + TELEMETRY: false, + TELEM_URL: None, + }, + } +} + +fn init_tracer() -> Result, TraceError> { + let cfg = load_telemetry_config(); + if !cfg.TELEMETRY { + global::set_tracer_provider(NoopTracerProvider::new()); + println!("Telemetry Disabled by Config"); + return Ok(None); + } + let endpoint = cfg.TELEM_URL.unwrap_or_default(); + let tracer = + opentelemetry_otlp::new_pipeline() + .tracing() + .with_exporter( + opentelemetry_otlp::new_exporter() + .tonic() + .with_endpoint(endpoint), + ) + .with_trace_config(sdktrace::config().with_resource(Resource::new(vec![ + KeyValue::new("service.name", "LoxideLibs"), + ]))) + .install_simple() + .unwrap(); + Ok(Some(tracer)) } diff --git a/requirements.txt b/requirements.txt index 1468119..fe6d28a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -11,4 +11,4 @@ urllib3==2.5.0 pyperclip==1.11.0 --extra-index-url https://git.racooncity.org/api/packages/brotoskyj/pypi/simple/ -airlock_libs==3.0.0 \ No newline at end of file +airlock_libs==3.1.0 \ No newline at end of file