in src/plugin/plugin_redis.rs [209:271]
fn hook_redis_connect(
&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| {
if execute_data.num_args() < 2 {
debug!("argument count less than 2, skipped.");
return Ok(Box::new(()));
}
let host = {
let f = || {
Ok::<_, anyhow::Error>(
execute_data
.get_parameter(0)
.as_z_str()
.context("isn't string")?
.to_str()?
.to_owned(),
)
};
match f() {
Ok(host) => host,
Err(err) => {
warn!(?err, "parse first argument to host failed, skipped.");
return Ok(Box::new(()));
}
}
};
let port = {
let port = execute_data.get_parameter(1);
if let Some(port) = port.as_long() {
port.to_string()
} else if let Some(port) = port.as_z_str() {
port.to_str().unwrap_or("0").to_string()
} else {
warn!("parse second argument to port failed, skipped.");
return Ok(Box::new(()));
}
};
let this = get_this_mut(execute_data)?;
let addr = format!("{}:{}", host, port);
debug!(addr, "Get redis peer");
PEER_MAP.insert(this.handle(), Peer { addr: addr.clone() });
let mut span = RequestContext::try_with_global_ctx(request_id, |ctx| {
Ok(ctx.create_exit_span(&format!("{}->{}", class_name, function_name), &addr))
})?;
let span_object = span.span_object_mut();
span_object.set_span_layer(SpanLayer::Cache);
span_object.component_id = COMPONENT_PHP_REDIS_ID;
span_object.add_tag(TAG_CACHE_TYPE, "redis");
Ok(Box::new(span))
}),
Box::new(after_hook),
)
}