gnu-social/lib/snapshot.php

214 lines
6.6 KiB
PHP
Raw Normal View History

2009-04-16 15:18:16 +01:00
<?php
/**
* StatusNet, the distributed open-source microblogging tool
2009-04-16 15:18:16 +01:00
*
* A snapshot of site stats that can report itself to headquarters
*
* PHP version 5
*
* LICENCE: This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* @category Stats
* @package StatusNet
* @author Evan Prodromou <evan@status.net>
* @copyright 2009 StatusNet, Inc.
2009-04-16 15:18:16 +01:00
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
2009-08-25 23:16:46 +01:00
* @link http://status.net/
2009-04-16 15:18:16 +01:00
*/
if (!defined('STATUSNET') && !defined('LACONICA')) {
2009-04-16 15:18:16 +01:00
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
2009-08-25 23:16:46 +01:00
* at status.net.)
2009-04-16 15:18:16 +01:00
*
* It can either be called from a cron job, or run occasionally by the
* Web site.
*
* @category Stats
* @package StatusNet
* @author Evan Prodromou <evan@status.net>
2009-04-16 15:18:16 +01:00
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
2009-08-25 23:16:46 +01:00
* @link http://status.net/
2009-04-16 15:18:16 +01:00
*
*/
class Snapshot
{
2009-04-16 17:41:30 +01:00
var $stats = null;
2009-04-16 15:18:16 +01:00
/**
* Constructor for a snapshot
*/
2009-04-16 17:41:30 +01:00
function __construct()
2009-04-16 15:18:16 +01:00
{
}
/**
* 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
*/
2009-04-16 15:18:16 +01:00
static function check()
{
switch (common_config('snapshot', 'run')) {
case 'web':
2009-04-16 15:18:16 +01:00
// 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();
2009-05-26 22:26:31 +01:00
$snapshot->take();
$snapshot->report();
2009-04-16 15:18:16 +01:00
}
break;
case 'cron':
2009-04-16 15:18:16 +01:00
// skip if we're running on the Web
if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) {
break;
}
2009-05-26 22:26:31 +01:00
common_log(LOG_INFO, 'Running snapshot from cron job');
2009-04-16 15:18:16 +01:00
// We're running from the command line; assume
2009-05-26 22:26:31 +01:00
2009-04-16 15:18:16 +01:00
$snapshot = new Snapshot();
2009-05-26 22:26:31 +01:00
$snapshot->take();
common_log(LOG_INFO, count($snapshot->stats) . " statistics being uploaded.");
$snapshot->report();
2009-04-16 15:18:16 +01:00
break;
case 'never':
2009-04-16 15:18:16 +01:00
break;
default:
2009-04-16 15:18:16 +01:00
common_log(LOG_WARNING, "Unrecognized value for snapshot run config.");
}
}
2009-04-16 17:41:30 +01:00
/**
* 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
*/
2009-04-16 17:41:30 +01:00
function take()
{
$this->stats = array();
// Some basic identification stuff
2009-08-25 23:42:34 +01:00
$this->stats['version'] = STATUSNET_VERSION;
2009-04-16 17:41:30 +01:00
$this->stats['phpversion'] = phpversion();
$this->stats['name'] = common_config('site', 'name');
$this->stats['root'] = common_root_url();
2009-04-16 17:41:30 +01:00
// 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');
2009-04-16 17:41:30 +01:00
$this->stats['memcached'] = common_config('memcached', 'enabled');
$this->stats['language'] = common_config('site', 'language');
$this->stats['timezone'] = common_config('site', 'timezone');
2009-05-26 22:26:31 +01:00
2009-04-16 17:41:30 +01:00
}
/**
* Reports statistics to headquarters
*
* Posts statistics to a reporting server.
*
* @return void
*/
2009-04-16 17:41:30 +01:00
function report()
{
// XXX: Use OICU2 and OAuth to make authorized requests
$reporturl = common_config('snapshot', 'reporturl');
2010-01-10 21:54:26 +00:00
try {
$request = HTTPClient::start();
$request->post($reporturl, null, $this->stats);
} catch (Exception $e) {
common_log(LOG_WARNING, "Error in snapshot: " . $e->getMessage());
}
2009-04-16 17:41:30 +01:00
}
/**
* 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
*/
2009-04-16 17:41:30 +01:00
function tableStats($table)
{
2009-05-26 22:26:31 +01:00
$inst = DB_DataObject::factory($table);
2009-05-26 22:26:31 +01:00
$inst->selectAdd();
$inst->selectAdd('count(*) as cnt, '.
'min(created) as first, '.
'max(created) as last');
2009-05-26 22:26:31 +01:00
if ($inst->find(true)) {
2009-04-16 17:41:30 +01:00
$this->stats[$table.'count'] = $inst->cnt;
$this->stats[$table.'first'] = $inst->first;
$this->stats[$table.'last'] = $inst->last;
2009-04-16 17:41:30 +01:00
}
2009-04-16 17:41:30 +01:00
$inst->free();
unset($inst);
}
2009-04-16 15:18:16 +01:00
}