1
2
3
4
5
6
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
25 """ transfo de la valeur passée (string en octets) en Mo
26 """
27 return (int(val)/1024/1024)
28
30 """ calcul du pourcentage de mémoire utilisée
31 """
32
33 if int(tot) != 0:
34 return (int(int(use)*100/int(tot)))
35 else:
36 return 0
37
40
42 """
43 Bilan de l'etat de la memoire
44 présentation en tableau
45 """
46
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
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
71
72
74 self.dico = {}
75 self.measure_mem()
76 self.measure_load_rrd()
77 data = self.measure_proc()
78 return data
79
81
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
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
120
121 self.dico['cached'] = _pourcent(self.mem_stats['Cached'],self.mem_stats['MemTotal'])
122
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
127 version = getProcessOutput('/bin/uname',
128 args = ['-r'],
129 env = {'LC_ALL': 'C'})
130 version.addCallback(self.measure_uptime)
131 return version
132
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
141 lignes = result.splitlines()
142
143 ligne = lignes[0]
144
145 champs=ligne[:ligne.index('user')]
146 users=str(int(champs[champs.rindex(',')+1:]))
147
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
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
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
171
172 f_load = open("/proc/loadavg")
173
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
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
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