| 
									
										
										
										
											2009-04-16 10:18:16 -04:00
										 |  |  | <?php | 
					
						
							|  |  |  | /** | 
					
						
							| 
									
										
										
										
											2009-08-25 18:12:20 -04:00
										 |  |  |  * StatusNet, the distributed open-source microblogging tool | 
					
						
							| 
									
										
										
										
											2009-04-16 10:18:16 -04: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 | 
					
						
							| 
									
										
										
										
											2009-08-25 18:12:20 -04:00
										 |  |  |  * @package   StatusNet | 
					
						
							| 
									
										
										
										
											2009-08-25 18:19:04 -04:00
										 |  |  |  * @author    Evan Prodromou <evan@status.net> | 
					
						
							| 
									
										
										
										
											2009-08-25 18:12:20 -04:00
										 |  |  |  * @copyright 2009 StatusNet, Inc. | 
					
						
							| 
									
										
										
										
											2009-04-16 10:18:16 -04:00
										 |  |  |  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | 
					
						
							| 
									
										
										
										
											2009-08-25 18:16:46 -04:00
										 |  |  |  * @link      http://status.net/ | 
					
						
							| 
									
										
										
										
											2009-04-16 10:18:16 -04:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-26 10:41:36 -04:00
										 |  |  | if (!defined('STATUSNET') && !defined('LACONICA')) { | 
					
						
							| 
									
										
										
										
											2009-04-16 10:18:16 -04: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 18:16:46 -04:00
										 |  |  |  * at status.net.) | 
					
						
							| 
									
										
										
										
											2009-04-16 10:18:16 -04:00
										 |  |  |  * | 
					
						
							|  |  |  |  * It can either be called from a cron job, or run occasionally by the | 
					
						
							|  |  |  |  * Web site. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @category Stats | 
					
						
							| 
									
										
										
										
											2009-08-25 18:12:20 -04:00
										 |  |  |  * @package  StatusNet | 
					
						
							| 
									
										
										
										
											2009-08-25 18:19:04 -04:00
										 |  |  |  * @author   Evan Prodromou <evan@status.net> | 
					
						
							| 
									
										
										
										
											2009-04-16 10:18:16 -04:00
										 |  |  |  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | 
					
						
							| 
									
										
										
										
											2009-08-25 18:16:46 -04:00
										 |  |  |  * @link     http://status.net/ | 
					
						
							| 
									
										
										
										
											2009-04-16 10:18:16 -04:00
										 |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-16 12:50:29 -04:00
										 |  |  | class Snapshot | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-04-16 12:41:30 -04:00
										 |  |  |     var $stats = null; | 
					
						
							| 
									
										
										
										
											2009-04-16 10:18:16 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-16 12:50:29 -04:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Constructor for a snapshot | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-16 12:41:30 -04:00
										 |  |  |     function __construct() | 
					
						
							| 
									
										
										
										
											2009-04-16 10:18:16 -04:00
										 |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-16 12:50:29 -04: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 10:18:16 -04:00
										 |  |  |     static function check() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         switch (common_config('snapshot', 'run')) { | 
					
						
							| 
									
										
										
										
											2009-04-16 12:50:29 -04:00
										 |  |  |         case 'web': | 
					
						
							| 
									
										
										
										
											2009-04-16 10:18:16 -04: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 17:26:31 -04:00
										 |  |  |                 $snapshot->take(); | 
					
						
							|  |  |  |                 $snapshot->report(); | 
					
						
							| 
									
										
										
										
											2009-04-16 10:18:16 -04:00
										 |  |  |             } | 
					
						
							|  |  |  |             break; | 
					
						
							| 
									
										
										
										
											2009-04-16 12:50:29 -04:00
										 |  |  |         case 'cron': | 
					
						
							| 
									
										
										
										
											2009-04-16 10:18:16 -04:00
										 |  |  |             // skip if we're running on the Web
 | 
					
						
							|  |  |  |             if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) { | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2009-05-26 17:26:31 -04:00
										 |  |  |             common_log(LOG_INFO, 'Running snapshot from cron job'); | 
					
						
							| 
									
										
										
										
											2009-04-16 10:18:16 -04:00
										 |  |  |             // We're running from the command line; assume
 | 
					
						
							| 
									
										
										
										
											2009-05-26 17:26:31 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-16 10:18:16 -04:00
										 |  |  |             $snapshot = new Snapshot(); | 
					
						
							| 
									
										
										
										
											2009-05-26 17:26:31 -04:00
										 |  |  |             $snapshot->take(); | 
					
						
							|  |  |  |             common_log(LOG_INFO, count($snapshot->stats) . " statistics being uploaded."); | 
					
						
							|  |  |  |             $snapshot->report(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-16 10:18:16 -04:00
										 |  |  |             break; | 
					
						
							| 
									
										
										
										
											2009-04-16 12:50:29 -04:00
										 |  |  |         case 'never': | 
					
						
							| 
									
										
										
										
											2009-04-16 10:18:16 -04:00
										 |  |  |             break; | 
					
						
							| 
									
										
										
										
											2009-04-16 12:50:29 -04:00
										 |  |  |         default: | 
					
						
							| 
									
										
										
										
											2009-04-16 10:18:16 -04:00
										 |  |  |             common_log(LOG_WARNING, "Unrecognized value for snapshot run config."); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-04-16 12:41:30 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-16 12:50:29 -04: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 12:41:30 -04:00
										 |  |  |     function take() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->stats = array(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Some basic identification stuff
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-25 18:42:34 -04:00
										 |  |  |         $this->stats['version']    = STATUSNET_VERSION; | 
					
						
							| 
									
										
										
										
											2009-04-16 12:41:30 -04:00
										 |  |  |         $this->stats['phpversion'] = phpversion(); | 
					
						
							| 
									
										
										
										
											2009-04-16 12:50:29 -04:00
										 |  |  |         $this->stats['name']       = common_config('site', 'name'); | 
					
						
							|  |  |  |         $this->stats['root']       = common_root_url(); | 
					
						
							| 
									
										
										
										
											2009-04-16 12:41:30 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // 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
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-16 12:50:29 -04:00
										 |  |  |         $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 12:41:30 -04:00
										 |  |  |         $this->stats['memcached'] = common_config('memcached', 'enabled'); | 
					
						
							| 
									
										
										
										
											2009-04-16 12:50:29 -04:00
										 |  |  |         $this->stats['language']  = common_config('site', 'language'); | 
					
						
							|  |  |  |         $this->stats['timezone']  = common_config('site', 'timezone'); | 
					
						
							| 
									
										
										
										
											2009-05-26 17:26:31 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-16 12:41:30 -04:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-16 12:50:29 -04:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Reports statistics to headquarters | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * Posts statistics to a reporting server. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return void | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-16 12:41:30 -04:00
										 |  |  |     function report() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         // XXX: Use OICU2 and OAuth to make authorized requests
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $reporturl = common_config('snapshot', 'reporturl'); | 
					
						
							| 
									
										
										
										
											2010-01-10 13:54:26 -08: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 12:41:30 -04:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-16 12:50:29 -04: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 12:41:30 -04:00
										 |  |  |     function tableStats($table) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-05-26 17:26:31 -04:00
										 |  |  |         $inst = DB_DataObject::factory($table); | 
					
						
							| 
									
										
										
										
											2009-04-16 12:50:29 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-26 17:26:31 -04:00
										 |  |  |         $inst->selectAdd(); | 
					
						
							|  |  |  |         $inst->selectAdd('count(*) as cnt, '. | 
					
						
							|  |  |  |                          'min(created) as first, '. | 
					
						
							|  |  |  |                          'max(created) as last'); | 
					
						
							| 
									
										
										
										
											2009-04-16 12:50:29 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-26 17:26:31 -04:00
										 |  |  |         if ($inst->find(true)) { | 
					
						
							| 
									
										
										
										
											2009-04-16 12:41:30 -04:00
										 |  |  |             $this->stats[$table.'count'] = $inst->cnt; | 
					
						
							|  |  |  |             $this->stats[$table.'first'] = $inst->first; | 
					
						
							| 
									
										
										
										
											2009-04-16 12:50:29 -04:00
										 |  |  |             $this->stats[$table.'last']  = $inst->last; | 
					
						
							| 
									
										
										
										
											2009-04-16 12:41:30 -04:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-04-16 12:50:29 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-16 12:41:30 -04:00
										 |  |  |         $inst->free(); | 
					
						
							|  |  |  |         unset($inst); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-04-16 10:18:16 -04:00
										 |  |  | } |