X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=lib%2Fsnapshot.php;h=2a10c6b9359d503dce7c7829f8d5aeff2c4b2f10;hb=d59df6b27013fb534d6444d8e4790f2edcd9459a;hp=4f9bb3f62ec5834588f7ee7e9b75e5f6b19dfacd;hpb=c4040303cecc48aed66d0102de6b9f5ffdc64b22;p=quix0rs-gnu-social.git diff --git a/lib/snapshot.php b/lib/snapshot.php index 4f9bb3f62e..2a10c6b935 100644 --- a/lib/snapshot.php +++ b/lib/snapshot.php @@ -1,6 +1,6 @@ . * * @category Stats - * @package Laconica - * @author Evan Prodromou - * @copyright 2009 Control Yourself, Inc. + * @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://laconi.ca/ + * @link http://status.net/ */ -if (!defined('LACONICA')) { +if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } @@ -36,37 +36,45 @@ if (!defined('LACONICA')) { * * 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 laconi.ca.) + * at status.net.) * * It can either be called from a cron job, or run occasionally by the * Web site. * * @category Stats - * @package Laconica - * @author Evan Prodromou + * @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://laconi.ca/ + * @link http://status.net/ * */ -class Snapshot { +class Snapshot +{ + var $stats = null; + + /** + * Constructor for a snapshot + */ function __construct() { } - function take() - { - } - - function report() - { - } + /** + * 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': + case 'web': // skip if we're not running on the Web. if (!isset($_SERVER) || !array_key_exists('REQUEST_METHOD', $_SERVER)) { break; @@ -76,26 +84,127 @@ class Snapshot { // hits if (rand() % common_config('snapshot', 'frequency') == 0) { $snapshot = new Snapshot(); - if ($snapshot->take()) { - $snapshot->report(); - } + $snapshot->take(); + $snapshot->report(); } break; - case 'cron': + 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(); - if ($snapshot->take()) { - $snapshot->report(); - } + $snapshot->take(); + common_log(LOG_INFO, count($snapshot->stats) . " statistics being uploaded."); + $snapshot->report(); + break; - case 'never': + case 'never': break; - default: + 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', + 'remote_profile', + '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'); + $request = HTTPClient::start(); + $request->post($reporturl, null, $this->stats); + } + + /** + * 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); + } }