阿里云收集服务器性能指标的python脚本

#!/usr/bin/python
#########################################
# Function:    sample linux performance indices
# Usage:       python sampler.py
# Author:      CMS DEV TEAM
# Company:     Aliyun Inc.
# Version:     1.1
#########################################

import os
import os.path
import sys
import time
import operator
import httplib
import logging
import socket
import random
from shutil import copyfile
from subprocess import Popen, PIPE
from logging.handlers import RotatingFileHandler

logger = None
REMOTE_HOST = None
REMOTE_PORT = None
REMOTE_MONITOR_URI = None
UUID = None

def get_mem_usage_percent():
    try:
        f = open(‘/proc/meminfo‘, ‘r‘)
        for line in f:
            if line.startswith(‘MemTotal:‘):
                mem_total = int(line.split()[1])
            elif line.startswith(‘MemFree:‘):
                mem_free = int(line.split()[1])
            elif line.startswith(‘Buffers:‘):
                mem_buffer = int(line.split()[1])
            elif line.startswith(‘Cached:‘):
                mem_cache = int(line.split()[1])
            elif line.startswith(‘SwapTotal:‘):
                vmem_total = int(line.split()[1])
            elif line.startswith(‘SwapFree:‘):
                vmem_free = int(line.split()[1])
            else:
                continue
        f.close()
    except:
        return None
    physical_percent = usage_percent(mem_total - (mem_free + mem_buffer + mem_cache), mem_total)
    virtual_percent = 0
    if vmem_total > 0:
        virtual_percent = usage_percent((vmem_total - vmem_free), vmem_total)
    return physical_percent, virtual_percent

black_list = (‘iso9660‘,)

def usage_percent(use, total):
    try:
        ret = (float(use) / total) * 100
    except ZeroDivisionError:
        raise Exception("ERROR - zero division error")
    return ret

def get_disk_partition():
    return_list = []
    pd = []
    try:
        f = open("/proc/filesystems", "r")
        for line in f:
            if not line.startswith("nodev"):
                fs_type = line.strip()
                if fs_type not in black_list:
                    pd.append(fs_type)
        f.close()

        f = open(‘/etc/mtab‘, "r")
        for line in f:
            if line.startswith(‘none‘):
                continue
            tmp = line.strip().split()
            ft = tmp[2]
            if ft not in pd:
                continue
            return_list.append(tmp[1])
        f.close()
    except:
        return None
    return return_list

def check_disk():
    try:
        return_dict = {}
        p_list = get_disk_partition()
        for i in p_list:
            dt = os.statvfs(i)
            use = (dt.f_blocks - dt.f_bfree) * dt.f_frsize
            all = dt.f_blocks * dt.f_frsize
            return_dict[i] = (‘%.2f‘ % (usage_percent(use, all),), (‘%.2f‘ % (all * 1.0 / (1024 * 1000000))))
    except:
        return None
    return return_dict

_CLOCK_TICKS = os.sysconf("SC_CLK_TCK")

def get_cpu_time():
    need_sleep = False
    if not os.path.isfile(‘/tmp/cpu_stat‘) or os.path.getsize(‘/tmp/cpu_stat‘) == 0:
        copyfile(‘/proc/stat‘, ‘/tmp/cpu_stat‘)
        need_sleep = True

    try:
        f1 = open(‘/tmp/cpu_stat‘, ‘r‘)
        values1 = f1.readline().split()
        total_time1 = 0
        for i in values1[1:]:
            total_time1 += int(i)
        idle_time1 = int(values1[4])
        iowait_time1 = int(values1[5])
    finally:
        f1.close()

    if need_sleep:
        time.sleep(1)

    f2 = open(‘/proc/stat‘, ‘r‘)
    try:
        values2 = f2.readline().split()
        total_time2 = 0
        for i in values2[1:]:
            total_time2 += int(i)
        idle_time2 = int(values2[4])
        iowait_time2 = int(values2[5])
    finally:
        f2.close()
    idle_time = idle_time2 - idle_time1
    iowait_time = iowait_time2 - iowait_time1
    total_time = total_time2 - total_time1

    cpu_percentage = int(100.0 * (total_time - idle_time - iowait_time) / total_time)
    # compensate logic
    if total_time < 0 or idle_time < 0 or iowait_time < 0 or cpu_percentage < 0 or cpu_percentage > 100:
        time.sleep(1)
        f3 = open(‘/proc/stat‘, ‘r‘)
        try:
            values3 = f3.readline().split()
            total_time3 = 0
            for i in values3[1:]:
                total_time3 += int(i)
            idle_time3 = int(values3[4])
            iowait_time3 = int(values3[5])
        finally:
            f3.close()
        idle_time = idle_time3 - idle_time2
        iowait_time = iowait_time3 - iowait_time2
        total_time = total_time3 - total_time2
        cpu_percentage = int(100.0 * (total_time - idle_time - iowait_time) / total_time)

    copyfile(‘/proc/stat‘, ‘/tmp/cpu_stat‘)
    return cpu_percentage

def network_io_kbitps():
    """Return network I/O statistics for every network interface
    installed on the system as a dict of raw tuples.
    """
    f1 = open("/proc/net/dev", "r")
    try:
        lines1 = f1.readlines()
    finally:
        f1.close()

    retdict1 = {}
    for line1 in lines1[2:]:
        colon1 = line1.find(‘:‘)
        assert colon1 > 0, line1
        name1 = line1[:colon1].strip()
        fields1 = line1[colon1 + 1:].strip().split()
        bytes_recv1 = float(‘%.4f‘ % (float(fields1[0]) * 0.0078125))
        bytes_sent1 = float(‘%.4f‘ % (float(fields1[8]) * 0.0078125))
        retdict1[name1] = (bytes_recv1, bytes_sent1)
    time.sleep(1)
    f2 = open("/proc/net/dev", "r")
    try:
        lines2 = f2.readlines()
    finally:
        f2.close()
    retdict2 = {}
    for line2 in lines2[2:]:
        colon2 = line2.find(‘:‘)
        assert colon2 > 0, line2
        name2 = line2[:colon2].strip()
        fields2 = line2[colon2 + 1:].strip().split()
        bytes_recv2 = float(‘%.4f‘ % (float(fields2[0]) * 0.0078125))
        bytes_sent2 = float(‘%.4f‘ % (float(fields2[8]) * 0.0078125))
        retdict2[name2] = (bytes_recv2, bytes_sent2)
    retdict = merge_with(retdict2, retdict1)
    return retdict

def disk_io_Kbps():
    iostat = Popen("iostat -d -k 1 2 | sed ‘/Device\|Linux\|^$/d‘ > /tmp/disk_io", shell=True, stdout=PIPE, stderr=PIPE)
    iostat_error = iostat.communicate()[1].strip()
    if iostat_error:
        logger.error("iostat not exists, %s" % iostat_error)
        return None

    retdict = {}
    exception = None
    try:
        try:
            f = open(‘/tmp/disk_io‘, ‘r‘)
        except Exception, ex:
            exception = ex
            logger.error(exception)
        if exception:
            return None
        lines = f.readlines()
        for line in lines:
            name, _, readkps, writekps, _, _, = line.split()
            if name:
                readkps = float(readkps)
                writekps = float(writekps)
                retdict[name] = (readkps, writekps)
        return retdict
    finally:
        f.close()

def merge_with(d1, d2, fn=lambda x, y: tuple(map(operator.sub, x, y))):
    res = d1.copy() # "= dict(d1)" for lists of tuples
    for key, val in d2.iteritems(): # ".. in d2" for lists of tuples
        try:
            res[key] = fn(res[key], val)
        except KeyError:
            res[key] = val
    return res

def get_load():
    try:
        f = open(‘/proc/loadavg‘, ‘r‘)
        tmp = f.readline().split()
        lavg_1 = float(tmp[0])
        lavg_5 = float(tmp[1])
        lavg_15 = float(tmp[2])
        f.close()
    except:
        return None
    return lavg_1, lavg_5, lavg_15

def get_tcp_status():
    check_cmd = "command -v ss"
    check_proc = Popen(check_cmd, shell=True, stdout=PIPE)
    ss = check_proc.communicate()[0].rstrip(‘\n‘)
    if ss:
        cmd = "ss -ant | awk ‘{if(NR != 1) print $1}‘ | awk ‘{state=$1;arr[state]++} END{for(i in arr){printf \"%s=%s \", i,arr[i]}}‘ | sed ‘s/-/_/g‘ | sed ‘s/ESTAB=/ESTABLISHED=/g‘ | sed ‘s/FIN_WAIT_/FIN_WAIT/g‘"
    else:
        cmd = "netstat -anp | grep tcp | awk ‘{print $6}‘ | awk ‘{state=$1;arr[state]++} END{for(i in arr){printf \"%s=%s \", i,arr[i]}}‘ | tail -n 1"
    tcp_proc = Popen(cmd, shell=True, stdout=PIPE)
    tcp_status = tcp_proc.communicate()[0].rstrip(‘\n‘)
    return tcp_status

def get_proc_number():
    cmd = "ps axu | wc -l | tail -n 1"
    proc_func = Popen(cmd, shell=True, stdout=PIPE)
    proc_number = proc_func.communicate()[0].rstrip(‘\n‘)
    return proc_number

def all_index():
    return (
        int(time.time() * 1000),
        get_cpu_time(),
        get_mem_usage_percent(),
        check_disk(),
        disk_io_Kbps(),
        network_io_kbitps(),
        get_load(),
        get_tcp_status(),
        get_proc_number()
    )

def collector():
    timestamp, cpu, mem, disk, disk_io, net, load, tcp_status, process_number = all_index()
    disk_utilization = ‘‘
    disk_io_read = ‘‘
    disk_io_write = ‘‘
    internet_networkrx = ‘‘
    internet_networktx = ‘‘
    tcp_status_count = ‘‘
    period_1 = ‘‘
    period_5 = ‘‘
    period_15 = ‘‘

    if UUID:
        cpu_utilization = ‘vm.CPUUtilization ‘ + str(timestamp) + ‘ ‘ + str(cpu) + ‘ ns=ACS/ECS unit=Percent instanceId=%s\n‘ % UUID

        memory_utilization = ‘vm.MemoryUtilization ‘ + str(timestamp) + ‘ ‘ + str(mem[0]) + ‘ ns=ACS/ECS unit=Percent instanceId=%s\n‘ % UUID

        if load:
            period_1 = ‘vm.LoadAverage ‘ + str(timestamp) + ‘ ‘ + str(load[0]) + ‘ ns=ACS/ECS unit=count‘ + ‘ instanceId=%s period=1min\n‘ % UUID
            period_5 = ‘vm.LoadAverage ‘ + str(timestamp) + ‘ ‘ + str(load[1]) + ‘ ns=ACS/ECS unit=count‘ + ‘ instanceId=%s period=5min\n‘ % UUID
            period_15 = ‘vm.LoadAverage ‘ + str(timestamp) + ‘ ‘ + str(load[2]) + ‘ ns=ACS/ECS unit=count‘ + ‘ instanceId=%s period=15min\n‘ % UUID

        if disk:
            for name, value in disk.items():
                disk_utilization = disk_utilization + ‘vm.DiskUtilization ‘ + str(timestamp) + ‘ ‘ + str(value[0]) + ‘ ns=ACS/ECS unit=Percent instanceId=%s mountpoint=%s\n‘ % (UUID, name)

        if disk_io:
            for name, value in disk_io.items():
                disk_io_read = disk_io_read + ‘vm.DiskIORead ‘ + str(timestamp) + ‘ ‘ + str(value[0]) + ‘ ns=ACS/ECS unit=Kilobytes/Second instanceId=%s diskname=%s\n‘ % (UUID, name)
                disk_io_write = disk_io_write + ‘vm.DiskIOWrite ‘ + str(timestamp) + ‘ ‘ + str(value[1]) + ‘ ns=ACS/ECS unit=Kilobytes/Second instanceId=%s diskname=%s\n‘ % (UUID, name)

        for name, value in net.items():
            internet_networkrx = internet_networkrx + ‘vm.InternetNetworkRX ‘ + str(timestamp) + ‘ ‘ + str(value[0]) + ‘ ns=ACS/ECS unit=Kilobits/Second instanceId=%s netname=%s\n‘ % (UUID, name)
            internet_networktx = internet_networktx + ‘vm.InternetNetworkTX ‘ + str(timestamp) + ‘ ‘ + str(value[1]) + ‘ ns=ACS/ECS unit=Kilobits/Second instanceId=%s netname=%s\n‘ % (UUID, name)

        if tcp_status:
            status_count = tcp_status.split()
            for element in status_count:
                key_value = element.split(‘=‘)
                tcp_status_count = tcp_status_count + ‘vm.TcpCount ‘ + str(timestamp) + ‘ ‘ + key_value[1] + ‘ ns=ACS/ECS unit=Count instanceId=%s state=%s\n‘ % (UUID, key_value[0])

        process_count = ‘vm.ProcessCount ‘ + str(timestamp) + ‘ ‘ + process_number + ‘ ns=ACS/ECS unit=Count instanceId=%s\n‘ % UUID
    else:
        cpu_utilization = ‘vm.CPUUtilization ‘ + str(timestamp) + ‘ ‘ + str(cpu) + ‘ ns=ACS/ECS unit=Percent\n‘

        memory_utilization = ‘vm.MemoryUtilization ‘ + str(timestamp) + ‘ ‘ + str(mem[0]) + ‘ ns=ACS/ECS unit=Percent\n‘

        if load:
            period_1 = ‘vm.LoadAverage ‘ + str(timestamp) + ‘ ‘ + str(load[0]) + ‘ ns=ACS/ECS unit=count period=1min\n‘
            period_5 = ‘vm.LoadAverage ‘ + str(timestamp) + ‘ ‘ + str(load[1]) + ‘ ns=ACS/ECS unit=count period=5min\n‘
            period_15 = ‘vm.LoadAverage ‘ + str(timestamp) + ‘ ‘ + str(load[2]) + ‘ ns=ACS/ECS unit=count period=15min\n‘

        if disk:
            for name, value in disk.items():
                disk_utilization = disk_utilization + ‘vm.DiskUtilization ‘ + str(timestamp) + ‘ ‘ + str(value[0]) + ‘ ns=ACS/ECS unit=Percent mountpoint=%s\n‘ % name

        if disk_io:
            for name, value in disk_io.items():
                disk_io_read = disk_io_read + ‘vm.DiskIORead ‘ + str(timestamp) + ‘ ‘ + str(value[0]) + ‘ ns=ACS/ECS unit=Kilobytes/Second diskname=%s\n‘ % name
                disk_io_write = disk_io_write + ‘vm.DiskIOWrite ‘ + str(timestamp) + ‘ ‘ + str(value[1]) + ‘ ns=ACS/ECS unit=Kilobytes/Second diskname=%s\n‘ % name

        for name, value in net.items():
            internet_networkrx = internet_networkrx + ‘vm.InternetNetworkRX ‘ + str(timestamp) + ‘ ‘ + str(value[0]) + ‘ ns=ACS/ECS unit=Kilobits/Second netname=%s\n‘ % name
            internet_networktx = internet_networktx + ‘vm.InternetNetworkTX ‘ + str(timestamp) + ‘ ‘ + str(value[1]) + ‘ ns=ACS/ECS unit=Kilobits/Second netname=%s\n‘ % name

        if tcp_status:
            status_count = tcp_status.split()
            for element in status_count:
                key_value = element.split(‘=‘)
                tcp_status_count = tcp_status_count + ‘vm.TcpCount ‘ + str(timestamp) + ‘ ‘ + key_value[1] + ‘ ns=ACS/ECS unit=Count state=%s\n‘ % key_value[0]

        process_count = ‘vm.ProcessCount ‘ + str(timestamp) + ‘ ‘ + process_number + ‘ ns=ACS/ECS unit=Count\n‘

    data_post = cpu_utilization + memory_utilization + period_1 + period_5 + period_15 + disk_utilization + disk_io_read + disk_io_write + internet_networkrx + internet_networktx + tcp_status_count + process_count
    print data_post
    interval = random.randint(0, 5000)
    time.sleep(interval / 1000.0)

    headers = {"Content-Type": "text/plain", "Accept": "text/plain"}
    exception = None
    http_client = None
    try:
        try:
            http_client = httplib.HTTPConnection(REMOTE_HOST, REMOTE_PORT)
            http_client.request(method="POST", url=REMOTE_MONITOR_URI, body=data_post, headers=headers)
            response = http_client.getresponse()
            if response.status == 200:
                return
            else:
                logger.warn("response code %d" % response.status)
                logger.warn("response code %s" % response.read())
        except Exception, ex:
            exception = ex
    finally:
        if http_client:
            http_client.close()
        if exception:
            logger.error(exception)

if __name__ == ‘__main__‘:
    REMOTE_HOST = ‘open.cms.aliyun.com‘
    REMOTE_PORT = 80

    # get report address
    if not os.path.isfile("../cmscfg"):
        pass
    else:
        props = {}
        prop_file = file("../cmscfg", ‘r‘)
        for line in prop_file.readlines():
            kv = line.split(‘=‘)
            props[kv[0].strip()] = kv[1].strip()
        prop_file.close()
        if props.get(‘report_domain‘):
            REMOTE_HOST = props.get(‘report_domain‘)
        if props.get(‘report_port‘):
            REMOTE_PORT = props.get(‘report_port‘)

    # get uuid
    if not os.path.isfile("../aegis_quartz/conf/uuid"):
        pass
    else:
        uuid_file = file("../aegis_quartz/conf/uuid", ‘r‘)
        UUID = uuid_file.readline()
        UUID = UUID.lower()

    REMOTE_MONITOR_URI = "/metrics/putLines"
    MONITOR_DATA_FILE_DIR = "/tmp"
    LOG_FILE = "/tmp/" + "vm.log"
    LOG_LEVEL = logging.INFO
    LOG_FILE_MAX_BYTES = 1024 * 1024
    LOG_FILE_MAX_COUNT = 3
    logger = logging.getLogger(‘sampler‘)
    logger.setLevel(LOG_LEVEL)
    handler = RotatingFileHandler(filename=LOG_FILE, mode=‘a‘, maxBytes=LOG_FILE_MAX_BYTES,
                                  backupCount=LOG_FILE_MAX_COUNT)
    formatter = logging.Formatter(fmt=‘%(asctime)s - %(levelname)s - %(message)s‘)
    handler.setFormatter(formatter)
    logger.addHandler(handler)
    socket.setdefaulttimeout(10)

    try:
        collector()
    except Exception, e:
        logger.error(e)
        sys.exit(1)
时间: 2024-11-06 07:14:20

阿里云收集服务器性能指标的python脚本的相关文章

nginx+uwsgi阿里云ubuntu服务器上简单部署flask RESTful风格项目

ubuntu16.04上利用Nginx代理uwsgi处理Flask web应用 1.环境要求 ubuntu16.04  ----  阿里云的服务器 Nginx python2 uwsgi 2.简单介绍Nginx nginx是一个高性能的http和反向代理的服务器,Nginx采采用的epoll的机制,而没有使用select和poll,虽然,在用户活跃数量比较高的时候,epoll性能不如select,但是,我们用Nginx来作为web服务器还是很不错的.nginx是一个轻量级的web服务器,他占用内

阿里云ECS服务器部署django

参考 服务器安装的是Centos 系统. uwsgi是使用pip安装的. nginx是使用yum install nginx安装. python 2.7, mysql 5.5使用 yum安装. 它们之间的逻辑关系如下: the web client <-> the web server <-> the socket <-> uwsgi <-> Django uswgi负责从Django拿内容,通过socket传给 web server如nginx, 最后显示

codis/redis数据数据迁移至阿里云redis服务器

本次迁移采用了唯品会的开源工具RMT 1.阿里云redis服务器的购买 注:要和生产上数据的内存大小一致 不然有些key会迁移失败 很明显的OOM报错 2.迁移机器的cpu要足够  迁移会有一段时间的负载上升 对迁移机器的IOPS有要求 rmt_redis.c:1474 Error: I/O error reading bulk count from MASTER 这种报错你就需要查看一下 迁移codis服务器的性能了 3.RMT(redis-migrate-tool)工具的安装 git clo

阿里云香港服务器购买教程

本文介绍如何购买阿里云香港服务器(Windows版本). 如果你有查询谷歌学术资料以及其他类似的特殊上网需求,并且希望简单.稳定.好用,那么本文适合你. 注意:教程中的选项都是保证运行的最低配置,如果不差钱,可以自己选更高的配置以及更长的使用时间. 以下操作请在PC端浏览器上操作 1.登录 https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=srr6gibf 领取红包,这样可以获得一定的优惠.如果没有注册阿里云账号,需

ahjesus linux连接阿里云ubuntu服务器并更改默认账号和密码,以及创建子账户

先确保本地Linux服务器SSH服务开启,如果没有开启直接执行指令:service sshd start 然后我们使用ssh指令进行远程登陆 ssh [email protected] 输入passwd指令修改旧密码 修改默认账号root vi /etc/passwd 按i键进入编辑状态 修改第1行第1个root为新的用户名 按esc键退出编辑状态,并输入:x保存并退出 vi /etc/shadow 按i键进入编辑状态 修改第1行第1个root为新的用户名 按esc键退出编辑状态,并输入:x!强

阿里云ftp服务器创建和使用(WinServer2003)

  阿里云ftp服务器创建使用手册   最近ITOO项目需要发布到阿里云上,每天传东西都是先传到云盘上然后在从云盘上下载到服务器上.总结起来就是你两个字--麻烦!于是乎就想到了在服务器上建一个FTP服务器,接下来就就详细介绍一下如何在阿里云服务器上创建FTP的过程. 一.添加用户 1.右击我的电脑,选择管理 2.如图找到需要选择"用户",右击选择添加 3.输入用户名和密码 二.IIS发布FTP站点 1.打开IIS服务 2.创建一个新的FTP站点 3.选择"下一步"

阿里云ECS服务器的搭建

之前写了一个Android小项目,然后里面各种与后台数据库的交互,然后差不多完成了吧!感觉应该买一个服务器,而不是每次都是需要启动MyEclipse,启动Tomcat服务器才能够启动服务,获取到数据.那么这次就讲一下阿里云ECS服务器搭建的流程吧! 1. 去阿里云的官网购买服务器,菜单栏的"产品"-->"弹性计算"-->"云服务器ECS" 2. 进去里面购买,分为包年包月 与 按量付费 两种模式,其实价格对于学生党来说还是不算便宜的.

阿里云免费服务器搭建学习过程--成功:

2015.11.7整理阿里云免费服务器搭建学习过程:配置lamp环境环境介绍:阿里云免费服务器15天免费试用,我选择的是ubuntu14.04(如果选择的是windowsServer可以切换到Ubuntu,但是会丢失之前的一切文件,项目和配置,当然也可以直接配置wamp环境等) 建议:安装Ubuntu后默认没有图形界面,建议刚开始只是学习体验的话不用去安装图形界面,花时间且用处不大,可以直接在自己电脑上的浏览器利用ip进行访问测试即可. 两步操作1:执行sudo spt-get update,这

阿里云ECS服务器Linux环境下配置php服务器(二)--phpMyAdmin篇

首先说明,以下文本内容用vim编辑麻烦 可参考阿里云ECS服务器Linux环境下配置php服务器(一)--基础配置篇 这一次我们来继续说说phpMyAdmin的安装. 什么是phpMyAdmin?phpMyAdmin是一种mysql的管理工具,它可以直接通过网页来管理你的MySQL,当然,phpMyAdmin不是必要的,如果你不安装phpMyAdmin,一样可以通过mysql的命令行来管理你的mysql. 开始安装. 首先找到phpMyAdmin的下载地址(推荐官网地址https://www.p