<?php
// Gather stats about the system
$rg_stats_error = '';
function rg_stats_set_error($str)
{
global $rg_stats_error;
$rg_stats_error = $str;
rg_log('stats_set_error: ' . $str);
}
function rg_stats_error()
{
global $rg_stats_error;
return $rg_stats_error;
}
/*
* Returns stats about the disk
*/
function rg_stats_disk()
{
global $rg_state_dir;
$r = disk_total_space($rg_state_dir)
- disk_free_space($rg_state_dir);
return sprintf("%u", $r / 1024 / 1024 / 1024);
}
/*
* Inserts data in the database
*/
function rg_stats_insert($db)
{
$ret = FALSE;
while (1) {
$now = time();
$load = rg_load();
$disk_used_gib = rg_stats_disk();
$m = rg_memory();
$mem_used_mib = intval(($m['total'] - $m['avail']) / 1024);
$params = array('now' => $now,
'load' => $load,
'disk_used_gib' => $disk_used_gib,
'mem_used_mib' => $mem_used_mib);
$sql = 'INSERT INTO stats_' . gmdate("Y_m", $now)
. ' (itime, load, disk_used_gib, mem_used_mib)'
. ' VALUES (@@now@@, @@load@@, @@disk_used_gib@@'
. ', @@mem_used_mib@@)';
$res = rg_sql_query_params($db, $sql, $params);
if ($res == FALSE) {
rg_internal_error('cannot insert stats: ' . rg_sql_error());
break;
}
$ret = TRUE;
break;
}
return $ret;
}
/*
* Loads data for graphs
* @unit - interval on which a sum is made
*/
function rg_stats_data($db, $type, $start, $end, $unit, $mode)
{
$params = array('start' => $start, 'end' => $end);
switch ($type) {
case 'disk':
$q = 'SELECT disk_used_gib AS value, itime FROM stats'
. ' WHERE itime >= @@start@@ AND itime <= @@end@@';
break;
case 'mem':
$q = 'SELECT mem_used_mib AS value, itime FROM stats'
. ' WHERE itime >= @@start@@ AND itime <= @@end@@';
break;
case 'load':
$q = 'SELECT load AS value, itime FROM stats'
. ' WHERE itime >= @@start@@ AND itime <= @@end@@';
break;
default:
rg_internal_error('invalid type');
return FALSE;
}
$ret = rg_graph_query($db, $start, $end, $unit, $mode, $q, $params, '');
if ($ret === FALSE)
rg_stats_set_error(rg_graph_error());
return $ret;
}
/*
* Store 'conns' stats
*/
function rg_stats_conns_insert($db)
{
global $rg_stats_conns_paras;
$ret = FALSE;
while (1) {
$rg_stats_conns_paras['ip'] = rg_ip();
if (!isset($rg_stats_conns_paras['elap']))
$rg_stats_conns_paras['elap'] = intval((microtime(TRUE)
- $rg_stats_conns_paras['start']) * 1000);
$rg_stats_conns_paras['start'] = intval($rg_stats_conns_paras['start']);
$list = array(
'ua' => '',
'cmd' => '',
'referer' => '',
'url' => '',
'uid' => 0,
'login_uid' => 0,
'repo_id' => 0,
'bytes_in' => 0,
'bytes_out' => 0,
'flags' => ''
);
foreach ($list as $k => $v)
if (!isset($rg_stats_conns_paras[$k]))
$rg_stats_conns_paras[$k] = $v;
if (rg_is_bot($rg_stats_conns_paras['ua'])) {
//rg_log($rg_stats_conns_paras['ua'] . ' is bot! Skip!');
$ret = TRUE;
break;
}
$sql = 'INSERT INTO conns_' . gmdate('Y_m', $rg_stats_conns_paras['start'])
. ' (type, uid, login_uid, repo_id, itime, ip, url'
. ', referer, elap, ua, cmd, bytes_in, bytes_out, flags)'
. ' VALUES (@@type@@, @@uid@@, @@login_uid@@'
. ', @@repo_id@@, @@start@@, @@ip@@, @@url@@'
. ', @@referer@@, @@elap@@, @@ua@@, @@cmd@@'
. ', @@bytes_in@@, @@bytes_out@@, @@flags@@)';
$res = rg_sql_query_params($db, $sql, $rg_stats_conns_paras);
if ($res == FALSE) {
rg_internal_error('cannot insert conns: ' . rg_sql_error());
break;
}
$ret = TRUE;
break;
}
return $ret;
}
/*
* Set a parameter for conns_insert
* Added to be able to not pass &$rg everywhere and to not collude with $rg
*/
$rg_stats_conns_paras = array();
function rg_stats_conns_set($para, $value)
{
global $rg_stats_conns_paras;
//rg_log_debug('stats_conns_set ' . $para . '=[' . $value . ']');
$rg_stats_conns_paras[$para] = $value;
}
/*
* Loads data for graphs
* @unit - interval on which a sum is made
*/
function rg_conns_data($db, $type, $start, $end, $unit, $mode)
{
$params = array('start' => $start, 'end' => $end);
switch ($type) {
case 'total':
$q = 'SELECT itime FROM conns'
. ' WHERE itime >= @@start@@ AND itime <= @@end@@';
break;
default:
rg_internal_error('invalid type');
return FALSE;
}
$ret = rg_graph_query($db, $start, $end, $unit, $mode, $q, $params, '');
if ($ret === FALSE)
rg_stats_set_error(rg_graph_error());
return $ret;
}