后端程序员之路 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 设计指南 - 阮一峰的网络日 ...
随机推荐
- 【noi 2.6_1808】最长公共子序列(DP)
题意:给2个字符串求其最大公共子序列的长度.解法:这个和一般的状态定义有点不一样,f[i][j]表示 str 前i位和 str2 前j的最大公共子序列的长度,而不是选 str 的第i位和 str2 的 ...
- 一张图解决ThreadLocal
一张图解决ThreadLocal 一.前言 年底梳理知识体系时,研究了一下ThreadLocal的源码,整理了一张核心图. 想着,都走到这一步了,那就写一篇深度解读的文章吧.看过我之前文章的小伙伴都知 ...
- 【原创】docker & kubernetes问题总结
1.entrypoint & cmd 指令的区别 这主要考察 Dockerfile 良好实践中关于容器启动时运行的命令. entrypoint 和 cmd 命令都是设置容器启动时要执行的命令, ...
- 模板 Dijkstra+链式前向星+堆优化(非原创)
我们首先来看一下什么是前向星. 前向星是一种特殊的边集数组,我们把边集数组中的每一条边按照起点从小到大排序,如果起点相同就按照终点从小到大排序, 并记录下以某个点为起点的所有边在数组中的起始位置和 ...
- 查找命令中grep,find,which和whereis的使用及区别
在linux系统中,许多时候需要查找某些文件或者字符,如果用ls, cd 等基础命令就显得很无力了,那么Linux提供了grep,find,which 三种查找命令,在这里我记录一下: 一.grep命 ...
- Tomcat连接配置
DBCP连接池配置: <bean class="org.apache.tomcat.jdbc.pool.PoolProperties"> <property na ...
- mybaits(七)spring整合mybaits
与 Spring 整合分析 http://www.mybatis.org/spring/zh/index.html 这里我们以传统的 Spring 为例,因为配置更直观,在 Spring 中使用配置类 ...
- 牛客多校第五场B generator1(十进制矩阵快速幂)题解
题意: 已知 \(X_i = a * X_{i - 1} + b * X_{i - 2}\),现给定\(X_0,X_1,a,b\),询问\(X^n \mod p\),其中\(n <= 10^{1 ...
- apt 和 apt-get 之间有什么区别?
使用ubuntu的朋友一定会接触一个命令就是apt-get . 使用该工具安装各种应用程序那叫一个爽. 在 Ubuntu 16.04 发行后,apt使用渐渐频繁起来. 那么,apt-get 与 apt ...
- ARMv7-A 架构下的MMU
ARM架构中MMU的作用主要就是将CPU发出的虚拟地址转换成为物理地址,从实现内核和用户程序和用户程序之间的虚拟地址空间隔离.MMU的主要组成为两部分,其一是内部的TLBs缓存:还有就是转换表装换单元 ...