fn hook_memcached_key_methods()

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