自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

【博文推薦】Docker高級(jí)應(yīng)用之資源監(jiān)控

云計(jì)算
本篇博文出自51CTO博客博主dl528888。在本文中,博主將與大家分享他在開發(fā)Docker平臺(tái)時(shí)是如何監(jiān)控資源與進(jìn)行圖像展示的。

  本篇博文出自51CTO博客博主吟—技術(shù)交流,有任何問題請(qǐng)進(jìn)入博主頁面互動(dòng)討論!

博文地址:http://dl528888.blog.51cto.com/2382721/1635951

最近忙著開發(fā)docker平臺(tái),所以挺久沒有更新博客了,今天給大家分享一下,我開發(fā)docker平臺(tái)里如何監(jiān)控資源與進(jìn)行圖像展示的。

默認(rèn)docker 1.5版本有stats命令查看容器的cpu使用率、內(nèi)存使用量與網(wǎng)絡(luò)流量,但此功能有2個(gè)必須:

1、必須是docker 1.5版本

2、必須使用默認(rèn)docker0的網(wǎng)橋(如果你使用ovs這樣非原生的網(wǎng)橋無法獲取數(shù)據(jù)的)

我開發(fā)的監(jiān)控里docker是1.5版本,并且通過使用ifconfig來獲取容器rx或rx量來獲取容器流量,解決了必須使用docker默認(rèn)網(wǎng)橋才可以獲取流量數(shù)據(jù)。

下面是容器資源監(jiān)控效果圖

1、平臺(tái)里資源監(jiān)控界面

 

Docker高級(jí)應(yīng)用之資源監(jiān)控

2、查看容器yangjing-test的cpu使用率資源監(jiān)控

 

Docker高級(jí)應(yīng)用之資源監(jiān)控

3、查看內(nèi)存使用量資源監(jiān)控

 

Docker高級(jí)應(yīng)用之資源監(jiān)控

4、查看容器網(wǎng)絡(luò)流量信息

 

Docker高級(jí)應(yīng)用之資源監(jiān)控

#p#

下面是監(jiān)控?cái)?shù)據(jù)收集腳本信息

使用python寫的,由于需要往mysql里寫入數(shù)據(jù),所以需要安裝MySQLdb模塊以及服務(wù)端mysql開啟賬號(hào)

  1. [root@ip-10-10-29-201 code]# cat collect_docker_monitor_data_multi.py 
  2. #!/usr/bin/env python 
  3. #-*- coding: utf-8 -*- 
  4. #author:Deng Lei 
  5. #email: dl528888@gmail.com 
  6. from docker import Client 
  7. import os 
  8. import socket, struct, fcntl 
  9. import etcd 
  10. import MySQLdb 
  11. import re 
  12. import multiprocessing 
  13. import subprocess 
  14. import time 
  15. def get_local_ip(iface = 'em1'): 
  16.     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
  17.     sockfd = sock.fileno() 
  18.     SIOCGIFADDR = 0x8915 
  19.     ifreq = struct.pack('16sH14s', iface, socket.AF_INET, '\x00'*14
  20.     try
  21.         res = fcntl.ioctl(sockfd, SIOCGIFADDR, ifreq) 
  22.     except
  23.         return None 
  24.     ip = struct.unpack('16sH2x4s8x', res)[2
  25.     return socket.inet_ntoa(ip) 
  26. def docker_container_all(): 
  27.     docker_container=docker_client.containers(all=True
  28.     container_name=[] 
  29.     container_stop_name=[] 
  30.     for i in docker_container: 
  31.         container_name.append(i['Names']) 
  32.     for b in container_name: 
  33.         for c in b: 
  34.             container_stop_name.append(c[1::]) 
  35.     return container_stop_name 
  36. def docker_container_run(): 
  37.     docker_container=docker_client.containers(all=True
  38.     container_name=[] 
  39.     container_stop_name=[] 
  40.     for i in docker_container: 
  41.         if re.match('Up',i['Status']): 
  42.             container_name.append(i['Names']) 
  43.     for b in container_name: 
  44.         for c in b: 
  45.             container_stop_name.append(c[1::]) 
  46.     return container_stop_name 
  47. def check_container_stats(name): 
  48.     container_collect=docker_client.stats(name) 
  49.     old_result=eval(container_collect.next()) 
  50.     new_result=eval(container_collect.next()) 
  51.     container_collect.close() 
  52.     cpu_total_usage=new_result['cpu_stats']['cpu_usage']['total_usage'] - old_result['cpu_stats']['cpu_usage']['total_usage'
  53.     cpu_system_uasge=new_result['cpu_stats']['system_cpu_usage'] - old_result['cpu_stats']['system_cpu_usage'
  54.     cpu_num=len(old_result['cpu_stats']['cpu_usage']['percpu_usage']) 
  55.     cpu_percent=round((float(cpu_total_usage)/float(cpu_system_uasge))*cpu_num*100.0,2
  56.     mem_usage=new_result['memory_stats']['usage'
  57.     mem_limit=new_result['memory_stats']['limit'
  58.     mem_percent=round(float(mem_usage)/float(mem_limit)*100.0,2
  59.     #network_rx_packets=new_result['network']['rx_packets'] 
  60.     #network_tx_packets=new_result['network']['tx_packets'] 
  61.     network_check_command="""docker exec %s ifconfig eth1|grep bytes|awk -F ':' '{print $2,$3}'|awk -F '(' '{print $1,$2}'|awk -F ')' '{print $1}'|awk '{print "{\\"rx\\":"$1",\\"tx\\":"$2"}"}'"""%name 
  62.     network_old_result=eval(((subprocess.Popen(network_check_command,shell=True,stdout=subprocess.PIPE)).stdout.readlines()[0]).strip('\n')) 
  63.     time.sleep(1
  64.     network_new_result=eval(((subprocess.Popen(network_check_command,shell=True,stdout=subprocess.PIPE)).stdout.readlines()[0]).strip('\n')) 
  65.     #unit KB 
  66.     network_rx_packets=(int(network_new_result['rx']) - int(network_old_result['rx']))/1024 
  67.     network_tx_packets=(int(network_new_result['tx']) - int(network_old_result['tx']))/1024 
  68.     collect_time=str(new_result['read'].split('.')[0].split('T')[0])+' '+str(new_result['read'].split('.')[0].split('T')[1]) 
  69.     msg={'Container_name':name,'Cpu_percent':cpu_percent,'Memory_usage':mem_usage,'Memory_limit':mem_limit,'Memory_percent':mem_percent,'Network_rx_packets':network_rx_packets,'Network_tx_packets':network_tx_packets,'Collect_time':collect_time} 
  70.     #write_mysql(msg) 
  71.     return msg 
  72. def write_mysql(msg): 
  73.     container_name=msg['Container_name'
  74.     search_sql="select dc.id from docker_containers dc,docker_physics dp where dc.container_name='%s' and dp.physics_internal_ip='%s';"%(container_name,local_ip) 
  75.     n=mysql_cur.execute(search_sql) 
  76.     container_id=[int(i[0]) for i in mysql_cur.fetchall()][0
  77.     insert_sql="insert into docker_monitor(container_id,cpu_percent,memory_usage,memory_limit,memory_percent,network_rx_packets,network_tx_packets,collect_time) values('%s','%s','%s','%s','%s','%s','%s','%s');"%(container_id,msg['Cpu_percent'],msg['Memory_usage'],msg['Memory_limit'],msg['Memory_percent'],msg['Network_rx_packets'],msg['Network_tx_packets'],msg['Collect_time']) 
  78.     n=mysql_cur.execute(insert_sql) 
  79. if __name__ == "__main__"
  80.     local_ip=get_local_ip('ovs1'
  81.     if local_ip is None
  82.   local_ip=get_local_ip('em1'
  83.     etcd_client=etcd.Client(host='127.0.0.1', port=4001
  84.     docker_client = Client(base_url='unix://var/run/docker.sock', version='1.17'
  85.     mysql_conn=MySQLdb.connect(host='10.10.27.10',user='ops',passwd='1FE@!#@NVE',port=3306,charset="utf8"
  86.     mysql_cur=mysql_conn.cursor() 
  87.     mysql_conn.select_db('devops'
  88.     #docker_container_all_name=docker_container_all() 
  89.     docker_container_run_name=docker_container_run() 
  90.     if len(docker_container_run_name) == 1
  91.   num=1 
  92.     elif len(docker_container_run_name) >= 4 and len(docker_container_run_name) <=8
  93.   num=4 
  94.     elif len(docker_container_run_name) >8 and len(docker_container_run_name) <=15
  95.   num=8 
  96.     elif len(docker_container_run_name) >15 and len(docker_container_run_name) <=30
  97.   num=20 
  98.     else
  99.   num=40 
  100.     pool = multiprocessing.Pool(processes=num) 
  101.     scan_result=[] 
  102.     #collect container monitor data 
  103.     for i in docker_container_run_name: 
  104.         pool.apply_async(check_container_stats, (i,)) 
  105.         scan_result.append(pool.apply_async(check_container_stats, (i,))) 
  106.     pool.close() 
  107.     pool.join() 
  108.     result=[] 
  109.     for res in scan_result: 
  110.         if res.get() is not None
  111.       write_mysql(res.get()) 
  112.   else
  113.       print 'fail is %s'%res.get() 
  114.     mysql_conn.commit() 
  115.     mysql_cur.close() 
  116.     mysql_conn.close() 

下面是把此腳本放入crontab里每分鐘收集一下

  1. */1 * * * * python /root/collect_docker_monitor_data_multi.py >>/root/docker_log/docker_monitor.log 2>&1 

另外說明一下,上面的監(jiān)控?cái)?shù)據(jù)圖形化使用highstock,使用ajax進(jìn)行動(dòng)態(tài)加載數(shù)據(jù),每次獲取容器所有時(shí)間監(jiān)控?cái)?shù)據(jù)。有問題請(qǐng)留言。
 

 

責(zé)任編輯:Ophira 來源: 51CTO
相關(guān)推薦

2015-07-01 10:25:07

Docker開源項(xiàng)目容器

2015-06-17 09:43:45

云計(jì)算應(yīng)用傳統(tǒng)企業(yè)應(yīng)用云平臺(tái)

2014-11-25 11:33:35

2011-03-29 12:45:28

Cacti

2015-05-15 10:04:28

localhost

2015-04-13 11:34:56

Windows DocNano ServerPaaS

2011-03-29 13:15:10

Cacti主機(jī)模板

2011-03-29 13:06:29

Cacti作圖模板

2015-06-17 09:34:09

軟件定義存儲(chǔ) 云存儲(chǔ)

2014-12-29 12:27:43

ZabbixSNMP

2013-12-21 19:58:32

SDN應(yīng)用資源管理平臺(tái)SDN

2014-12-12 10:46:55

Azure地緣組affinitygro

2015-06-15 13:06:23

項(xiàng)目項(xiàng)目經(jīng)驗(yàn)

2015-09-29 10:26:51

pythonlogging模塊

2015-05-27 09:17:50

AzureDocker

2015-04-22 10:28:40

2014-07-10 10:43:49

zabbix主從監(jiān)控

2015-05-11 10:10:16

2014-12-01 10:33:51

Python

2015-07-29 13:46:27

OpenStackIcehouse私有云實(shí)戰(zhàn)部署
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)