. * * @category Stats * @package StatusNet * @author Evan Prodromou * @copyright 2009 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } /** * A snapshot of site stats that can report itself to headquarters * * This class will collect statistics on the site and report them to * a statistics server of the admin's choice. (Default is the big one * at status.net.) * * It can either be called from a cron job, or run occasionally by the * Web site. * * @category Stats * @package StatusNet * @author Evan Prodromou * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ * */ class Snapshot { var $stats = null; /** * Constructor for a snapshot */ function __construct() { } /** * Static function for reporting statistics * * This function checks whether it should report statistics, based on * the current configuation settings. If it should, it creates a new * Snapshot object, takes a snapshot, and reports it to headquarters. * * @return void */ static function check() { switch (common_config('snapshot', 'run')) { case 'web': // skip if we're not running on the Web. if (!isset($_SERVER) || !array_key_exists('REQUEST_METHOD', $_SERVER)) { break; } // Run once every frequency hits // XXX: do frequency by time (once a week, etc.) rather than // hits if (rand() % common_config('snapshot', 'frequency') == 0) { $snapshot = new Snapshot(); $snapshot->take(); $snapshot->report(); } break; case 'cron': // skip if we're running on the Web if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) { break; } common_log(LOG_INFO, 'Running snapshot from cron job'); // We're running from the command line; assume $snapshot = new Snapshot(); $snapshot->take(); common_log(LOG_INFO, count($snapshot->stats) . " statistics being uploaded."); $snapshot->report(); break; case 'never': break; default: common_log(LOG_WARNING, "Unrecognized value for snapshot run config."); } } /** * Take a snapshot of the server * * Builds an array of statistical and configuration data based * on the local database and config files. We avoid grabbing any * information that could be personal or private. * * @return void */ function take() { $this->stats = array(); // Some basic identification stuff $this->stats['version'] = STATUSNET_VERSION; $this->stats['phpversion'] = phpversion(); $this->stats['name'] = common_config('site', 'name'); $this->stats['root'] = common_root_url(); // non-identifying stats on various tables. Primary // interest is size and rate of activity of service. $tables = array('user', 'notice', 'subscription', 'user_group'); foreach ($tables as $table) { $this->tableStats($table); } // stats on some important config options $this->stats['theme'] = common_config('site', 'theme'); $this->stats['dbtype'] = common_config('db', 'type'); $this->stats['xmpp'] = common_config('xmpp', 'enabled'); $this->stats['inboxes'] = common_config('inboxes', 'enabled'); $this->stats['queue'] = common_config('queue', 'enabled'); $this->stats['license'] = common_config('license', 'url'); $this->stats['fancy'] = common_config('site', 'fancy'); $this->stats['private'] = common_config('site', 'private'); $this->stats['closed'] = common_config('site', 'closed'); $this->stats['memcached'] = common_config('memcached', 'enabled'); $this->stats['language'] = common_config('site', 'language'); $this->stats['timezone'] = common_config('site', 'timezone'); } /** * Reports statistics to headquarters * * Posts statistics to a reporting server. * * @return void */ function report() { // XXX: Use OICU2 and OAuth to make authorized requests $reporturl = common_config('snapshot', 'reporturl'); try { $request = HTTPClient::start(); $request->post($reporturl, null, $this->stats); } catch (Exception $e) { common_log(LOG_WARNING, "Error in snapshot: " . $e->getMessage()); } } /** * Updates statistics for a single table * * Determines the size of a table and its oldest and newest rows. * Goal here is to see how active a site is. Note that it * fills up the instance stats variable. * * @param string $table name of table to check * * @return void */ function tableStats($table) { $inst = DB_DataObject::factory($table); $inst->selectAdd(); $inst->selectAdd('count(*) as cnt, '. 'min(created) as first, '. 'max(created) as last'); if ($inst->find(true)) { $this->stats[$table.'count'] = $inst->cnt; $this->stats[$table.'first'] = $inst->first; $this->stats[$table.'last'] = $inst->last; } $inst->free(); unset($inst); } }