in src/plugin/plugin_redis.rs [273:326]
fn hook_redis_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 handle = get_this_mut(execute_data)?.handle();
debug!(handle, function_name, "call redis method");
let peer = PEER_MAP
.get(&handle)
.map(|r| r.value().addr.clone())
.unwrap_or_default();
let function_name_key = &*function_name.to_ascii_lowercase();
let op = if REDIS_READ_MAPPING.contains_key(function_name_key) {
Some("read")
} else if REDIS_WRITE_MAPPING.contains_key(function_name_key) {
Some("write")
} else {
None
};
let key = op
.and_then(|_| execute_data.get_parameter(0).as_z_str())
.and_then(|s| s.to_str().ok());
debug!(handle, cmd = function_name, key, op, "call redis command");
let mut span = RequestContext::try_with_global_ctx(request_id, |ctx| {
Ok(ctx.create_exit_span(&format!("{}->{}", class_name, function_name), &peer))
})?;
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");
span_object.add_tag(
TAG_CACHE_CMD,
*REDIS_ALL_MAPPING.get(function_name_key).unwrap(),
);
if let Some(op) = op {
span_object.add_tag(TAG_CACHE_OP, op);
}
if let Some(key) = key {
span_object.add_tag(TAG_CACHE_KEY, key)
}
Ok(Box::new(span))
}),
Box::new(after_hook),
)
}