use anyhow::Result;
use lunatic_common_api::{get_memory, IntoTrap};
use metrics::{counter, decrement_gauge, gauge, histogram, increment_counter, increment_gauge};
use wasmtime::{Caller, Linker};
pub fn register<T: 'static>(linker: &mut Linker<T>) -> anyhow::Result<()> {
linker.func_wrap("lunatic::metrics", "counter", counter)?;
linker.func_wrap("lunatic::metrics", "increment_counter", increment_counter)?;
linker.func_wrap("lunatic::metrics", "gauge", gauge)?;
linker.func_wrap("lunatic::metrics", "increment_gauge", increment_gauge)?;
linker.func_wrap("lunatic::metrics", "decrement_gauge", decrement_gauge)?;
linker.func_wrap("lunatic::metrics", "histogram", histogram)?;
Ok(())
}
fn get_string_arg<T>(
caller: &mut Caller<T>,
name_str_ptr: u32,
name_str_len: u32,
func_name: &str,
) -> Result<String> {
let memory = get_memory(caller)?;
let memory_slice = memory.data(caller);
let name = memory_slice
.get(name_str_ptr as usize..(name_str_ptr + name_str_len) as usize)
.or_trap(func_name)?;
let name = String::from_utf8(name.to_vec()).or_trap(func_name)?;
Ok(name)
}
fn counter<T>(
mut caller: Caller<'_, T>,
name_str_ptr: u32,
name_str_len: u32,
value: u64,
) -> Result<()> {
let name = get_string_arg(
&mut caller,
name_str_ptr,
name_str_len,
"lunatic::metrics::counter",
)?;
counter!(name, value);
Ok(())
}
fn increment_counter<T>(
mut caller: Caller<'_, T>,
name_str_ptr: u32,
name_str_len: u32,
) -> Result<()> {
let name = get_string_arg(
&mut caller,
name_str_ptr,
name_str_len,
"lunatic::metrics::increment_counter",
)?;
increment_counter!(name);
Ok(())
}
fn gauge<T>(
mut caller: Caller<'_, T>,
name_str_ptr: u32,
name_str_len: u32,
value: f64,
) -> Result<()> {
let name = get_string_arg(
&mut caller,
name_str_ptr,
name_str_len,
"lunatic::metrics::gauge",
)?;
gauge!(name, value);
Ok(())
}
fn increment_gauge<T>(
mut caller: Caller<'_, T>,
name_str_ptr: u32,
name_str_len: u32,
value: f64,
) -> Result<()> {
let name = get_string_arg(
&mut caller,
name_str_ptr,
name_str_len,
"lunatic::metrics::increment_gauge",
)?;
increment_gauge!(name, value);
Ok(())
}
fn decrement_gauge<T>(
mut caller: Caller<'_, T>,
name_str_ptr: u32,
name_str_len: u32,
value: f64,
) -> Result<()> {
let name = get_string_arg(
&mut caller,
name_str_ptr,
name_str_len,
"lunatic::metrics::decrement_gauge",
)?;
decrement_gauge!(name, value);
Ok(())
}
fn histogram<T>(
mut caller: Caller<'_, T>,
name_str_ptr: u32,
name_str_len: u32,
value: f64,
) -> Result<()> {
let name = get_string_arg(
&mut caller,
name_str_ptr,
name_str_len,
"lunatic::metrics::histogram",
)?;
histogram!(name, value);
Ok(())
}