博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
监控开发之用python扩展dstat插件自定义实时监控
阅读量:5797 次
发布时间:2019-06-18

本文共 5236 字,大约阅读时间需要 17 分钟。

    dstat是一个python开源的实时监控工具,一般是用来做系统性能监控的。咱们这里只是提他的自定义插件开发,用来打造自己的dstat。 有朋友可能还没清楚是什么意思, 咱们查看系统的状体状态有人喜欢用vmstat,也有人喜欢用dstat。

     

   相比来说dstat的功能模块更全一点是,这里还只是说查看系统性能方面的 !   如果想一边查看,系统的各方面性能指标,还想看你应用的一些个负载相关,比如某个程序的负载,mongodb的锁lock百分比,mysql连接数...   懂了吧 !


下面是dstat的插件,这些组件基本是python开发。大家可以随便找个脚本看看。一开始在官网找相关的文档,就那几百行的文档,没看懂,这次真不是我英语不行,是他们真没说明白, 我还看到很多人提了issue,也是在问怎么搞扩展。 在官网没找到思路后,我直接看dstat的源码,然后找了个例子,原来是如此的简单。

你传递的参数,他会引入模块,引入的合适的格式 dstat_innodb_io.py ,他会匹配引入模块,然后调用模块  。 


     当然这类似dstat、vmstat的工具,我们自己也能做,但dstat的性能统计信息已经完整了,就没必要重新自己写一套了 。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
原文: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有多少个活动进程。

1
2
3
4
5
6
7
8
9
10
11
12
13
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模块包的,不然报错。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
### 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]是值 。


再来一个mysql 连接数的例子,这个也是默认给的。系统首先会调用check函数,然后才会执行extract。这里的账号和密码,以及主机ip和端口都需要你自己变动的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
     
    
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
:
            
= 
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的邮件队列。

原文:

dstat   有个小小的缺点,他自己没有多线程或者多进程的实现。这样会导致采集多个信息的时候,会有些慢。

vmstat和dstat虽然很有优秀,但是咱们的要求更高,更全面,那就请自己扩展插件吧。

 本文转自 rfyiamcool 51CTO博客,原文链接:http://blog.51cto.com/rfyiamcool/1430966
,如需转载请自行联系原作者
你可能感兴趣的文章
参加婚礼
查看>>
刚毕业从事java开发需要掌握的技术
查看>>
Java重写equals方法和hashCode方法
查看>>
Spark API编程动手实战-07-join操作深入实战
查看>>
EasyUI基础入门之Easyloader(载入器)
查看>>
java中ArrayList 、LinkList区别
查看>>
Spring ’14 Wave Update: Installing Dynamics CRM on Tablets for Windows 8.1
查看>>
利用rand7()构造rand10()
查看>>
MySQL 备份与恢复
查看>>
吃午饭前,按书上的代码写会儿--Hunt the Wumpus第一个版本
查看>>
TEST
查看>>
PAT A1037
查看>>
ReactiveSwift源码解析(三) Signal代码的基本实现
查看>>
(六)Oracle学习笔记—— 约束
查看>>
[Oracle]如何在Oracle中设置Event
查看>>
top.location.href和localtion.href有什么不同
查看>>
02-创建hibernate工程
查看>>
information_schema系列五(表,触发器,视图,存储过程和函数)
查看>>
瓜子二手车的谎言!
查看>>
[转]使用Git Submodule管理子模块
查看>>