Package zephir :: Package monitor :: Package agents :: Module systeme
[hide private]
[frames] | no frames]

Source Code for Module zephir.monitor.agents.systeme

  1  # -*- coding: UTF-8 -*- 
  2  ########################################################################### 
  3  # Eole NG - 2007 
  4  # Copyright Pole de Competence Eole  (Ministere Education - Academie Dijon) 
  5  # Licence CeCill  cf /root/LicenceEole.txt 
  6  # eole@ac-dijon.fr 
  7  ########################################################################### 
  8   
  9  """ 
 10  Agents zephir pour Information Système 
 11  """ 
 12   
 13  from zephir.monitor.agentmanager.agent import MultiRRDAgent 
 14  from zephir.monitor.agentmanager import status 
 15  from zephir.monitor.agentmanager.data import TableData, HTMLData 
 16   
 17  from twisted.python import log 
 18  from twisted.internet import defer 
 19  from twisted.internet.utils import getProcessOutput 
 20   
 21  SECONDS_PER_DAY = 3600*24 
 22   
 23   
24 -def _mega(val):
25 """ transfo de la valeur passée (string en octets) en Mo 26 """ 27 return (int(val)/1024/1024)
28
29 -def _pourcent(use, tot):
30 """ calcul du pourcentage de mémoire utilisée 31 """ 32 #return (str(int(use)*100/int(tot))+"%") 33 if int(tot) != 0: 34 return (int(int(use)*100/int(tot))) 35 else: 36 return 0
37
38 -def _stats(x):
39 return "%.1f" % x
40
41 -class SysInfo(MultiRRDAgent):
42 """ 43 Bilan de l'etat de la memoire 44 présentation en tableau 45 """ 46
47 - def __init__(self, name, **params):
48 MultiRRDAgent.__init__(self, name, **params) 49 self.fich = "/proc/meminfo" 50 self.swap_pourcent = 0 51 self.kernel_version = "" 52 self.table = TableData([ 53 ('name', 'Type', {'align':'right'}, None), 54 ('perc', 'utilisation', {'align':'right'}, None), 55 ('free', 'libre', {'align':'right'}, None), 56 ('used', 'utilisé', {'align':'right'}, None), 57 ('size', 'taille', {'align':'right'}, None) ]) 58 self.table2 = TableData([ 59 ('name', ' ', {'align':'left'}, None), 60 ('value', 'valeur', {'align':'right'}, None)])
61
62 - def init_data(self, archive_dir):
63 """on initialise les archives rrd, et on définit 64 la liste des données""" 65 title1 = HTMLData("<h3>Information processeur<h3>") 66 title2 = HTMLData("<h3>Informations mémoire<h3>") 67 title3 = HTMLData("<h3>Historique CPU/mémoire<h3>") 68 self.data.extend([title1, self.table2, title2, self.table, title3]) 69 MultiRRDAgent.init_data(self,archive_dir)
70 #self.data.extend([title3, self.table2]) 71 72
73 - def measure(self):
74 self.dico = {} 75 self.measure_mem() 76 self.measure_load_rrd() 77 data = self.measure_proc() 78 return data 79
80 - def measure_mem(self):
81 # mémoire 82 out = file(self.fich) 83 res = out.read().strip() 84 out.close() 85 res=res.split("\n") 86 statistics = [] 87 self.mem_stats = {} 88 for line in res: 89 data=line.split() 90 self.mem_stats[data[0][:-1]]=data[1] 91 92 mem_used = int(self.mem_stats['MemTotal']) - int(self.mem_stats['MemFree']) 93 mem_phys = {'name' : 'physique', 94 'perc' : str(_pourcent(mem_used,self.mem_stats['MemTotal']))+" %", 95 'free' : str(_mega(int(self.mem_stats['MemFree'])*1024))+" Mo", 96 'used' : str(_mega((mem_used)*1024))+" Mo", 97 'size' : str(_mega(int(self.mem_stats['MemTotal'])*1024))+" Mo", 98 } 99 self.measure_data['physique'] = mem_phys['perc'] 100 self.measure_data['physique_total'] = mem_phys['size'] 101 self.measure_data['physique_used'] = mem_phys['used'] 102 self.measure_data['physique_free'] = mem_phys['free'] 103 statistics.append(mem_phys) 104 swap_used = int(self.mem_stats['SwapTotal']) - int(self.mem_stats['SwapFree']) 105 mem_swap = {'name' : 'swap', 106 'perc' : str(_pourcent(swap_used,self.mem_stats['SwapTotal']))+" %", 107 'free' : str(_mega(int(self.mem_stats['SwapFree'])*1024))+" Mo", 108 'used' : str(_mega((swap_used)*1024))+" Mo", 109 'size' : str(_mega(int(self.mem_stats['SwapTotal'])*1024))+" Mo", 110 } 111 # sentinelle : pourcentage de swap 112 self.measure_data['swap'] = str(_pourcent(swap_used,self.mem_stats['SwapTotal'])) 113 self.measure_data['swap_total'] = mem_swap['size'] 114 self.measure_data['swap_used'] = mem_swap['used'] 115 self.measure_data['swap_free'] = mem_swap['free'] 116 self.swap_pourcent = int(self.measure_data['swap']) 117 statistics.append(mem_swap) 118 self.dico['statistics'] = statistics 119 # stats pour graphes RRD 120 # pourcentage de mémoire pour le cache 121 self.dico['cached'] = _pourcent(self.mem_stats['Cached'],self.mem_stats['MemTotal']) 122 # swapping 123 swap = res[2].split() 124 self.dico['sperc'] = _pourcent((int(self.mem_stats['SwapTotal']) - int(self.mem_stats['SwapFree'])), self.mem_stats['SwapTotal'])
125
126 - def measure_proc(self):
127 version = getProcessOutput('/bin/uname', 128 args = ['-r'], 129 env = {'LC_ALL': 'C'}) 130 version.addCallback(self.measure_uptime) 131 return version
132
133 - def measure_uptime(self, version):
134 self.kernel_version = version.strip() 135 uptime = getProcessOutput('/usr/bin/uptime', 136 env = {'LC_ALL': 'C'}) 137 uptime.addCallback(self.measure_process) 138 return uptime
139
140 - def measure_process(self,result):
141 lignes = result.splitlines() 142 # On parse la sortie standard de la commande 143 ligne = lignes[0] 144 # nombre d'utilisateurs 145 champs=ligne[:ligne.index('user')] 146 users=str(int(champs[champs.rindex(',')+1:])) 147 # on récupère le temps d'uptime 148 uptime_str = champs[:champs.rindex(',')] 149 uptime_str = uptime_str[champs.index('up')+2:].strip() 150 statistics = [] 151 statistics.append( { 'name' : "serveur en marche depuis", 152 'value': uptime_str.replace('day','jour') } 153 ) 154 statistics.append( { 'name' : "nombre d'utilisateurs système connectés", 155 'value': users } 156 ) 157 # version du noyau 158 statistics.append( { 'name' : "version du noyau", 159 'value': self.kernel_version } 160 ) 161 self.dico['statistics2']=statistics 162 self.measure_data['kernel'] = self.kernel_version 163 # sentinelle : uptime et version kernel 164 f_uptime = open("/proc/uptime") 165 uptime = f_uptime.read().strip().split()[0] 166 f_uptime.close() 167 self.measure_data['uptime'] = int(uptime.split('.')[0]) 168 return self.dico
169
170 - def measure_load_rrd(self):
171 # cpu load average 172 f_load = open("/proc/loadavg") 173 # on garde la moyenne sur 5 minutes 174 loadavg = f_load.read().strip().split() 175 f_load.close() 176 self.measure_data['load1'] = loadavg[0] 177 self.measure_data['load5'] = loadavg[1] 178 self.measure_data['load15'] = loadavg[2] 179 self.dico['load'] = loadavg[0]
180
181 - def write_data(self):
182 MultiRRDAgent.write_data(self) 183 if self.last_measure is not None: 184 self.table.table_data = self.last_measure.value['statistics'] 185 self.table2.table_data = self.last_measure.value['statistics2']
186
187 - def check_status(self):
188 """ 189 Warning en cas de Swap important 190 Erreur en cas de Swap très important 191 """ 192 warn_step = 60 193 error_step = 90 194 if self.swap_pourcent >= error_step: 195 return status.Error("Swap utilisé à plus de %d%%" % error_step) 196 elif self.swap_pourcent >= warn_step: 197 return status.Warn("Swap utilisé à plus de %d%%" % warn_step) 198 return status.OK()
199