后端程序员之路 4、一种monitor的做法
record_t
包含_sum、_count、_time_stamp、_max、_min
最基础的一条记录,可以用来记录最大值、最小值、计数、总和
metric_t含有RECORD_NUM(6)份record_t,当metric_t::add调用时更新record_t的内容
metric_t
包含_name、_records[6]、_sample_vals[500]、_threshold_rate、_cursor、_operation、_cur_time_stamp
monitor_data_t含有METRICS_NUM(1500)份metric_t,当monitor_data_t::add调用时更新,调用在monitor的_thread_main里发生
monitor_data_t
包含_mutex、_metrics[1500]、_cursor、_init_flag
monitor_t含有一份monitor_data_t,mmap到指定的db_file
在_thread_main里修改内容时,会使用PTHREAD_PROCESS_SHARED、PTHREAD_MUTEX_ADAPTIVE_NP的_mutex
update_para_t
包含key、val、threshold_rate、op{AVG、INC、MIN、MAX、SMP(取样)}
封装每一次对记录的更新操作,会放到monitor_t的_data_q队列,在线程里定时处理
monitor_t
包含_p_monitor_data、_map_file、_lock_file、_init_flag、_data_q、_processor、_update_interval
_data_q是boost::lockfree::queue<update_para_t_ptr, boost::lockfree::capacity<DEFAULT_MAX_QUEUE_SIZE> >
程序启动时,指定映射的文件和间隔时间,创建处理线程。
monitor_t::get_instance().init(db_file, interval);
monitor_t::get_instance().start();
int monitor_t::inc(const std::string& key, double value) {
return monitor_t::get_instance().update(key, value, 1, INC);
}
int monitor_t::max(const std::string& key, double value) {
return monitor_t::get_instance().update(key, value, 1, MAX);
}
int monitor_t::min(const std::string& key, double value) {
return monitor_t::get_instance().update(key, value, 1, MIN);
}
int monitor_t::avg(const std::string& key, double value, double threshold_rate) {
return monitor_t::get_instance().update(key, value, threshold_rate, AVG);
}
int monitor_t::smp(const std::string& key, double value, double threshold_rate) {
return monitor_t::get_instance().update(key, value, threshold_rate, SMP);
}
monitor_t::update将数据处理成update_para_t,放入_data_q
_thread_main将_data_q刷到mmap和buffer
总结:
1、提供峰值、平均值、计数统计等监控形式
2、监控结果写到内存映射文件
3、通过脚本调其它小程序将监控数据转成zabbix统计数据
后端程序员之路 4、一种monitor的做法的更多相关文章
- 后端程序员之路 8、一种内存kv数据库的实现
键值(Key-Value)存储数据库,这是一种NoSQL(非关系型数据库)模型,其数据按照键值对的形式进行组织.索引和存储.KV存储非常适合不涉及过多数据关系业务关系的业务数据,同时能有效减少读写磁盘 ...
- 后端程序员之路 16、信息熵 、决策树、ID3
信息论的熵 - guisu,程序人生. 逆水行舟,不进则退. - 博客频道 - CSDN.NEThttp://blog.csdn.net/hguisu/article/details/27305435 ...
- 后端程序员之路 59、go uiprogress
gosuri/uiprogress: A go library to render progress bars in terminal applicationshttps://github.com/g ...
- 后端程序员之路 45、nginx CORS 跨域
在提供api给其它应用使用时,有时我们会要限制它的跨域使用,而有时,我们又要用CORS来打破AJAX只能同源使用的限制 跨域资源共享 CORS 详解 - 阮一峰的网络日志http://www.ruan ...
- 后端程序员之路 43、Redis list
Redis数据类型之LIST类型 - Web程序猿 - 博客频道 - CSDN.NEThttp://blog.csdn.net/thinkercode/article/details/46565051 ...
- 后端程序员之路 37、Akka、Actor、Scala初窥
Akkahttp://akka.io/ Akka 是一个用 Scala 编写的库,用于简化编写容错的.高可伸缩性的 Java 和 Scala 的 Actor 模型应用,是一个广泛运用的分布式应用框架. ...
- 后端程序员之路 33、Index搜索引擎实现分析2-对外接口和大体流程
# index_manager的单例是index server对外的唯一接口,part_indexer是index搜索的核心部分,index_manager持有了一组part_indexer. typ ...
- 后端程序员之路 26、CAP理论
可能是CAP理论的最好解释 - 西代零零发 - 博客频道 - CSDN.NEThttp://blog.csdn.net/dc_726/article/details/42784237 CAP理论 - ...
- 后端程序员之路 22、RESTful API
理解RESTful架构 - 阮一峰的网络日志http://www.ruanyifeng.com/blog/2011/09/restful.html RESTful API 设计指南 - 阮一峰的网络日 ...
随机推荐
- I - Swap(交换行列是对角线都为1)
Given an N*N matrix with each entry equal to 0 or 1. You can swap any two rows or any two columns. C ...
- Codeforces Round #608 (Div. 2) E. Common Number (二分,构造)
题意:对于一个数\(x\),有函数\(f(x)\),如果它是偶数,则\(x/=2\),否则\(x-=1\),不断重复这个过程,直到\(x-1\),我们记\(x\)到\(1\)的这个过程为\(path( ...
- 向 3D 世界迈出一小步
前言 OpenGL 的学习资料很多,一个是比较著名的 OpenGL 红宝书<OpenGL 编程指南>,可以在这里 http://opengl-redbook.com/ 下载该书配套的源代码 ...
- Cobbler自定义标题及菜单密码
sha1pass mypassword || openssl passwd -1 -salt sXiKzkus mypassword $1$sXiKzkus$x12Z3ZaiC34GhceLH5LXw ...
- DOCKER - 构建一个docker镜像并跑起来
一.有个基础镜像 1.基础镜像的选择 当前市场有众多可选择的基础docker镜像,可参考: https://blog.csdn.net/nklinsirui/article/details/80967 ...
- Crontab 简单实现树莓派语音闹钟
树莓派实验室按:这是来自 hyhmnn 的投稿.是时候关掉你的手机闹铃了,用树莓派外接一个音箱就可以 Make 一款科技感和实用性兼备的"AI 闹钟".这里用到了 Linux 的计 ...
- select函数详细用法解析
1.表头文件 #include #include #include 2.函数原型 int select(int n,fd_set * readfds,fd_set * writefds,fd_set ...
- 20 个使用原生 JavaScript 实现的 Web 项目
20 个使用原生 JavaScript 实现的 Web 项目 20 vanilla JavaScript Web Projects https://github.com/learning-js-by- ...
- LeetCode 题解 593. Valid Square (Medium)
LeetCode 题解 593. Valid Square (Medium) 判断给定的四个点,是否可以组成一个正方形 https://leetcode.com/problems/valid-squa ...
- CSS & Architecture
CSS & Architecture https://sass-guidelin.es/#architecture https://sass-guidelin.es/#the-7-1-patt ...