diff --git a/plugins/SQLStats/SQLStatsPlugin.php b/plugins/SQLStats/SQLStatsPlugin.php new file mode 100644 index 0000000000..9e810a3ffc --- /dev/null +++ b/plugins/SQLStats/SQLStatsPlugin.php @@ -0,0 +1,83 @@ +. + */ + +if (!defined('STATUSNET')) { + exit(1); +} + +/** + * Check DB queries for filesorts and such and log em. + * + * @package SQLStatsPlugin + * @maintainer Evan Prodromou + */ + +class SQLStatsPlugin extends Plugin +{ + protected $queryCount = 0; + protected $queryStart = 0; + protected $queryTimes = array(); + protected $queries = array(); + + function onPluginVersion(&$versions) + { + $versions[] = array('name' => 'SQLStats', + 'version' => STATUSNET_VERSION, + 'author' => 'Evan Prodromou', + 'homepage' => 'http://status.net/wiki/Plugin:SQLStats', + 'rawdescription' => + _m('Debug tool to watch for poorly indexed DB queries.')); + + return true; + } + + function onStartDBQuery($obj, $query, &$result) + { + $this->queryStart = microtime(true); + return true; + } + + function onEndDBQuery($obj, $query, &$result) + { + $endTime = microtime(true); + $this->queryTimes[] = round(($endTime - $this->queryStart) * 1000); + $this->queries[] = trim(preg_replace('/\s/', ' ', $query)); + $this->queryStart = 0; + + return true; + } + + function cleanup() + { + $this->log(LOG_INFO, sprintf('%d queries this hit (total = %d, avg = %d, max = %d, min = %d)', + count($this->queryTimes), + array_sum($this->queryTimes), + array_sum($this->queryTimes)/count($this->queryTimes), + max($this->queryTimes), + min($this->queryTimes))); + + $verbose = common_config('sqlstats', 'verbose'); + + if ($verbose) { + foreach ($this->queries as $query) { + $this->log(LOG_INFO, $query); + } + } + } +}