rust_observer 0.2.2

Express telemetry rust SDK
Documentation
use crate::tracing::RNG;
use chrono::Utc;
use once_cell::sync::Lazy;
use parking_lot::RwLock;
use std::process;
use std::sync::Arc;

pub struct GlobalContext {
    pub project_name: String,
    pub app_name: String,
    pub service_name: String,
    pub replica_id: String,
}

fn generate_replica_id() -> String {
    let timestamp = Utc::now().timestamp() % 10000;
    let pid = process::id();
    let random_part: u16 = {
        let mut rng = RNG.lock().unwrap();
        rng.u16(..10000)
    };
    format!("{:04}-{:05}-{:04}", timestamp, pid, random_part)
}

pub static GLOBAL_CONTEXT: Lazy<Arc<RwLock<GlobalContext>>> = Lazy::new(|| {
    Arc::new(RwLock::new(GlobalContext {
        project_name: String::new(),
        app_name: String::new(),
        service_name: String::new(),
        replica_id: generate_replica_id(),
    }))
});

pub fn initialize_global_context(project_name: String, app_name: String, service_name: String) {
    let mut context = GLOBAL_CONTEXT.write();
    context.project_name = project_name;
    context.app_name = app_name;
    context.service_name = service_name;
}

pub fn get_global_context() -> Arc<RwLock<GlobalContext>> {
    GLOBAL_CONTEXT.clone()
}