e2d64986c57e73df1ad188e36c3164687182138f
1 <?php
3 class stats
4 {
6 static protected $last_cpu_load = "";
7 static protected $last_cpu_load_stamp = 0;
10 static function checkDatabase()
11 {
12 $TABLE_NAME = 'stats';
14 // Check for modules
15 // php5-sqlite
18 // Try to create database, if it exists just open it.
19 $res = sqlite_open('/var/spool/gosa/stats', 0666, $error);
20 if(!$res){
21 return($res);
22 }
24 // Delete Table
25 $query = "DROP TABLE '{$TABLE_NAME}'";
26 # $ret = sqlite_query($query, $res);
28 // List Tables an check if there is already everything we need.
29 $query = "SELECT name FROM sqlite_master WHERE type='table' and name='{$TABLE_NAME}'";
30 $ret = sqlite_query($query, $res);
31 if(!count(sqlite_fetch_all($ret))){
33 // Check for table existance
34 $query = "
35 CREATE TABLE {$TABLE_NAME} (
36 ID INTEGER PRIMARY KEY,
37 ACTID INTEGER,
38 TYPE TEXT,
39 PLUGIN TEXT,
40 CATEGORY TEXT,
41 ACTION TEXT,
42 UUID TEXT,
43 TIMESTAMP INTEGER,
44 MTIMESTAMP REAL,
45 DURATION REAL,
46 AMOUNT INTEGER,
47 MEMORY_USAGE INTEGER,
48 CPU_LOAD FLOAT
49 )";
50 $ret = sqlite_query($query, $res);
51 }
53 return($res);
54 }
58 static function log($type, $plugin, $category, $action, $amount = 1, $duration = 0)
59 {
60 global $config;
61 global $clicks;
62 $type = sqlite_escape_string($type);
63 $plugin = sqlite_escape_string($plugin);
64 $action = sqlite_escape_string($action);
65 $timestamp = time();
66 $mtimestamp = microtime(TRUE);
67 $uuid = $config->getGOsaUUID();
68 $amount = sqlite_escape_string($amount);
69 $duration = sqlite_escape_string($duration);
70 $clicks = sqlite_escape_string($clicks);
71 $memory_usage = sqlite_escape_string(stats::get_memory_usage());
72 $cpu_load = sqlite_escape_string(stats::get_cpu_load());
74 $tmp = array();
75 foreach($category as $cat){
76 $tmp[] = trim($cat, '\/,; ');
77 }
78 $category = sqlite_escape_string(implode($tmp, ', '));
80 $res = stats::checkDatabase();
81 $TABLE_NAME = 'stats';
82 $query = "
83 INSERT INTO {$TABLE_NAME}
84 (ACTID, TYPE, PLUGIN, CATEGORY, ACTION, UUID, MTIMESTAMP, TIMESTAMP, AMOUNT, DURATION, MEMORY_USAGE, CPU_LOAD)
85 VALUES
86 ('{$clicks}','{$type}','{$plugin}','{$category}','{$action}','{$uuid}',
87 '{$mtimestamp}','{$timestamp}','{$amount}','{$duration}','{$memory_usage}','{$cpu_load}')";
88 sqlite_query($query, $res);
89 }
91 static function get_memory_usage()
92 {
93 return(memory_get_usage());
94 }
96 static function get_cpu_load()
97 {
98 $cur = time();
99 if(empty(stats::$last_cpu_load) || (($cur - stats::$last_cpu_load_stamp) >=2 )){
100 list($one, $five, $ten) =preg_split("/ /",shell_exec('cat /proc/loadavg'));
101 stats::$last_cpu_load = $one;
102 stats::$last_cpu_load_stamp = $cur;
103 }
104 return(stats::$last_cpu_load);
105 }
107 static function show()
108 {
109 $res = stats::checkDatabase();
110 $TABLE_NAME = 'stats';
111 $query = "SELECT * FROM {$TABLE_NAME} ORDER BY MTIMESTAMP";
112 $query = "SELECT PLUGIN, ACTION, MAX(DURATION) as 'DURATION' FROM {$TABLE_NAME} WHERE ACTION='modify' GROUP BY PLUGIN,ACTION ";
113 $query = "SELECT * FROM {$TABLE_NAME} ORDER BY ID DESC LIMIT 30";
114 $query = "SELECT * FROM {$TABLE_NAME} WHERE plugin != 'LDAP' ORDER BY ID DESC LIMIT 30";
115 $ret = sqlite_query($query, $res);
116 echo "<pre>";
118 $colSize = 16;
120 $title = FALSE;
121 foreach(sqlite_fetch_all($ret) as $entry){
122 if(!$title){
123 foreach($entry as $key => $str) {
124 if(is_numeric($key)) continue;
125 echo str_pad($key,$colSize,' ')."|";
126 }
127 echo "\n";
128 foreach($entry as $key => $str) {
129 if(is_numeric($key)) continue;
130 echo str_pad('',$colSize,'-')."-";
131 }
132 echo "\n";
133 $title = TRUE;
134 }
136 foreach($entry as $key => $str){
137 if(is_numeric($key)) continue;
138 if($key == "DURATION" || $key == "MTIMESTAMP" || $key == "CPU_LOAD"){
139 $str = sprintf("%0.4f", preg_replace("/,/",".",$str));
140 echo str_pad($str,$colSize,' ', STR_PAD_LEFT)."|";
141 }else{
142 echo str_pad($str,$colSize,' ')."|";
143 }
144 }
145 echo "\n";
146 }
147 echo sqlite_error_string($ret);
149 echo "\n------ \n";
150 echo "Time spent per plugin-category \n";
151 echo "------ \n";
153 $query = "
154 SELECT SUM(DURATION) AS DUR, CATEGORY
155 FROM {$TABLE_NAME}
156 WHERE plugin != 'LDAP'
157 GROUP BY CATEGORY
158 ORDER BY DUR DESC LIMIT 10";
159 $ret = sqlite_query($query, $res);
161 $colSize = 16;
162 $title = FALSE;
163 foreach(sqlite_fetch_all($ret) as $entry){
164 foreach($entry as $key => $str){
165 if(is_numeric($key)) continue;
166 echo str_pad($str,$colSize,' ')."|";
167 }
168 echo "\n";
169 }
172 echo sqlite_error_string($ret);
174 echo "\n------ \n";
175 echo "Time spent per plugin \n";
176 echo "------ \n";
178 $query = "
179 SELECT SUM(DURATION) AS DUR, PLUGIN
180 FROM {$TABLE_NAME}
181 WHERE plugin != 'LDAP'
182 GROUP BY PLUGIN
183 ORDER BY DUR DESC LIMIT 10";
184 $ret = sqlite_query($query, $res);
186 $colSize = 16;
187 $title = FALSE;
188 foreach(sqlite_fetch_all($ret) as $entry){
189 foreach($entry as $key => $str){
190 if(is_numeric($key)) continue;
191 echo str_pad($str,$colSize,' ')."|";
192 }
193 echo "\n";
194 }
195 echo sqlite_error_string($ret);
197 # * Anzahl von Objekttypen
198 # * Anzahl der Löschungen pro Objekttyp
199 # * Anzahl der Erzeugungen pro Objekttyp
200 # * Anzahl der Bearbeitungen pro Objekttyp
201 # * Anzahl der Verschiebungen pro Objekttyp
202 # * Anzahl der Mehrfachbearbeitungen pro Objekttyp
203 # * Antwortzeiten pro aktion
204 # * Anzahl der Passwortänderungen
205 # * Anzahl der unterschiedlichen Anmeldungen
208 echo "\n------ \n";
209 echo "Actions done per plugin \n";
210 echo "------ \n";
212 $query = "
213 SELECT COUNT(ACTION) as CNT, ACTION, PLUGIN
214 FROM {$TABLE_NAME}
215 WHERE TYPE = 'plugin'
216 AND PLUGIN != 'LDAP'
217 GROUP BY ACTION,PLUGIN
218 ORDER BY CNT DESC LIMIT 30";
219 $ret = sqlite_query($query, $res);
221 $colSize = 16;
222 $title = FALSE;
223 foreach(sqlite_fetch_all($ret) as $entry){
224 foreach($entry as $key => $str){
225 if(is_numeric($key)) continue;
226 echo str_pad($str,$colSize,' ')."|";
227 }
228 echo "\n";
229 }
230 echo sqlite_error_string($ret);
232 echo "\n------ \n";
233 echo "'create' actions done per plugin (5 most)\n";
234 echo "------ \n";
236 $query = "
237 SELECT COUNT(ACTION) as CNT, ACTION, PLUGIN
238 FROM {$TABLE_NAME}
239 WHERE TYPE = 'plugin'
240 AND PLUGIN != 'LDAP'
241 AND ACTION = 'create'
242 GROUP BY ACTION,PLUGIN
243 ORDER BY CNT DESC LIMIT 5";
244 $ret = sqlite_query($query, $res);
246 $colSize = 16;
247 $title = FALSE;
248 foreach(sqlite_fetch_all($ret) as $entry){
249 foreach($entry as $key => $str){
250 if(is_numeric($key)) continue;
251 echo str_pad($str,$colSize,' ')."|";
252 }
253 echo "\n";
254 }
255 echo sqlite_error_string($ret);
257 echo "\n------ \n";
258 echo "'move' actions done per plugin (5 most)\n";
259 echo "------ \n";
261 $query = "
262 SELECT COUNT(ACTION) as CNT, ACTION, PLUGIN
263 FROM {$TABLE_NAME}
264 WHERE TYPE = 'plugin'
265 AND PLUGIN != 'LDAP'
266 AND ACTION = 'move'
267 GROUP BY ACTION,PLUGIN
268 ORDER BY CNT DESC LIMIT 5";
269 $ret = sqlite_query($query, $res);
271 $colSize = 16;
272 $title = FALSE;
273 foreach(sqlite_fetch_all($ret) as $entry){
274 foreach($entry as $key => $str){
275 if(is_numeric($key)) continue;
276 echo str_pad($str,$colSize,' ')."|";
277 }
278 echo "\n";
279 }
280 echo sqlite_error_string($ret);
282 echo "\n------ \n";
283 echo "'view' actions done per plugin (5 most)\n";
284 echo "------ \n";
286 $query = "
287 SELECT COUNT(ACTION) as CNT, ACTION, PLUGIN
288 FROM {$TABLE_NAME}
289 WHERE TYPE = 'plugin'
290 AND PLUGIN != 'LDAP'
291 AND ACTION = 'view'
292 GROUP BY ACTION,PLUGIN
293 ORDER BY CNT DESC LIMIT 5";
294 $ret = sqlite_query($query, $res);
296 $colSize = 16;
297 $title = FALSE;
298 foreach(sqlite_fetch_all($ret) as $entry){
299 foreach($entry as $key => $str){
300 if(is_numeric($key)) continue;
301 echo str_pad($str,$colSize,' ')."|";
302 }
303 echo "\n";
304 }
305 echo sqlite_error_string($ret);
307 echo "\n------ \n";
308 echo "'open' actions done per plugin (5 most)\n";
309 echo "------ \n";
311 $query = "
312 SELECT COUNT(ACTION) as CNT, ACTION, PLUGIN
313 FROM {$TABLE_NAME}
314 WHERE TYPE = 'plugin'
315 AND PLUGIN != 'LDAP'
316 AND ACTION = 'open'
317 GROUP BY ACTION,PLUGIN
318 ORDER BY CNT DESC LIMIT 5";
319 $ret = sqlite_query($query, $res);
321 $colSize = 16;
322 $title = FALSE;
323 foreach(sqlite_fetch_all($ret) as $entry){
324 foreach($entry as $key => $str){
325 if(is_numeric($key)) continue;
326 echo str_pad($str,$colSize,' ')."|";
327 }
328 echo "\n";
329 }
330 echo "</pre>";
331 echo sqlite_error_string($ret);
332 }
333 }
336 ?>