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()
}