在每个agent里面有一个 AgentStats 变量as.
AgentStats as;
AgentStats.h*
1`
multilate.cc 203行 Agent的as变量从ConnetionStats 变量stats里面获取agent上所有connetions的latency统计信息
multilate.cc 724行,使用一个Connection stats 去汇总不同线程的Connection stats.
每个Connection 有一个ConnectionStats变量,该变量又包含LogHistorgramSampler。LogHistorgramSampler才是真正统计latency的类。但在ConnectionStats层面负责计算不同百分位的latency.
ConnectionStats.h 保存每个connection的latency 统计数据
public members:
获取某个百分位的latency 以及合并另一个Connectionstats的latency统计数据
print_stats
在每个Connection 里面保存一个 ConnectionStats 私有变量。
ConnectionStats stats;
Connection.cc 中,(1)发送完一个set请求后,stats.tx_bytes+=1 (2)将请求封装为一个Operation op,并记录该请求的start_time和将该op添加到op_queue队列末尾
在Connection的beffer_event_read_cb 函数里面调用 conn->read_callback()
Furthermore, at line 379 从op_queue中取出队首的元素,作为返回结果对应的op。
at line 387 调用protocol类的handle_response处理返回response 的内容,实际上为bufferevent 的input buffer 中的内容。 其中done为bool变量,表示handle_response函数对返回内容的处理结果。
如果done=True, 391行则调用finsh_op()函数。
在Protocol.cc 中有个handle_response 函数。
Conection.cc 中finish_op 函数中,首先获取当前时间作为op的end_time。
232-234行,根据op的类型(get或者set请求),用不同的stats统计它们的latency.
ConnectionStats.h
line 61, 可以看到,实际的QPS = 发送出去的get和set请求之和 除以 运行时长
LogHistorgramSampler.h
LogHistorgramSampler 为实际统计一个connection get或者set 请求latency百分比的工具类
在 33 行, 调用op的方法计算该op的latency 为
double time() const { return (end_time - start_time) * 1000000; }