Example #1
0
def record(log_file, log_level, redis_password, redis_port, sentinel_port, sentinel_name, commands):
    logger=log.Logger(log_file, log_level)
    db=database.db()
    logger.logger.debug("记录Redis资源")
    record_time=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    port=int(redis_port)
    pid=tools.find_pid(port)
    normal=1
    if pid==0:
        logger.logger.error(f"Redis({port})未运行")
        sql="insert into redis_constant(record_time, pid, port, boot_time) values(?, ?, ?, ?)"
        db.update_one(sql, (record_time, pid, port, "0"))
        db.update_one("update redis_role set record_time=?, role=?", ("0", "master"))
    else:
        try:
            conn=Redis(host="127.0.0.1",  port=redis_port, password=redis_password)
            conn.ping()
        except Exception as e:
            normal=0
            msg=e
        if normal==1:
            redis_info=conn.info()
            redis_psutil_info=psutil.Process(pid).as_dict()
            boot_time=datetime.datetime.fromtimestamp(redis_psutil_info["create_time"]).strftime("%Y-%m-%d %H:%M:%S")
            sql="insert into redis_constant(record_time, pid, port, boot_time) values(?, ?, ?, ?)"
            db.update_one(sql, (record_time, pid, redis_port, boot_time))

            redis_memory_percent=redis_psutil_info['memory_percent']
            redis_memory=psutil.virtual_memory()[0] * redis_memory_percent / 100
            redis_connections=redis_info['connected_clients']
            redis_num_threads=redis_psutil_info['num_threads']
            sql="insert into redis_variable values(?, ?, ?, ?, ?, ?)"
            db.update_one(sql, (record_time, pid, redis_memory, redis_memory_percent, redis_connections, redis_num_threads))

            logger.logger.debug("记录Redis集群资源")
            role=redis_info['role']
            db.update_one("update redis_role set record_time=?, role=?", (record_time, role))
            if role=="master":
                connected_slaves=redis_info['connected_slaves']
                sql="replace into redis_master values(?, ?, ?, ?)"
                db.update_one(sql, (record_time, pid, role, connected_slaves))
                slaves_list=[]
                if connected_slaves!=0:
                    for i in range(connected_slaves):
                        slave=f"slave{i}"
                        slaves_list.append((record_time, redis_info[slave]['ip'], redis_info[slave]['port'], redis_info[slave]['state']))
                    sql="replace into redis_slaves_info values(?, ?, ?, ?)"
                    db.update_all(sql, slaves_list)
            elif role=="slave":
                sql="replace into redis_slave values(?, ?, ?, ?, ?, ?)"
                db.update_one(sql, (record_time, pid, role, redis_info['master_host'], redis_info['master_port'], redis_info['master_link_status']))

            """显示自定义命令
            if commands is not None:
                printf("-"*40)
                printf("自定义命令查询:")
                commands_list=commands.split(",")
                for command in commands_list:
                    command=command.strip()
                    result=conn.execute_command(command)
                    printf(f"{command} 结果: {result}")
            """
            conn.close()
        elif normal==0:
            logger.logger.error(f"无法连接redis: {msg}")
            sql="insert into error values(?, ?, ?, ?, ?)"
            db.update_one(sql, (record_time, "Redis", "connection", str(msg), 0))
        
    # sentinel信息
    if sentinel_port is not None:
        logger.logger.debug(f"记录Redis Sentinel信息...")
        conn=sentinel.Sentinel(
                [('127.0.0.1', sentinel_port)], 
                socket_timeout=1
                )
        try:
            sentinel_info=[]
            master=conn.discover_master(sentinel_name)
            sentinel_info.append((record_time, 'master', master[0], master[1]))
            slaves=conn.discover_slaves(sentinel_name)
            for i in slaves:
                sentinel_info.append((record_time, 'slave', i[0], i[1]))
            sql="replace into redis_sentinel values(?, ?, ?, ?)"
            db.update_all(sql, sentinel_info)
        except Exception as e:
            logger.logger.error(f"Redis Sentinel无法连接...")
            sql="insert into error values(?, ?, ?, ?, ?)"
            db.update_one(sql, (record_time, 'Sentinel', "connection", str(e), 0))