use std::sync::atomic::{AtomicI64, AtomicU64, Ordering};
use std::sync::LazyLock;
use dashmap::DashMap;
static WORKSPACE_PINNED: LazyLock<DashMap<String, AtomicU64>> =
LazyLock::new(DashMap::new);
static WORKSPACE_STRANDED: LazyLock<DashMap<String, AtomicU64>> =
LazyLock::new(DashMap::new);
static WORKSPACE_RESUMED: LazyLock<DashMap<String, AtomicU64>> =
LazyLock::new(DashMap::new);
static WORKSPACE_ABANDONED: LazyLock<DashMap<String, AtomicU64>> =
LazyLock::new(DashMap::new);
static WORKSPACE_STRANDED_ACTIVE: AtomicI64 = AtomicI64::new(0);
#[inline]
fn incr_labeled(map: &DashMap<String, AtomicU64>, label: &str) {
map.entry(label.to_string())
.or_insert_with(|| AtomicU64::new(0))
.fetch_add(1, Ordering::Relaxed);
}
pub fn incr_workspace_pinned(reason: &str) {
incr_labeled(&WORKSPACE_PINNED, reason);
tracing::info!(
metric = "dkod_workspace_pinned_total",
reason,
increment = 1,
"metrics counter"
);
}
pub fn incr_workspace_stranded(reason: &str) {
incr_labeled(&WORKSPACE_STRANDED, reason);
tracing::info!(
metric = "dkod_workspace_stranded_total",
reason,
increment = 1,
"metrics counter"
);
}
pub fn incr_workspace_resumed(outcome: &str) {
incr_labeled(&WORKSPACE_RESUMED, outcome);
tracing::info!(
metric = "dkod_workspace_resumed_total",
outcome,
increment = 1,
"metrics counter"
);
}
pub fn incr_workspace_abandoned(reason: &str) {
incr_labeled(&WORKSPACE_ABANDONED, reason);
tracing::info!(
metric = "dkod_workspace_abandoned_total",
reason,
increment = 1,
"metrics counter"
);
}
pub fn set_workspace_stranded_active(n: i64) {
WORKSPACE_STRANDED_ACTIVE.store(n, Ordering::Relaxed);
tracing::info!(
metric = "dkod_workspace_stranded_active",
value = n,
"metrics gauge"
);
}
pub fn workspace_pinned_total() -> u64 {
WORKSPACE_PINNED
.iter()
.map(|e| e.value().load(Ordering::Relaxed))
.sum()
}
pub fn workspace_stranded_total() -> u64 {
WORKSPACE_STRANDED
.iter()
.map(|e| e.value().load(Ordering::Relaxed))
.sum()
}
pub fn workspace_resumed_total() -> u64 {
WORKSPACE_RESUMED
.iter()
.map(|e| e.value().load(Ordering::Relaxed))
.sum()
}
pub fn workspace_abandoned_total() -> u64 {
WORKSPACE_ABANDONED
.iter()
.map(|e| e.value().load(Ordering::Relaxed))
.sum()
}
pub fn workspace_stranded_active() -> i64 {
WORKSPACE_STRANDED_ACTIVE.load(Ordering::Relaxed)
}