背景:

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.1min all(#3)>10 Redis服务器过载,处理能力下降
cpu.idle all(#3)<10 CPU idle过低,处理能力下降
df.bytes.free.percent all(#3)<20 磁盘可用空间百分比低于20%,影响从库RDB和AOF持久化
mem.memfree.percent all(#3)<15 内存剩余低于15%,Redis有OOM killer和使用swap的风险
mem.swapfree.percent all(#3)<80 使用20% swap,Redis性能下降或OOM风险
net.if.out.bytes all(#3)>94371840 网络出口流量超90MB,影响Redis响应
net.if.in.bytes all(#3)>94371840 网络入口流量超90MB,影响Redis响应
disk.io.util all(#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

Open-Falcon 监控系统监控 MySQL/Redis/MongoDB 状态监控相关推荐

  1. mongodb 监控权限_分布式监控系统Zabbix3.4-针对MongoDB性能监控操作笔记

    公司在IDC机房的一台服务器上部署了MongoDB,由于所存储的业务数据比较重要,所以对MongoDB的监控显得尤为重要!Zabbix监控MongoDB性能的原理:通过echo "db.se ...

  2. monit mysql_monit配置监控启动nginx php mysql redis mongodb 服务器

    -----nginx php mysql redis mongodb 配置 完美OK------– # nginx check process nginx withpidfile /usr/local ...

  3. 浅谈性能测试监控系统,做好关键指标的监控

    随着业务的增长,服务器部署由单一架构向分布式集群架构转变,性能测试过程中指标监控也由单一服务器向集群服务器转变. 对于性能测试团队来说,需要建立起适用于测试的多机监控系统,以便后期顺利且高效地进行监控 ...

  4. 阿里P8架构师谈:高并发网站的监控系统选型、比较、核心监控指标

    在高并发分布式环境下,对于访问量大的业务.接口等,需要及时的监控网站的健康程度,防止网站出现访问缓慢,甚至在特殊情况出现应用服务器雪崩等场景,在高并发场景下网站无法正常访问的情况,这些就会涉及到分布式 ...

  5. 网页前端监控系统(错误日志,接口监控)的使用

    网页前端监控系统(错误日志,接口监控)的使用  开门见山地说当程序员开发网页达到一定的量级,用户的数量达到一个比较庞大的数量时,总会遇见一些怎么测试都无法复现的bug,但是用户操作的时候却能屡次碰到, ...

  6. 动环监控系统接线图_机房动环监控系统报价

    原标题:机房动环监控系统报价 机房动环监控系统报价需要根据业务需求来进行报价的,一般机房动环监控系统的价格跟机房的监控面积的大小以及监控的项目是息息相关的,比如一个IDC机房和小型的基站机房的动环监控 ...

  7. 空气质量监控系统中的车库CO浓度监控系统

    车库CO浓度监控系统 车库一氧化碳浓度( CO )浓度监控系统是由车库CO气体探测器.车库CO浓度智能检测控制器和车库CO浓度智能检测控制器组成 型号:CO气体探测器 HT-COT 车库CO浓度智能检 ...

  8. 机房动环监控系统的优点,机房环境监控系统作用

    机房动力环境监控系统,简称机房动环监控系统,具有机房组成的温湿度监控.渗水监控.电源监控.视频监控.消防监控.及其报警监控等功能,为其提供自动化.信息化管理,达到无人监控.高效管理的目的. 1.动力环 ...

  9. python商品监控系统_Python写的一个简单监控系统

    市面上有很多开源的监控系统:Cacti.nagios.zabbix.感觉都不符合我的需求,为什么不自己做一个呢 用Python两个小时徒手撸了一个简易的监控系统,给大家分享一下,希望能对大家有所启发 ...

最新文章

  1. 手持机连不上信道设置为13的AP
  2. 多线程:同步和异步的优缺点比较
  3. JSP页面中调用Spring Bean
  4. 32位mips运算器logisim_大神教你制作一个简单的16位CPU
  5. Vue优化策略_项目上线_02
  6. win7纯净版镜像系统安装教程
  7. 第六届省赛(软件类)真题----Java大学B组答案及解析
  8. 如何用SQL语句查询Excel数据
  9. jwt token注销_详解JWT token心得与使用实例
  10. SAP NetWeaver 平台介绍
  11. 开发人员学Linux(13):CentOS7安装配置IT设备监控系统Zabbix
  12. Spring+SpringMVC+mybatis+Quartz整合
  13. 深入浅出解读 Java 虚拟机的差别测试技术
  14. HTTP协议学习总结三(常见http响应头)
  15. COMSOL仿真软件入门学习(一)
  16. matlab差值报错,matlab插值介绍
  17. java用jimi.jar实现图片格式转换
  18. ELK日志分析系统搭建以及springboot日志发送到ELK中
  19. DeepFM Pytorch实现(Criteo数据集验证)
  20. Page Cache 与 Kafka 那些事儿

热门文章

  1. python-上传下载文件
  2. C++ 面向对象(一)—— 类(Classes)
  3. HDC,CDC,CClientDC,CPaintDC,CWindowDC的区别
  4. [react] React中怎么检验props?
  5. React开发(106):方法定义 不然弹出框报错
  6. react学习(61)--js contact
  7. react学习(35)----getFieldDecorator will override value
  8. [html]如何让元素固定在页面底部?有哪些比较好的实践?
  9. 工作374-前端margin:0 auto为什么会失效
  10. [css] CSS3中的transition是否可以过渡opacity和display?