Open-Falcon 监控系统监控 MySQL/Redis/MongoDB 状态监控

背景:

Open-Falcon 是小米运维部开源的一款互联网企业级监控系统解决方案,具体的安装和使用说明请见官网:http://open-falcon.org/,是一款比较全的监控。而且提供各种API,只需要把数据按照规定给出就能出图,以及报警、集群支持等等。

监控:

1) MySQL 收集信息脚本(mysql_monitor.py)

复制代码
#!/bin/env python
# -*- encoding: utf-8 -*-from __future__ import division
import MySQLdb
import datetime
import time
import os
import sys
import fileinput
import requests
import json
import reclass MySQLMonitorInfo():def __init__(self,host,port,user,password):self.host     = hostself.port     = portself.user     = userself.password = passworddef stat_info(self):try:m = MySQLdb.connect(host=self.host,user=self.user,passwd=self.password,port=self.port,charset='utf8')query = "SHOW GLOBAL STATUS"cursor = m.cursor()cursor.execute(query)Str_string = cursor.fetchall()Status_dict = {}for Str_key,Str_value in Str_string:Status_dict[Str_key] = Str_valuecursor.close()m.close()return Status_dictexcept Exception, e:print (datetime.datetime.now()).strftime("%Y-%m-%d %H:%M:%S")print eStatus_dict = {}return Status_dict def engine_info(self):try:m = MySQLdb.connect(host=self.host,user=self.user,passwd=self.password,port=self.port,charset='utf8')_engine_regex = re.compile(ur'(History list length) ([0-9]+\.?[0-9]*)\n')query = "SHOW ENGINE INNODB STATUS"cursor = m.cursor()cursor.execute(query)Str_string = cursor.fetchone()a,b,c = Str_stringcursor.close()m.close()return dict(_engine_regex.findall(c))except Exception, e:print (datetime.datetime.now()).strftime("%Y-%m-%d %H:%M:%S")print ereturn dict(History_list_length=0)if __name__ == '__main__':open_falcon_api = 'http://192.168.200.86:1988/v1/push'db_list= []for line in fileinput.input():db_list.append(line.strip())for db_info in db_list:
#        host,port,user,password,endpoint,metric = db_info.split(',')host,port,user,password,endpoint = db_info.split(',')timestamp = int(time.time())step      = 60
#        tags      = "port=%s" %porttags      = ""conn = MySQLMonitorInfo(host,int(port),user,password)stat_info = conn.stat_info()engine_info = conn.engine_info()mysql_stat_list = []monitor_keys = [('Com_select','COUNTER'),('Qcache_hits','COUNTER'),('Com_insert','COUNTER'),('Com_update','COUNTER'),('Com_delete','COUNTER'),('Com_replace','COUNTER'),('MySQL_QPS','COUNTER'),('MySQL_TPS','COUNTER'),('ReadWrite_ratio','GAUGE'),('Innodb_buffer_pool_read_requests','COUNTER'),('Innodb_buffer_pool_reads','COUNTER'),('Innodb_buffer_read_hit_ratio','GAUGE'),('Innodb_buffer_pool_pages_flushed','COUNTER'),('Innodb_buffer_pool_pages_free','GAUGE'),('Innodb_buffer_pool_pages_dirty','GAUGE'),('Innodb_buffer_pool_pages_data','GAUGE'),('Bytes_received','COUNTER'),('Bytes_sent','COUNTER'),('Innodb_rows_deleted','COUNTER'),('Innodb_rows_inserted','COUNTER'),('Innodb_rows_read','COUNTER'),('Innodb_rows_updated','COUNTER'),('Innodb_os_log_fsyncs','COUNTER'),('Innodb_os_log_written','COUNTER'),('Created_tmp_disk_tables','COUNTER'),('Created_tmp_tables','COUNTER'),('Connections','COUNTER'),('Innodb_log_waits','COUNTER'),('Slow_queries','COUNTER'),('Binlog_cache_disk_use','COUNTER')]for _key,falcon_type in monitor_keys:if _key == 'MySQL_QPS':_value = int(stat_info.get('Com_select',0)) + int(stat_info.get('Qcache_hits',0))elif _key == 'MySQL_TPS':_value = int(stat_info.get('Com_insert',0)) + int(stat_info.get('Com_update',0)) + int(stat_info.get('Com_delete',0)) + int(stat_info.get('Com_replace',0))elif _key == 'Innodb_buffer_read_hit_ratio':try:_value = round((int(stat_info.get('Innodb_buffer_pool_read_requests',0)) - int(stat_info.get('Innodb_buffer_pool_reads',0)))/int(stat_info.get('Innodb_buffer_pool_read_requests',0)) * 100,3)except ZeroDivisionError:_value = 0elif _key == 'ReadWrite_ratio':try:_value = round((int(stat_info.get('Com_select',0)) + int(stat_info.get('Qcache_hits',0)))/(int(stat_info.get('Com_insert',0)) + int(stat_info.get('Com_update',0)) + int(stat_info.get('Com_delete',0)) + int(stat_info.get('Com_replace',0))),2)except ZeroDivisionError:_value = 0            else:_value = int(stat_info.get(_key,0))falcon_format = {'Metric': '%s' % (_key),'Endpoint': endpoint,'Timestamp': timestamp,'Step': step,'Value': _value,'CounterType': falcon_type,'TAGS': tags}mysql_stat_list.append(falcon_format)#_key : History list lengthfor _key,_value in  engine_info.items():_key = "Undo_Log_Length"falcon_format = {'Metric': '%s' % (_key),'Endpoint': endpoint,'Timestamp': timestamp,'Step': step,'Value': int(_value),'CounterType': "GAUGE",'TAGS': tags}mysql_stat_list.append(falcon_format)print json.dumps(mysql_stat_list,sort_keys=True,indent=4)requests.post(open_falcon_api, data=json.dumps(mysql_stat_list))
复制代码

指标说明:收集指标里的COUNTER表示每秒执行次数,GAUGE表示直接输出值。

指标类型说明
 Undo_Log_Length GAUGE未清除的Undo事务数
 Com_select COUNTER select/秒=QPS
 Com_insert COUNTER insert/秒
 Com_update COUNTER update/秒
 Com_delete COUNTER delete/秒
 Com_replace COUNTER replace/秒
 MySQL_QPS COUNTER QPS
 MySQL_TPS COUNTER TPS 
 ReadWrite_ratio GAUGE 读写比例
 Innodb_buffer_pool_read_requests COUNTER innodb buffer pool 读次数/秒
 Innodb_buffer_pool_reads COUNTER Disk 读次数/秒
 Innodb_buffer_read_hit_ratio GAUGE innodb buffer pool 命中率
 Innodb_buffer_pool_pages_flushed COUNTER innodb buffer pool 刷写到磁盘的页数/秒
 Innodb_buffer_pool_pages_free GAUGE innodb buffer pool 空闲页的数量
 Innodb_buffer_pool_pages_dirty GAUGE innodb buffer pool 脏页的数量
 Innodb_buffer_pool_pages_data GAUGE innodb buffer pool 数据页的数量
 Bytes_received COUNTER 接收字节数/秒
 Bytes_sent COUNTER 发送字节数/秒
 Innodb_rows_deleted COUNTER innodb表删除的行数/秒
 Innodb_rows_inserted COUNTER  innodb表插入的行数/秒
 Innodb_rows_read COUNTER  innodb表读取的行数/秒
 Innodb_rows_updated  COUNTER  innodb表更新的行数/秒
 Innodb_os_log_fsyncs COUNTER  Redo Log fsync次数/秒 
 Innodb_os_log_written COUNTER  Redo Log 写入的字节数/秒
 Created_tmp_disk_tables COUNTER  创建磁盘临时表的数量/秒
 Created_tmp_tables COUNTER  创建内存临时表的数量/秒
 Connections COUNTER  连接数/秒
 Innodb_log_waits COUNTER  innodb log buffer不足等待的数量/秒
 Slow_queries COUNTER  慢查询数/秒
 Binlog_cache_disk_use COUNTER  Binlog Cache不足的数量/秒

使用说明:读取配置到都数据库列表执行,配置文件格式如下(mysqldb_list.txt):

 IP,Port,User,Password,endpoint

192.168.2.21,3306,root,123,mysql-21:3306
192.168.2.88,3306,root,123,mysql-88:3306

最后执行:

python mysql_monitor.py mysqldb_list.txt 

2) Redis 收集信息脚本(redis_monitor.py)

复制代码
#!/bin/env python
#-*- coding:utf-8 -*-import json
import time
import re
import redis
import requests
import fileinput
import datetimeclass RedisMonitorInfo():def __init__(self,host,port,password):self.host     = hostself.port     = portself.password = passworddef stat_info(self):try:r = redis.Redis(host=self.host, port=self.port, password=self.password)stat_info = r.info()return stat_infoexcept Exception, e:print (datetime.datetime.now()).strftime("%Y-%m-%d %H:%M:%S")print ereturn dict()def cmdstat_info(self):try:r = redis.Redis(host=self.host, port=self.port, password=self.password)cmdstat_info = r.info('Commandstats')return cmdstat_infoexcept Exception, e:print (datetime.datetime.now()).strftime("%Y-%m-%d %H:%M:%S")print ereturn dict()if __name__ == '__main__':open_falcon_api = 'http://192.168.200.86:1988/v1/push'db_list= []for line in fileinput.input():db_list.append(line.strip())for db_info in db_list:
#        host,port,password,endpoint,metric = db_info.split(',')host,port,password,endpoint = db_info.split(',')timestamp = int(time.time())step      = 60falcon_type = 'COUNTER'
#        tags      = "port=%s" %porttags      = ""conn = RedisMonitorInfo(host,port,password)#查看各个命令每秒执行次数redis_cmdstat_dict = {}redis_cmdstat_list = []cmdstat_info = conn.cmdstat_info()for cmdkey in cmdstat_info:redis_cmdstat_dict[cmdkey] = cmdstat_info[cmdkey]['calls']for _key,_value in redis_cmdstat_dict.items():falcon_format = {'Metric': '%s' % (_key),'Endpoint': endpoint,'Timestamp': timestamp,'Step': step,'Value': int(_value),'CounterType': falcon_type,'TAGS': tags}redis_cmdstat_list.append(falcon_format)#查看Redis各种状态,根据需要增删监控项,str的值需要转换成intredis_stat_list = []monitor_keys = [('connected_clients','GAUGE'),('blocked_clients','GAUGE'),('used_memory','GAUGE'),('used_memory_rss','GAUGE'),('mem_fragmentation_ratio','GAUGE'),('total_commands_processed','COUNTER'),('rejected_connections','COUNTER'),('expired_keys','COUNTER'),('evicted_keys','COUNTER'),('keyspace_hits','COUNTER'),('keyspace_misses','COUNTER'),('keyspace_hit_ratio','GAUGE'),('keys_num','GAUGE'),]stat_info = conn.stat_info()   for _key,falcon_type in monitor_keys:#计算命中率if _key == 'keyspace_hit_ratio':try:_value = round(float(stat_info.get('keyspace_hits',0))/(int(stat_info.get('keyspace_hits',0)) + int(stat_info.get('keyspace_misses',0))),4)*100except ZeroDivisionError:_value = 0#碎片率是浮点数elif _key == 'mem_fragmentation_ratio':_value = float(stat_info.get(_key,0))#拿到key的数量elif _key == 'keys_num':_value = 0 for i in range(16):_key = 'db'+str(i)_num = stat_info.get(_key)if _num:_value += int(_num.get('keys'))_key = 'keys_num'#其他的都采集成counter,intelse:try:_value = int(stat_info[_key])except:continuefalcon_format = {'Metric': '%s' % (_key),'Endpoint': endpoint,'Timestamp': timestamp,'Step': step,'Value': _value,'CounterType': falcon_type,'TAGS': tags}redis_stat_list.append(falcon_format)load_data = redis_stat_list+redis_cmdstat_listprint json.dumps(load_data,sort_keys=True,indent=4)requests.post(open_falcon_api, data=json.dumps(load_data))
复制代码

指标说明:收集指标里的COUNTER表示每秒执行次数,GAUGE表示直接输出值。

指标类型说明
 connected_clients GAUGE连接的客户端个数
 blocked_clients GAUGE被阻塞客户端的数量
 used_memory GAUGE Redis分配的内存的总量
 used_memory_rss GAUGE OS分配的内存的总量
 mem_fragmentation_ratio GAUGE 内存碎片率,used_memory_rss/used_memory
 total_commands_processed COUNTER 每秒执行的命令数,比较准确的QPS
 rejected_connections COUNTER 被拒绝的连接数/秒
 expired_keys COUNTER 过期KEY的数量/秒 
 evicted_keys COUNTER 被驱逐KEY的数量/秒
 keyspace_hits COUNTER 命中KEY的数量/秒
 keyspace_misses COUNTER 未命中KEY的数量/秒
 keyspace_hit_ratio GAUGE KEY的命中率
 keys_num GAUGE KEY的数量
 cmd_* COUNTER 各种名字都执行次数/秒

使用说明:读取配置到都数据库列表执行,配置文件格式如下(redisdb_list.txt):

 IP,Port,Password,endpoint

192.168.1.56,7021,zhoujy,redis-56:7021
192.168.1.55,7021,zhoujy,redis-55:7021

最后执行:

 python redis_monitor.py redisdb_list.txt

3) MongoDB 收集信息脚本(mongodb_monitor.py)

...后续添加

 

4)其他相关的监控(需要装上agent),比如下面的指标:

告警项触发条件备注
load.1minall(#3)>10Redis服务器过载,处理能力下降
cpu.idleall(#3)<10CPU idle过低,处理能力下降
df.bytes.free.percentall(#3)<20磁盘可用空间百分比低于20%,影响从库RDB和AOF持久化
mem.memfree.percentall(#3)<15内存剩余低于15%,Redis有OOM killer和使用swap的风险
mem.swapfree.percentall(#3)<80使用20% swap,Redis性能下降或OOM风险
net.if.out.bytesall(#3)>94371840网络出口流量超90MB,影响Redis响应
net.if.in.bytesall(#3)>94371840网络入口流量超90MB,影响Redis响应
disk.io.utilall(#3)>90磁盘IO可能存负载,影响从库持久化和阻塞写

 

相关文档:

https://github.com/iambocai/falcon-monit-scripts(redis monitor)

https://github.com/ZhuoRoger/redismon(redis monitor)

https://www.cnblogs.com/zhoujinyi/p/6645104.html

转载于:https://www.cnblogs.com/jackyzm/p/9600496.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/413370.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[css] 使用css实现悬浮提示文本

[css] 使用css实现悬浮提示文本 <div class"tips-demo" data-tips"提示文本">演示文本</div><style> .tips-demo {position: fixed;bottom: 15px;right: 15px; }.tips-demo:after {content: attr(data-tips);position: absolute;top: 0…

JavaScript之继承模式,命名空间,对象枚举

继承发展史 1-传统形式 → 原型链 过多的继承了没用的属性&#xff08;很好理解&#xff0c;不用代码演示了&#xff09; 2-借用构造函数 不能继承借用构造函数的原型&#xff08;很好理解&#xff0c;不用代码演示了&#xff09;每次构造函数都要夺走一个函数&#xff08;很…

delphi dxBarManager 的dxBarEdit 输入问题

Developer Express 6 想做像office2007那样界面.问题:dxBarManager1 里面添加了cxBarEditItem1 这是个文本框,运行可以输入内容,但是当焦点失去时,刚刚输入的内容没了.只能每次输完内容后一定要按回车才能保存内容.这里面所有能改变值的控件都是这样子的,有没有什么办法可以在控…

[css] 怎么设置可点击的元素上强制手型?

[css] 怎么设置可点击的元素上强制手型&#xff1f; cursor 属性个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

什么是KYC,KYC认证的重要性

KYC&#xff0c;是英语Know Your Customer的简称&#xff0c;这段词汇用翻译直接生硬的翻译过来意思是&#xff1a;了解你的客户。词义翻译的非常的直接。不过却缺乏一些诗意。我们在万能的度娘上键入KYC得到的解释是&#xff1a;是金融机构、银行、交易所等企业必须进行的一项…

虚拟机上的Linux学习

title: 虚拟机上的Linux学习 date: 2018-08-08 15:48:28 updated: tags: [Linux,学习笔记] description: keywords: comments: image: --- 开始学习Linux了,还没有掌握系统完全备份的技术,所以不敢直接在物理机器上安装Linux,我选择使用虚拟机安装. 使用虚拟机安装Linux 最开始…

[css] 如何使用css实现跨浏览器的最小高度?

[css] 如何使用css实现跨浏览器的最小高度&#xff1f; div{height:auto!important; height:200px; min-height:200px; } 这个第一个已经 important 了&#xff0c;后面的属性设置应该也没用了吧 浏览器兼容接触的比较少了&#xff0c;目前项目只兼容 blink个人简介 我是歌谣&…

Promise解决多个异步Ajax请求导致的代码嵌套问题(完美解决方案)

这篇文章主要介绍了用Promise解决多个异步Ajax请求导致的代码嵌套问题(完美解决方案),需要的朋友可以参考下 问题 前端小同学在做页面的时候&#xff0c;犯了个常见的错误&#xff1a;把多个Ajax请求顺序着写下来了&#xff0c;而后面的请求&#xff0c;对前面请求的返回结果…

[css] 使用css3实现一个斑马线的效果

[css] 使用css3实现一个斑马线的效果 ferrinweb 如果需要很多或者无限扩展的斑马线&#xff0c;你这个方案就有缺点了 cxwht 你的方案需要增加额外的元素&#xff0c;不太理想 最好的办法是用渐变背景实现 linear-gradient( [ [ <angle> | [top | bottom] || [left | ri…

最详细的后缀数组

写在前面&#xff1a; 多余的我就不提了&#xff0c;只是觉得网上的博客吧流程&#xff0c;每个数组存的是下标还是值&#xff0c;都讲的不是很清楚&#xff08;让我这种蒟蒻很是困扰&#xff09; 相信到现在这种水平的都可以知道什么是倍增&#xff0c;为什么能倍增都比较清楚…

promise简单封装ajax 完美嵌套多个ajax请求

转载请注明出处并留个言哈&#xff0c;分享快乐~&#xff01; request.js文件&#xff0c;注意网页头部script标签加载顺序 function myAjax(json, callback) {var p new Promise(function (resolve, reject) {$.ajax({url: json.url, //请求的url地址dataType: json.dat…

[css] 使用纯css来创建一个滑块

[css] 使用纯css来创建一个滑块 .checke{position: relative;-webkit-appearance: none;width:90px;height: 44px;line-height: 44px;background: #eee;border-radius: 30px;outline: none;}.checke:before{position: absolute;left: 0;content: ;width: 44px;height: 44px;bor…

纯静态网站模板封装header和footer

前后端分离的网站模板&#xff0c;如果不用任何渲染引擎&#xff0c;能否封装公共的header和footer&#xff08;或其它html公共代码呢&#xff09;&#xff1f; 答案是肯定的&#xff0c;因为jQuery有一个函数叫 load &#xff0c;可以在浏览器绘制页面之前加载完整的 html 页…

SAP字体调节大小

登陆SAP 之后&#xff0c;菜单下面一行&#xff0c;最右边的那个彩色按钮&#xff08;SAP GUI&#xff09;&#xff0c;点击“选项”-可视设计-字体设计-固定狂赌字体设计&#xff0c;点击&#xff1a;选择字体 即可。转载于:https://www.cnblogs.com/RogerLu/p/9612648.html

javascript中对一个对象数组按照对象某个属性进行排序

在javascript中&#xff0c;对象和数组是两种不同的类型&#xff0c;这和php中的数组概念不同。在javascript中&#xff0c;也有一些精妙的算法&#xff0c;用来对一些对象进行排序。我在面试迅雷的时候&#xff0c;也拿到一道题&#xff0c;当时做题的时候考虑到时间&#xff…

[css] 用css画一个五边形和一个六边形

[css] 用css画一个五边形和一个六边形 五边形&#xff1a;clip-path: polygon(50% 0%, 100% 38%, 82% 100%, 18% 100%, 0% 38%); 六边形&#xff1a;clip-path: polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%); 七边形&#xff1a;clip-path: polygon(50% 0%…

[css] 你有没有使用过“形似猫头鹰”(例:`* + *{ ... }`) 的选择器?

[css] 你有没有使用过“形似猫头鹰”&#xff08;例&#xff1a;* *{ ... }&#xff09; 的选择器&#xff1f; 以前常用&#xff0c;比如li li {margin-top: 1rem; } 这样可以给除了第一个li以外的li指定样式&#xff0c;比如在两个li之间加上margin个人简介 我是歌谣&…

HTML5 Web 存储(localStorage和sessionStorage)

localStorage生命周期是永久&#xff0c;除非主动清除localStorage信息&#xff0c;否则这些信息将永远存在。存放数据大小为一般为5MB,而且它仅在客户端&#xff08;即浏览器&#xff09;中保存&#xff0c;不参与和服务器的通信。 // 1、保存数据到本地// 第一个参数是保存的…

面向对象之反射、包装、(定制)

什么是反射&#xff1f; 反射的概念是由Smith在1982年首次提出的&#xff0c;主要是指程序可以访问、检测和修改它本身状态或行为的一种能力&#xff08;自省&#xff09;&#xff0c; 这一概念的提出很快引发了计算机科学领域关于应用反射的研究。它首次被程序语言的设计领域所…

[css] 为什么说css中能用子代选择器的时候不要用后代选择器?

[css] 为什么说css中能用子代选择器的时候不要用后代选择器&#xff1f; 选择从右到左依次解析匹配&#xff0c;所以后代选择器会去找它的所有父级&#xff0c; 而子代选择器只会选择直接的父级&#xff1b;减少匹配次数&#xff0c;提高效率个人简介 我是歌谣&#xff0c;欢…