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 re

class MySQLMonitorInfo():

    def __init__(self,host,port,user,password):
        self.host     = host
        self.port     = port
        self.user     = user
        self.password = password

    def 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_value
            cursor.close()
            m.close()
            return Status_dict

        except Exception, e:
            print (datetime.datetime.now()).strftime("%Y-%m-%d %H:%M:%S")
            print e
            Status_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_string
            cursor.close()
            m.close()
            return dict(_engine_regex.findall(c))
        except Exception, e:
            print (datetime.datetime.now()).strftime("%Y-%m-%d %H:%M:%S")
            print e
            return 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" %port
        tags      = ""

        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 = 0
            elif _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 length
        for _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 datetime

class RedisMonitorInfo():

    def __init__(self,host,port,password):
        self.host     = host
        self.port     = port
        self.password = password

    def stat_info(self):
         try:
            r = redis.Redis(host=self.host, port=self.port, password=self.password)
            stat_info = r.info()
            return stat_info
         except Exception, e:
            print (datetime.datetime.now()).strftime("%Y-%m-%d %H:%M:%S")
            print e
            return 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_info
        except Exception, e:
            print (datetime.datetime.now()).strftime("%Y-%m-%d %H:%M:%S")
            print e
            return 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      = 60
        falcon_type = ‘COUNTER‘
#        tags      = "port=%s" %port
        tags      = ""

        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的值需要转换成int
        redis_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)*100
                except 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,int
            else:
                try:
                    _value = int(stat_info[_key])
                except:
                    continue
            falcon_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_list
        print 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)

时间: 2024-12-15 01:34:51

Open-Falcon 监控系统监控 MySQL/Redis/MongoDB 状态监控的相关文章

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

在高并发分布式环境下,对于访问量大的业务.接口等,需要及时的监控网站的健康程度,防止网站出现访问缓慢,甚至在特殊情况出现应用服务器雪崩等场景,在高并发场景下网站无法正常访问的情况,这些就会涉及到分布式监控系统,对于核心指标提前监控,防患于未然. 常见的开源监控系统 1.Zabbix Zabbix是一个基于WEB界面的提供分布式系统监控以及网络监控功能的企业级开源运维平台,也是目前国内互联网用户中使用最广的监控软件. 入门容易.上手简单.功能强大并且开源免费. Zabbix易于管理和配置,能生成比

Cacti+Nagios监控系统(五):Nagios监控windows(基于check_nt)

一.工作原理 Nagios服务器使用check_nt工具与客户端程序通讯,客户端程序NSCP使用命令来获取本地客户端的信息并返回给check_nt. check_nt只是NSCP其中一项服务,Nagios还可以通过check命令(如check_http检查WEB服务).check_nrpe.NSCA.WMI来监控windows客户端. 二.下载客户端程序 下载地址:  http://nsclient.org/nscp/downloads 64位系统下载:NSCP-0.4.1.105-x64.ms

percona_template_for_cacti监控图像增加对redis多实例监控的支持

percona的cacti模板还是挺帅气的,但是对于redis.memercache等多实例而言,只能监控默认6379,或者一个其他端口(总之不能监控所有实例),这还是很可惜的,要实现监控一切可以监控的对象,就必须自定义模板,经过了半天的摸索,终于实现了,先来看一下帅气的截图: 步骤: 1.下载percona模板,解压,因之前用的时1.0.1版本的,所以还是在原版本的基础上修改 wget http://www.percona.com/redir/downloads/percona-monitor

MongoDB 状态监控、备份复制及自动分片

如果MongoDB仅仅是一个文档型的数据库,那就没有什么亮点了,然而MongoDB最大优点在于读扩展,热备份,故障恢复以及自动分片(写扩展).这节系列结束篇就把这些功能介绍一下. 备份复制实现了数据库备份的同时,实现了读写分离,又实现了读操作的负载均衡,即一台主写服务器,多台从属备份和读服务器,并且支持备份和读的集群扩展.其中Replica Sets方式又支持故障切换,当主服务器down掉后会投票选出一台从服务器接替为主服务器实现写操作.而自动分片功能会将原先的集合(表),自动分片到其它服务器上

Cacti监控图像增加对redis多实例监控的支持

1.下载percona模板,解压 wget http://www.percona.com/redir/downloads/percona-monitoring-plugins/1.0.1/percona-monitoring-plugins-1.0.1.tar.gz 2.在redis的默认模板配置文件的基础上增加选项port2,用户在新建redis监控图像时要求填写redis端口号,不填的话就是默认的6379,ss_get_by_ssh.php脚本通过port2选项连接指定端口的redis实例:

mysql 从库状态监控shell

监控mysql Slave_IO_Running: Slave_SQL_Running: 状态,为NO 邮件报警 最近刚发现一个发邮件的工具,简单好用 sendEmail,免安装的 个人感觉非常好用 参考:http://blog.chinaunix.net/uid-10697776-id-3185073.html vim slave.sh 思路: 过滤Slave_IO_Running && Slave_SQL_Running的值.为No邮件报警,同时写入日志slave.log..当然就得定

基于prometheus+grafana 搭建监控mysql redis mongodb等

先把题目定好,具体待这几天整理我的笔记补充进来. 官方网站 https://prometheus.io/ 参考文档: http://www.cnblogs.com/sfnz/p/6566951.html http://www.jb51.net/article/107386.htm https://www.iamle.com/archives/2130.html

ZABBIX最全MYSQL自定义监控多实例mysql与主从复制状态没有之一

我们首先要提取你服务器上有多少mysql实例提取方法如下: #!/usr/bin/env pythonimport osimport jsont=os.popen("""sudo netstat -nltp|grep -w "mysqld"|grep -w "LISTEN"|grep -v grep|grep -v '^$'|awk -F: '{print $4}'""")s=os.popen("

MySQL主从同步状态监控脚本及邮件通知

网络版本 #!/bin/bash mysql_cmd="mysql -u root -pxxxxxxxxx" errorno=(1158 1159 1008 1007 1062) while true do array=($($mysql_cmd -e "show slave status\G"|egrep '_Running|Behind_Master|Last_SQL_Errno'|awk '{ print $NF }')) if [ "${array