后端程序员之路 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 设计指南 - 阮一峰的网络日 ...
随机推荐
- c++格式化输入输出以及操纵器的使用
C++格式化输入和输出 1,ios类中定义的格式控制标志 ios类中定义了一个数据成员:格式控制标志字,long x_flags x_flags每一位的状态值用枚举符号常量定义:如下列出常用几个 en ...
- Codeforces Round #613 (Div. 2) A. Mezo Playing Zoma(逻辑)
题意: 给出一个移动序列,可以无效化一些指令,问可以移动到多少不同位置. 思路: 第一印象是统计左右指令数目,后来发现左右指令数目和即字符串长度. #include <bits/stdc++.h ...
- SCZ 20170812 T1 HKJ
因为题面实在是太过暴力,就不贴链接了--我自己重新写一下题面吧-- 题目描述 给定一张带权有向图,设起点为1,终点为n,每个点除编号外还有一个序号,要求输出从起点至终点的最短路经过的点的序号和最短距离 ...
- CodeForces 630Q Pyramids(数学公式)
IT City administration has no rest because of the fame of the Pyramids in Egypt. There is a project ...
- Kubernets二进制安装(17)之安装部署Dashboard
1.下载dashboard镜像 在运维主机(mfyxw50.mfyxw.com)上执行命令 [root@mfyxw50 ~]# docker pull registry.cn-hangzhou.ali ...
- K8S(10)配置中心实战-configmap资源
k8s配置中心实战-configmap资源 目录 k8s配置中心实战-configmap资源 0 configmap前置说明 0.1.1 configmap和secret 0.1.2 怎么使用conf ...
- oslab oranges 一个操作系统的实现 实验二 认识保护模式
https://github.com/yyu/osfs00 实验目的: 理解x86架构下的段式内存管理 掌握实模式和保护模式下段式寻址的组织方式. 关键数据结构.代码组织方式 掌握实模式与保护模式的切 ...
- Leetcode(213)-打家劫舍II
你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金.这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的.同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在 ...
- JavaScript事件绑定的三种方式
(一)事件绑定的三种方式 (1)通过on的形式 <script type="text/javascript"> var div = document.getElemen ...
- console.dir()可以显示一个对象所有的属性和方法
console.dir()可以显示一个对象所有的属性和方法 具体方法如下: