in src/plugin/plugin_memcached.rs [205:252]
fn hook_memcached_key_methods(
&self, class_name: &str, function_name: &str,
) -> (Box<BeforeExecuteHook>, Box<AfterExecuteHook>) {
let class_name = class_name.to_owned();
let function_name = function_name.to_owned();
(
Box::new(move |request_id, execute_data| {
let key = {
let key = execute_data.get_parameter(0);
if key.get_type_info().is_string() {
Some(key.clone())
} else {
// The `*Multi` methods will failed here.
warn!("The argument key of {} isn't string", &function_name);
None
}
};
let key_str = key
.as_ref()
.and_then(|key| key.as_z_str())
.and_then(|key| key.to_str().ok())
.map(ToOwned::to_owned);
let this = get_this_mut(execute_data)?;
let peer = key.map(|key| get_peer(this, key)).unwrap_or_default();
debug!(peer, "Get memcached peer");
let tag_info = MEMCACHE_KEY_METHOD_MAPPING
.get(&*function_name.to_ascii_lowercase())
.unwrap();
let span = create_exit_span(
request_id,
&class_name,
&function_name,
&peer,
tag_info,
key_str.as_deref(),
)?;
Ok(Box::new(span))
}),
Box::new(after_hook),
)
}