監控開發之用python擴展dstat插件自定義實時監控


    dstat是一個python開源的實時監控工具,通常是用來作系統性能監控的。我們這裏只是提他的自定義插件開發,用來打造本身的dstat。 有朋友可能還沒清楚是什麼意思, 我們查看系統的狀體狀態有人喜歡用vmstat,也有人喜歡用dstat。python

     

   相比來講dstat的功能模塊更全一點是,這裏還只是說查看系統性能方面的 !   若是想一邊查看,系統的各方面性能指標,還想看你應用的一些個負載相關,好比某個程序的負載,mongodb的鎖lock百分比,mysql鏈接數...   懂了吧 !mysql


下面是dstat的插件,這些組件基本是python開發。你們能夠隨便找個腳本看看。一開始在官網找相關的文檔,就那幾百行的文檔,沒看懂,此次真不是我英語不行,是他們真沒說明白, 我還看到不少人提了issue,也是在問怎麼搞擴展。 在官網沒找到思路後,我直接看dstat的源碼,而後找了個例子,原來是如此的簡單。redis

你傳遞的參數,他會引入模塊,引入的合適的格式 dstat_innodb_io.py ,他會匹配引入模塊,而後調用模塊  。 sql


     固然這相似dstat、vmstat的工具,咱們本身也能作,但dstat的性能統計信息已經完整了,就不必從新本身寫一套了 。mongodb


原文:http://rfyiamcool.blog.51cto.com/1030776/1430966
[root@66 dstat]# pwd
/usr/share/dstat
[root@66 dstat]# ls
dstat_battery.py          dstat_innodb_io.py       dstat_nfs3_ops.pyo    dstat_sendmail.pyo         dstat_top_oom.pyo
dstat_battery.pyo         dstat_innodb_io.pyo      dstat_nfs3.py         dstat_snooze.py            dstat_utmp.py
dstat_battery_remain.py   dstat_innodb_ops.py      dstat_nfs3.pyo        dstat_snooze.pyo           dstat_utmp.pyo
dstat_battery_remain.pyo  dstat_innodb_ops.pyo     dstat_nfsd3_ops.py    dstat_thermal.py           dstat_vmk_hba.py
dstat_cpufreq.py          dstat_lustre.py          dstat_nfsd3_ops.pyo   dstat_thermal.pyo          dstat_vmk_hba.pyo
dstat_cpufreq.pyo         dstat_lustre.pyo         dstat_nfsd3.py        dstat_top_bio.py           dstat_vmk_int.py
dstat_dbus.py             dstat_memcache_hits.py   dstat_nfsd3.pyo       dstat_top_bio.pyo          dstat_vmk_int.pyo
dstat_dbus.pyo            dstat_memcache_hits.pyo  dstat_ntp.py          dstat_top_cpu.py           dstat_vmk_nic.py
dstat_disk_util.py        dstat_mysql5_cmds.py     dstat_ntp.pyo         dstat_top_cpu.pyo          dstat_vmk_nic.pyo
dstat_disk_util.pyo       dstat_mysql5_cmds.pyo    dstat_postfix.py      dstat_top_cputime_avg.py   dstat_vm_memctl.py
dstat_fan.py              dstat_mysql5_conn.py     dstat_postfix.pyo     dstat_top_cputime_avg.pyo  dstat_vm_memctl.pyo
dstat_fan.pyo             dstat_mysql5_io.py       dstat_power.py        dstat_top_cputime.py       dstat_vz_cpu.py
dstat_freespace.py        dstat_mysql5_io.pyo      dstat_power.pyo       dstat_top_cputime.pyo      dstat_vz_cpu.pyo
dstat_freespace.pyo       dstat_mysql5_keys.py     dstat_proc_count.py   dstat_top_io.py            dstat_vz_io.py
dstat_gpfs_ops.py         dstat_mysql5_keys.pyo    dstat_proc_count.pyo  dstat_top_io.pyo           dstat_vz_io.pyo
dstat_gpfs_ops.pyo        dstat_mysql_io.py        dstat.py              dstat_top_latency_avg.py   dstat_vz_ubc.py
dstat_gpfs.py             dstat_mysql_io.pyo       dstat.pyo             dstat_top_latency_avg.pyo  dstat_vz_ubc.pyo
dstat_gpfs.pyo            dstat_mysql_keys.py      dstat_rpcd.py         dstat_top_latency.py       dstat_wifi.py
dstat_helloworld.py       dstat_mysql_keys.pyo     dstat_rpcd.pyo        dstat_top_latency.pyo      dstat_wifi.pyo
dstat_helloworld.pyo      dstat_net_packets.py     dstat_rpc.py          dstat_top_mem.py           p-mem
dstat_innodb_buffer.py    dstat_net_packets.pyo    dstat_rpc.pyo         dstat_top_mem.pyo
dstat_innodb_buffer.pyo   dstat_nfs3_ops.py        dstat_sendmail.py     dstat_top_oom.py

  

首先來個簡單的例子,咱們想查看proc有多少個活動進程。bash

class dstat_plugin(dstat):
    """
    Total Number of processes on this system.
    """
    def __init__(self):
        self.name   = 'procs'
        self.type = 'd'
        self.width = 4
        self.scale = 10
        self.vars   = ('total',)

    def extract(self):
        self.val['total'] = len(glob.glob('/proc/[0-9]*'))

vars是顯示的內容,val['total']是相對於vars的值。多線程


咱們來看個dstat 對於memcached的實時監控,這個須要你安裝python memcahced模塊包的,否則報錯。ide

### Author: Dean Wilson <dean.wilson@gmail.com>

class dstat_plugin(dstat):
    """
    Memcache hit count plugin.

    Displays the number of memcache get_hits and get_misses.
    """
    def __init__(self):
        self.name = 'Memcache Hits'
        self.type = 'd'
        self.width = 6
        self.scale = 50
        self.nick = ('Hit', 'Miss')
        self.vars = ('get_hits', 'get_misses')

    def check(self):
        try:
            global memcache
            import memcache
            self.mc = memcache.Client(['127.0.0.1:11211'], debug=0)
        except:
            raise Exception, 'Plugin needs the memcache module'

    def extract(self):
        stats = self.mc.get_stats()
        for key in self.vars:
            self.val[key] = long(stats[0][1][key])
~


其實主要是就兩個點,一個是 vars是顯示的名字,val[key]是值 。memcached


再來一個mysql 鏈接數的例子,這個也是默認給的。系統首先會調用check函數,而後纔會執行extract。這裏的帳號和密碼,以及主機ip和端口都須要你本身變更的。函數

    
    def __init__(self):
        self.name = 'mysql5 conn'
        self.type = 'f'
        self.width = 4
        self.scale = 1
        self.nick = ('ThCon', '%Con')
        self.vars = ('Threads_connected', 'Threads')
    def check(self): 
        global MySQLdb
        import MySQLdb
        try:
            self.db = MySQLdb.connect(user=mysql_user, passwd=mysql_pwd)
        except Exception, e:
            raise Exception, 'Cannot interface with MySQL server, %s' % e

    def extract(self):
        try:
            c = self.db.cursor()
            c.execute("""show global variables like 'max_connections';""")
            max = c.fetchone()
            c.execute("""show global status like 'Threads_connected';""")
            thread = c.fetchone()
            if thread[0] in self.vars:
                self.set2[thread[0]] = float(thread[1])
                self.set2['Threads'] = float(thread[1] / float(max[1]) 1.0 * 100)

            for name in self.vars:
                self.val[name] = self.set2[name] * 1.0 / elapsed

            if step == op.delay:
                self.set1.update(self.set2)

        except Exception, e:
            for name in self.vars:
                self.val[name] = -1



下面是我爲本身擴展了一個方便本身查看性能指標的面板。  能夠查看網速,線程鏈接數,最大鏈接數,進程數,redis的郵件隊列。

原文:http://rfyiamcool.blog.51cto.com/1030776/1430966


wKioL1OpWVvSOUleAASig1qml_Q357.jpg


dstat   有個小小的缺點,他本身沒有多線程或者多進程的實現。這樣會致使採集多個信息的時候,會有些慢。



vmstat和dstat雖然頗有優秀,可是我們的要求更高,更全面,那就請本身擴展插件吧。

相關文章
相關標籤/搜索