in src/plugin/plugin_memcached.rs [255:304]
fn hook_memcached_server_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 server_key = {
let server_key = execute_data.get_parameter(0);
if server_key.get_type_info().is_string() {
Some(server_key.clone())
} else {
// The `*Multi` methods will failed here.
warn!(function_name, "The argument server_key isn't string");
None
}
};
let key = execute_data
.get_parameter(1)
.as_z_str()
.and_then(|key| key.to_str().ok())
.map(ToOwned::to_owned);
let this = get_this_mut(execute_data)?;
let peer = server_key
.map(|server_key| get_peer(this, server_key))
.unwrap_or_default();
debug!(peer, "Get memcached peer");
let tag_info = MEMCACHE_SERVER_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.as_deref(),
)?;
Ok(Box::new(span))
}),
Box::new(after_hook),
)
}