一、什么是bvar
bvar是brpc的几个组件之一,bvar模块相对独立,可以单独编译和应用。
Bvar 有两个基本成员,名字和统计值(key和value)。Bvar使用thread local存储,这使得写没有竞争,读的时候进行合并多个线程的数据,需要同步竞争保证。
二、bvar的结构
bvar大体分为这几个组成要素:
- Reducer.h:聚合收敛数据结构,有Adder, Maxer, Miner。这3个类又统称为Reducer,Reducer的一个重要特征是满足交换结合律
- Recorder.h包含Stat,IntRecorder,可用于计算平均值。
- Status.h包含Status:修改Status后立即可见
- Passive_status.h,和Status相对于的是PassiveStatus,PassiveStatus的获取依赖于用户获取操作,才触发获取值,有时候无法set_value或不知道以何种频率set_value,在需要显示时才打印。用户传入打印回调函数实现这个目的
- Latency_recorder.h包含LatencyRecord,记录最近一段时间的数据、QPS数据
- ScopeTimer
- Gflag
2.1 Variable基类
这些类的基类是Variable,他主要提供全局key map注册自定义的bvar,并且加入了列举,查询等功能。
2.2.1 显式expose
varibale的expose方法注册自己到全局VarMap,同时设置key。我们可以方便的通过Brpc提供的一个服务器dump进程遍历查看VarMap。expose的使用方法如下:
代码语言:c 复制bvar::LatencyRecorder _latency_recorder;
bvar::Adder<int64_t> _error_count;
_latency_recorder.expose("rpc_press");
_error_count.expose("rpc_press_error_count");
2.2.2 隐式expose
另外bvar提供了另一种构造方法。这种构造方法默认进行了expose注册操作。
比如这种,就不需要在显式调用c->expose
代码语言:javascript复制bvar::Adder<int> c("demo");
2.3 Windows类和PerSecond类
bvar还提供一个方便的类叫Window。想象以下场景
Adder是累加的,任何时候拿到的是累計值。如果需要统计一段时间內的数据,这个就需要windows的帮助。还有如果需要计算Variabl每秒的平均值,那么就需要使用bvar::PerSecond<>。写法如下:
代码语言:javascript复制bvar::Adder<int> demo("demo");
bvar::Window<bvar::Adder<int>> demo_window("adderWindow", &demo, 3);
bvar::PerSecond<bvar::Adder<int>> demo_persecond("adderPersecond", &demo, 1);