diff options
author | diosmosis <benaka@piwik.pro> | 2015-08-23 00:45:03 +0300 |
---|---|---|
committer | diosmosis <benaka@piwik.pro> | 2015-08-24 18:49:41 +0300 |
commit | 8ef2f0d91b7c17784098362dc6361cc54ba61f82 (patch) | |
tree | 81f2c93f098523503853d7d82649008791d3cca2 /plugins/Diagnostics | |
parent | c5714af4fa6d4db2b8cd06cf13db64b369960496 (diff) |
Adding diagnostic command that allows you to see exactly what's inside an archive table. Useful when trying to find out why one table is using a lot of space or is using more space than others.
Diffstat (limited to 'plugins/Diagnostics')
-rw-r--r-- | plugins/Diagnostics/Commands/AnalyzeArchiveTable.php | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/plugins/Diagnostics/Commands/AnalyzeArchiveTable.php b/plugins/Diagnostics/Commands/AnalyzeArchiveTable.php new file mode 100644 index 0000000000..915019ce46 --- /dev/null +++ b/plugins/Diagnostics/Commands/AnalyzeArchiveTable.php @@ -0,0 +1,82 @@ +<?php +/** + * Piwik - free/libre analytics platform + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + */ + +namespace Piwik\Plugins\Diagnostics\Commands; + +use Piwik\Container\StaticContainer; +use Piwik\Piwik; +use Piwik\Plugin\ConsoleCommand; +use Symfony\Component\Console\Input\InputArgument; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Helper\Table; + +/** + * Diagnostic command that analyzes a single archive table. Displays information like # of segment archives, + * # invalidated archives, # temporary archives, etc. + */ +class AnalyzeArchiveTable extends ConsoleCommand +{ + protected function configure() + { + $this->setName('diagnostics:analyze-archive-table'); + $this->setDescription('Analyze an archive table and display human readable information about what is stored. ' + . 'This command can be used to diagnose issues like bloated archive tables.'); + $this->addArgument('table-date', InputArgument::REQUIRED, "The table's associated date, eg, 2015_01 or 2015_02"); + } + + protected function execute(InputInterface $input, OutputInterface $output) + { + $tableDate = $input->getArgument('table-date'); + + $output->writeln("<comment>Statistics for the archive_numeric_$tableDate and archive_blob_$tableDate tables:</comment>"); + $output->writeln(""); + + $archiveTableDao = StaticContainer::get('Piwik\DataAccess\ArchiveTableDao'); + $rows = $archiveTableDao->getArchiveTableAnalysis($tableDate); + + // process labels + $periodIdsToLabels = array_flip(Piwik::$idPeriods); + foreach ($rows as $key => &$row) { + list($idSite, $date1, $date2, $period) = explode('.', $key); + + $periodLabel = isset($periodIdsToLabels[$period]) ? $periodIdsToLabels[$period] : "Unknown Period ($period)"; + $row['label'] = $periodLabel . "[" . $date1 . " - " . $date2 . "] idSite = " . $idSite; + } + + $headers = array('Group', '# Archives', '# Invalidated', '# Temporary', '# Error', '# Segment', + '# Numeric Rows', '# Blob Rows'); + + // display all rows + $table = new Table($output); + $table->setHeaders($headers)->setRows($rows); + $table->render(); + + // display summary + $totalArchives = 0; + $totalInvalidated = 0; + $totalTemporary = 0; + $totalError = 0; + $totalSegment = 0; + foreach ($rows as $row) { + $totalArchives += $row['count_archives']; + $totalInvalidated += $row['count_invalidated_archives']; + $totalTemporary += $row['count_temporary_archives']; + $totalError += $row['count_error_archives']; + $totalSegment += $row['count_segment_archives']; + } + + $output->writeln(""); + $output->writeln("Total # Archives: <comment>$totalArchives</comment>"); + $output->writeln("Total # Invalidated Archives: <comment>$totalInvalidated</comment>"); + $output->writeln("Total # Temporary Archives: <comment>$totalTemporary</comment>"); + $output->writeln("Total # Error Archives: <comment>$totalError</comment>"); + $output->writeln("Total # Segment Archives: <comment>$totalSegment</comment>"); + $output->writeln(""); + } +} |