Code

dc2f00b3ab03b628c1a756909dee1ba775886082
[gosa.git] / gosa-core / include / class_stats.inc
1 <?php
3 class stats 
4 {
5     
6     static protected $last_cpu_load = "";
7     static protected $last_cpu_load_stamp = 0;
10     static function checkDatabase()
11     {
12         $TABLE_NAME = 'stats';
13     
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                         RENDER_TIME     REAL,
47                         AMOUNT          INTEGER,
48                         MEMORY_USAGE    INTEGER,
49                         CPU_LOAD        FLOAT,
50                         INFO            BLOB
51                         )";
52             $ret = sqlite_query($query, $res);
53         }
55         return($res);
56     }
60     static function log($type, $plugin, $category, $action, $amount = 1, $duration = 0, $info ='')
61     {
62         global $config;
63         global $clicks;
64         global $overallRenderTimer;
66         if(!isset($overallRenderTimer) || empty($overallRenderTimer)){
67             $renderTime = 0;
68         }else{
69             $renderTime = microtime(TRUE) - $overallRenderTimer;
71             // Now set the overallRenderTimer to the current timestamp - else 
72             //  we will not be able to sum up the render time in a single SQL statement.
73             $overallRenderTimer = microtime(TRUE);
74             
75         }
77         $type           = sqlite_escape_string($type);
78         $plugin         = sqlite_escape_string($plugin);
79         $action         = sqlite_escape_string($action);
80         $timestamp      = time();
81         $mtimestamp     = microtime(TRUE);
82         $uuid           = $config->getGOsaUUID();
83         $amount         = sqlite_escape_string($amount);
84         $duration       = sqlite_escape_string($duration);
85         $renderTime     = sqlite_escape_string($renderTime);
86         $info           = sqlite_escape_string($info);
87         $clicks         = sqlite_escape_string($clicks);
88         $memory_usage   = sqlite_escape_string(stats::get_memory_usage());
89         $cpu_load       = sqlite_escape_string(stats::get_cpu_load());
91         $tmp = array();
92         foreach($category as $cat){
93             $tmp[] = trim($cat, '\/,; ');
94         }
95         $category = sqlite_escape_string(implode($tmp, ', '));
97         $res = stats::checkDatabase();
98         $TABLE_NAME = 'stats';
99         $query = "
100             INSERT INTO {$TABLE_NAME}
101                 (ACTID, TYPE, PLUGIN, CATEGORY, ACTION, UUID, MTIMESTAMP, TIMESTAMP, 
102                  AMOUNT, DURATION, RENDER_TIME, MEMORY_USAGE, CPU_LOAD, INFO) 
103             VALUES 
104                 ('{$clicks}','{$type}','{$plugin}','{$category}','{$action}','{$uuid}',
105                     '{$mtimestamp}','{$timestamp}','{$amount}','{$duration}','{$renderTime}',
106                     '{$memory_usage}','{$cpu_load}','{$info}')";
107         sqlite_query($query, $res);
108     }
110     static function get_memory_usage()
111     {
112         return(memory_get_usage());
113     }
115     static function get_cpu_load()
116     {
117         $cur = time();
118         if(empty(stats::$last_cpu_load) || (($cur - stats::$last_cpu_load_stamp) >=2 )){
119             list($one, $five, $ten) =preg_split("/ /",shell_exec('cat /proc/loadavg'));
120             stats::$last_cpu_load = $one;
121             stats::$last_cpu_load_stamp = $cur;
122         }
123         return(stats::$last_cpu_load);
124     }
125     
126     static function show()
127     {
128         $res = stats::checkDatabase();
129         $TABLE_NAME = 'stats';
130         $query = "SELECT * FROM {$TABLE_NAME} ORDER BY MTIMESTAMP";
131         $query = "SELECT PLUGIN, ACTION, MAX(DURATION) as 'DURATION' FROM {$TABLE_NAME} WHERE ACTION='modify' GROUP BY PLUGIN,ACTION ";
132         $query = "SELECT * FROM {$TABLE_NAME} ORDER BY ID DESC LIMIT 30";
133         $query = "SELECT * FROM {$TABLE_NAME} WHERE plugin != 'LDAP' ORDER BY ID DESC LIMIT 30";
134         $ret = sqlite_query($query, $res);
135         echo "<pre>";
137         $colSize = 16;
139         $title = FALSE;
140         foreach(sqlite_fetch_all($ret) as $entry){
141             if(!$title){
142                 foreach($entry as $key => $str) {
143                     if(is_numeric($key)) continue;
144                     echo str_pad($key,$colSize,' ')."|";
145                 }
146                 echo "\n";
147                 foreach($entry as $key => $str) {
148                     if(is_numeric($key)) continue;
149                     echo str_pad('',$colSize,'-')."-";
150                 }
151                 echo "\n";
152                 $title = TRUE;
153             }
154  
155             foreach($entry as $key => $str){
156                 if(is_numeric($key)) continue;
157                 if($key == "DURATION" || $key == "MTIMESTAMP" || $key == "CPU_LOAD"){
158                     $str = sprintf("%0.4f", preg_replace("/,/",".",$str));
159                     echo str_pad($str,$colSize,' ', STR_PAD_LEFT)."|"; 
160                 }else{
161                     echo str_pad($str,$colSize,' ')."|"; 
162                 }
163             }
164             echo "\n";
165         }
166         echo sqlite_error_string($ret);
168         echo "\n------ \n";
169         echo "Time spent per plugin-category \n";
170         echo "------ \n";
172         $query = "
173             SELECT SUM(DURATION) AS DUR, CATEGORY 
174             FROM {$TABLE_NAME}
175             WHERE plugin != 'LDAP' 
176             GROUP BY CATEGORY 
177             ORDER BY DUR DESC LIMIT 10";
178         $ret = sqlite_query($query, $res);
180         $colSize = 16;
181         $title = FALSE;
182         foreach(sqlite_fetch_all($ret) as $entry){
183             foreach($entry as $key => $str){
184                 if(is_numeric($key)) continue;
185                 echo str_pad($str,$colSize,' ')."|"; 
186             }
187             echo "\n";
188         }
191         echo sqlite_error_string($ret);
193         echo "\n------ \n";
194         echo "Time spent per plugin \n";
195         echo "------ \n";
197         $query = "
198             SELECT SUM(DURATION) AS DUR, PLUGIN, UUID 
199             FROM {$TABLE_NAME}
200             WHERE plugin != 'LDAP' 
201             GROUP BY PLUGIN, UUID 
202             ORDER BY DUR DESC LIMIT 10";
203         $ret = sqlite_query($query, $res);
205         $colSize = 16;
206         $title = FALSE;
207         foreach(sqlite_fetch_all($ret) as $entry){
208             foreach($entry as $key => $str){
209                 if(is_numeric($key)) continue;
210                 echo str_pad($str,$colSize,' ')."|"; 
211             }
212             echo "\n";
213         }
214         echo sqlite_error_string($ret);
216  # * Anzahl von Objekttypen
217  # * Anzahl der Löschungen pro Objekttyp
218  # * Anzahl der Erzeugungen pro Objekttyp
219  # * Anzahl der Bearbeitungen pro Objekttyp
220  # * Anzahl der Verschiebungen pro Objekttyp
221  # * Anzahl der Mehrfachbearbeitungen pro Objekttyp
222  # * Antwortzeiten pro aktion
223  # * Anzahl der Passwortänderungen
224  # * Anzahl der unterschiedlichen Anmeldungen
227         echo "\n------ \n";
228         echo "Actions done per plugin \n";
229         echo "------ \n";
231         $query = "
232             SELECT COUNT(ACTION) as CNT, ACTION, PLUGIN 
233             FROM {$TABLE_NAME}
234             WHERE   TYPE = 'plugin'
235              AND    PLUGIN != 'LDAP'
236             GROUP BY ACTION,PLUGIN 
237             ORDER BY CNT DESC LIMIT 30";
238         $ret = sqlite_query($query, $res);
240         $colSize = 16;
241         $title = FALSE;
242         foreach(sqlite_fetch_all($ret) as $entry){
243             foreach($entry as $key => $str){
244                 if(is_numeric($key)) continue;
245                 echo str_pad($str,$colSize,' ')."|"; 
246             }
247             echo "\n";
248         }
249         echo sqlite_error_string($ret);
251         echo "\n------ \n";
252         echo "'create' actions done per plugin  (5 most)\n";
253         echo "------ \n";
255         $query = "
256             SELECT COUNT(ACTION) as CNT, ACTION, PLUGIN 
257             FROM {$TABLE_NAME}
258             WHERE   TYPE = 'plugin'
259              AND    PLUGIN != 'LDAP'
260              AND    ACTION = 'create'
261             GROUP BY ACTION,PLUGIN 
262             ORDER BY CNT DESC LIMIT 5";
263         $ret = sqlite_query($query, $res);
265         $colSize = 16;
266         $title = FALSE;
267         foreach(sqlite_fetch_all($ret) as $entry){
268             foreach($entry as $key => $str){
269                 if(is_numeric($key)) continue;
270                 echo str_pad($str,$colSize,' ')."|"; 
271             }
272             echo "\n";
273         }
274         echo sqlite_error_string($ret);
276         echo "\n------ \n";
277         echo "'move' actions done per plugin  (5 most)\n";
278         echo "------ \n";
280         $query = "
281             SELECT COUNT(ACTION) as CNT, ACTION, PLUGIN 
282             FROM {$TABLE_NAME}
283             WHERE   TYPE = 'plugin'
284              AND    PLUGIN != 'LDAP'
285              AND    ACTION = 'move'
286             GROUP BY ACTION,PLUGIN 
287             ORDER BY CNT DESC LIMIT 5";
288         $ret = sqlite_query($query, $res);
290         $colSize = 16;
291         $title = FALSE;
292         foreach(sqlite_fetch_all($ret) as $entry){
293             foreach($entry as $key => $str){
294                 if(is_numeric($key)) continue;
295                 echo str_pad($str,$colSize,' ')."|"; 
296             }
297             echo "\n";
298         }
299         echo sqlite_error_string($ret);
301         echo "\n------ \n";
302         echo "'view' actions done per plugin  (5 most)\n";
303         echo "------ \n";
305         $query = "
306             SELECT COUNT(ACTION) as CNT, ACTION, PLUGIN 
307             FROM {$TABLE_NAME}
308             WHERE   TYPE = 'plugin'
309              AND    PLUGIN != 'LDAP'
310              AND    ACTION = 'view'
311             GROUP BY ACTION,PLUGIN 
312             ORDER BY CNT DESC LIMIT 5";
313         $ret = sqlite_query($query, $res);
315         $colSize = 16;
316         $title = FALSE;
317         foreach(sqlite_fetch_all($ret) as $entry){
318             foreach($entry as $key => $str){
319                 if(is_numeric($key)) continue;
320                 echo str_pad($str,$colSize,' ')."|"; 
321             }
322             echo "\n";
323         }
324         echo sqlite_error_string($ret);
326         echo "\n------ \n";
327         echo "'open' actions done per plugin  (5 most)\n";
328         echo "------ \n";
330         $query = "
331             SELECT COUNT(ACTION) as CNT, ACTION, PLUGIN, UUID 
332             FROM {$TABLE_NAME}
333             WHERE   TYPE = 'plugin'
334              AND    PLUGIN != 'LDAP'
335              AND    ACTION = 'open'
336             GROUP BY ACTION,PLUGIN, UUID
337             ORDER BY CNT DESC LIMIT 5";
338         $ret = sqlite_query($query, $res);
340         $colSize = 16;
341         $title = FALSE;
342         foreach(sqlite_fetch_all($ret) as $entry){
343             foreach($entry as $key => $str){
344                 if(is_numeric($key)) continue;
345                 echo str_pad($str,$colSize,' ')."|"; 
346             }
347             echo "\n";
348         }
349         echo sqlite_error_string($ret);
351         echo "\n------ \n";
352         echo "Time per session\n";
353         echo "------ \n";
355         $query = "
356             SELECT SUM(DURATION) as DUR, UUID
357             FROM {$TABLE_NAME}
358             GROUP BY UUID
359             ORDER BY DUR DESC LIMIT 10";
360         $ret = sqlite_query($query, $res);
362         $colSize = 16;
363         $title = FALSE;
364         foreach(sqlite_fetch_all($ret) as $entry){
365             foreach($entry as $key => $str){
366                 if(is_numeric($key)) continue;
367                 echo str_pad($str,$colSize,' ')."|"; 
368             }
369             echo "\n";
370         }
371         echo sqlite_error_string($ret);
373         echo "\n------ \n";
374         echo "Most used password hashes\n";
375         echo "------ \n";
377         $query = "
378             SELECT DISTINCT(INFO), COUNT(INFO) as CNT
379             FROM {$TABLE_NAME}
380             WHERE ACTION = 'change_password'
381             GROUP BY INFO
382             ORDER BY INFO DESC LIMIT 10";
383         $ret = sqlite_query($query, $res);
385         $colSize = 16;
386         $title = FALSE;
387         foreach(sqlite_fetch_all($ret) as $entry){
388             foreach($entry as $key => $str){
389                 if(is_numeric($key)) continue;
390                 echo str_pad($str,$colSize,' ')."|"; 
391             }
392             echo "\n";
393         }
394         echo sqlite_error_string($ret);
396         echo "\n------ \n";
397         echo "Actions at all\n";
398         echo "------ \n";
400         $query = "
401             SELECT DISTINCT(ACTION), COUNT(ACTION)  AS CNT
402             FROM {$TABLE_NAME}
403             GROUP BY ACTION
404             ORDER BY CNT DESC LIMIT 10";
405         $ret = sqlite_query($query, $res);
407         $colSize = 16;
408         $title = FALSE;
409         foreach(sqlite_fetch_all($ret) as $entry){
410             foreach($entry as $key => $str){
411                 if(is_numeric($key)) continue;
412                 echo str_pad($str,$colSize,' ')."|"; 
413             }
414             echo "\n";
415         }
416         echo sqlite_error_string($ret);
418         echo "\n------ \n";
419         echo "Time spent per action\n";
420         echo "------ \n";
422         $query = "
423             SELECT DISTINCT(ACTION), SUM(DURATION) AS DUR
424             FROM {$TABLE_NAME}
425             GROUP BY ACTION
426             ORDER BY DUR DESC LIMIT 10";
427         $ret = sqlite_query($query, $res);
429         $colSize = 16;
430         $title = FALSE;
431         foreach(sqlite_fetch_all($ret) as $entry){
432             foreach($entry as $key => $str){
433                 if(is_numeric($key)) continue;
434                 echo str_pad($str,$colSize,' ')."|"; 
435             }
436             echo "\n";
437         }
438         echo sqlite_error_string($ret);
440         echo "\n------ \n";
441         echo "Average time per action\n";
442         echo "------ \n";
444         $query = "
445             SELECT DISTINCT(ACTION), AVG(DURATION) AS DUR
446             FROM {$TABLE_NAME}
447             GROUP BY ACTION
448             ORDER BY DUR DESC LIMIT 10";
449         $ret = sqlite_query($query, $res);
451         $colSize = 16;
452         $title = FALSE;
453         foreach(sqlite_fetch_all($ret) as $entry){
454             foreach($entry as $key => $str){
455                 if(is_numeric($key)) continue;
456                 echo str_pad($str,$colSize,' ')."|"; 
457             }
458             echo "\n";
459         }
460         echo sqlite_error_string($ret);
462         echo "</pre>";
463     }
467 ?>