diff options
author | Timo Besenreuther <timo.besenreuther@gmail.com> | 2013-04-02 16:40:45 +0400 |
---|---|---|
committer | Timo Besenreuther <timo.besenreuther@gmail.com> | 2013-04-02 16:40:45 +0400 |
commit | fb5f11a5ca82b15eb419803e6e00ce6dfba515d0 (patch) | |
tree | 48841d8b676426bc81729c1caa3304098a2dc91c /plugins | |
parent | a05bd7ba73dbf53fbb2fb06dd3a927ae5ec167bc (diff) |
refs #1700 performance analytics
* adding avg_time_generation to Actions.get + integration tests
* adding sparkline for average generation time to Visitors > Overview
* changing number formatting to 0.XXs instead of XXXms + test cases
* tooltip for reports with avg. generation time: "average based on X hit(s)"
* log import: support generation_time_milli (not only generation_time_micro)
* example for importing generation time from logs in read me
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/Actions/API.php | 41 | ||||
-rw-r--r-- | plugins/Actions/Actions.php | 32 | ||||
-rw-r--r-- | plugins/Actions/Archiving.php | 4 | ||||
-rw-r--r-- | plugins/Actions/Controller.php | 11 | ||||
-rw-r--r-- | plugins/CoreHome/templates/datatable.css | 4 | ||||
-rw-r--r-- | plugins/CoreHome/templates/datatable.js | 16 | ||||
-rw-r--r-- | plugins/CoreHome/templates/datatable_cell.tpl | 3 | ||||
-rw-r--r-- | plugins/VisitsSummary/Controller.php | 2 | ||||
-rw-r--r-- | plugins/VisitsSummary/templates/sparklines.tpl | 5 |
9 files changed, 91 insertions, 27 deletions
diff --git a/plugins/Actions/API.php b/plugins/Actions/API.php index 030f954d93..ad9d15e73e 100644 --- a/plugins/Actions/API.php +++ b/plugins/Actions/API.php @@ -73,14 +73,15 @@ class Piwik_Actions_API $archive = Piwik_Archive::build($idSite, $period, $date, $segment); $metrics = array( - 'Actions_nb_pageviews' => 'nb_pageviews', - 'Actions_nb_uniq_pageviews' => 'nb_uniq_pageviews', - 'Actions_nb_downloads' => 'nb_downloads', - 'Actions_nb_uniq_downloads' => 'nb_uniq_downloads', - 'Actions_nb_outlinks' => 'nb_outlinks', - 'Actions_nb_uniq_outlinks' => 'nb_uniq_outlinks', - 'Actions_nb_searches' => 'nb_searches', - 'Actions_nb_keywords' => 'nb_keywords', + 'Actions_nb_pageviews' => 'nb_pageviews', + 'Actions_nb_uniq_pageviews' => 'nb_uniq_pageviews', + 'Actions_nb_downloads' => 'nb_downloads', + 'Actions_nb_uniq_downloads' => 'nb_uniq_downloads', + 'Actions_nb_outlinks' => 'nb_outlinks', + 'Actions_nb_uniq_outlinks' => 'nb_uniq_outlinks', + 'Actions_nb_searches' => 'nb_searches', + 'Actions_nb_keywords' => 'nb_keywords', + 'Actions_avg_time_generation' => 'avg_time_generation' ); // get requested columns @@ -95,16 +96,38 @@ class Piwik_Actions_API $columns[$i] = $fullColumn; $nameReplace[$fullColumn] = $column; } + + if (false !== ($avgGenerationTimeRequested = array_search('Actions_avg_time_generation', $columns))) { + unset($columns[$avgGenerationTimeRequested]); + $avgGenerationTimeRequested = true; + } } else { // get all columns + unset($metrics['Actions_avg_time_generation']); $columns = array_keys($metrics); $nameReplace = & $metrics; + $avgGenerationTimeRequested = true; } - + + if ($avgGenerationTimeRequested) { + $tempColumns[] = 'Actions_sum_time_generation'; + $tempColumns[] = 'Actions_nb_hits_with_time_generation'; + $nameReplace['Actions_sum_time_generation'] = 'sum_time_generation'; + $nameReplace['Actions_nb_hits_with_time_generation'] = 'nb_hits_with_time_generation'; + $columns = array_merge($columns, $tempColumns); + $columns = array_unique($columns); + } + $table = $archive->getDataTableFromNumeric($columns); // replace labels (remove Actions_) $table->filter('ReplaceColumnNames', array($nameReplace)); + + // compute avg generation time + if ($avgGenerationTimeRequested) { + $table->filter('ColumnCallbackAddColumnQuotient', array('avg_time_generation', 'sum_time_generation', 'nb_hits_with_time_generation', 3)); + $table->deleteColumns(array('sum_time_generation', 'nb_hits_with_time_generation')); + } return $table; } diff --git a/plugins/Actions/Actions.php b/plugins/Actions/Actions.php index f5bd2674ca..097d2e3dee 100644 --- a/plugins/Actions/Actions.php +++ b/plugins/Actions/Actions.php @@ -185,23 +185,25 @@ class Piwik_Actions extends Piwik_Plugin 'module' => 'Actions', 'action' => 'get', 'metrics' => array( - 'nb_pageviews' => Piwik_Translate('General_ColumnPageviews'), - 'nb_uniq_pageviews' => Piwik_Translate('General_ColumnUniquePageviews'), - 'nb_downloads' => Piwik_Translate('Actions_ColumnDownloads'), - 'nb_uniq_downloads' => Piwik_Translate('Actions_ColumnUniqueDownloads'), - 'nb_outlinks' => Piwik_Translate('Actions_ColumnOutlinks'), - 'nb_uniq_outlinks' => Piwik_Translate('Actions_ColumnUniqueOutlinks'), - 'nb_searches' => Piwik_Translate('Actions_ColumnSearches'), - 'nb_keywords' => Piwik_Translate('Actions_ColumnSiteSearchKeywords'), + 'nb_pageviews' => Piwik_Translate('General_ColumnPageviews'), + 'nb_uniq_pageviews' => Piwik_Translate('General_ColumnUniquePageviews'), + 'nb_downloads' => Piwik_Translate('Actions_ColumnDownloads'), + 'nb_uniq_downloads' => Piwik_Translate('Actions_ColumnUniqueDownloads'), + 'nb_outlinks' => Piwik_Translate('Actions_ColumnOutlinks'), + 'nb_uniq_outlinks' => Piwik_Translate('Actions_ColumnUniqueOutlinks'), + 'nb_searches' => Piwik_Translate('Actions_ColumnSearches'), + 'nb_keywords' => Piwik_Translate('Actions_ColumnSiteSearchKeywords'), + 'avg_time_generation' => Piwik_Translate('General_ColumnAverageGenerationTime'), ), 'metricsDocumentation' => array( - 'nb_pageviews' => Piwik_Translate('General_ColumnPageviewsDocumentation'), - 'nb_uniq_pageviews' => Piwik_Translate('General_ColumnUniquePageviewsDocumentation'), - 'nb_downloads' => Piwik_Translate('Actions_ColumnClicksDocumentation'), - 'nb_uniq_downloads' => Piwik_Translate('Actions_ColumnUniqueClicksDocumentation'), - 'nb_outlinks' => Piwik_Translate('Actions_ColumnClicksDocumentation'), - 'nb_uniq_outlinks' => Piwik_Translate('Actions_ColumnUniqueClicksDocumentation'), - 'nb_searches' => Piwik_Translate('Actions_ColumnSearchesDocumentation'), + 'nb_pageviews' => Piwik_Translate('General_ColumnPageviewsDocumentation'), + 'nb_uniq_pageviews' => Piwik_Translate('General_ColumnUniquePageviewsDocumentation'), + 'nb_downloads' => Piwik_Translate('Actions_ColumnClicksDocumentation'), + 'nb_uniq_downloads' => Piwik_Translate('Actions_ColumnUniqueClicksDocumentation'), + 'nb_outlinks' => Piwik_Translate('Actions_ColumnClicksDocumentation'), + 'nb_uniq_outlinks' => Piwik_Translate('Actions_ColumnUniqueClicksDocumentation'), + 'nb_searches' => Piwik_Translate('Actions_ColumnSearchesDocumentation'), + 'avg_time_generation' => Piwik_Translate('General_ColumnAverageGenerationTimeDocumentation'), // 'nb_keywords' => Piwik_Translate('Actions_ColumnSiteSearchKeywords'), ), 'processedMetrics' => false, diff --git a/plugins/Actions/Archiving.php b/plugins/Actions/Archiving.php index db71faf788..848b4cc562 100644 --- a/plugins/Actions/Archiving.php +++ b/plugins/Actions/Archiving.php @@ -74,6 +74,8 @@ class Piwik_Actions_Archiving 'Actions_nb_outlinks', 'Actions_nb_uniq_outlinks', 'Actions_nb_searches', + 'Actions_sum_time_generation', + 'Actions_nb_hits_with_time_generation', )); // Unique Keywords can't be summed, instead we take the RowsCount() of the keyword table @@ -359,6 +361,8 @@ class Piwik_Actions_Archiving $archiveProcessing->insertBlobRecord('Actions_actions_url', $s); $archiveProcessing->insertNumericRecord('Actions_nb_pageviews', array_sum($dataTable->getColumn(Piwik_Archive::INDEX_PAGE_NB_HITS))); $archiveProcessing->insertNumericRecord('Actions_nb_uniq_pageviews', array_sum($dataTable->getColumn(Piwik_Archive::INDEX_NB_VISITS))); + $archiveProcessing->insertNumericRecord('Actions_sum_time_generation', array_sum($dataTable->getColumn(Piwik_Archive::INDEX_PAGE_SUM_TIME_GENERATION))); + $archiveProcessing->insertNumericRecord('Actions_nb_hits_with_time_generation', array_sum($dataTable->getColumn(Piwik_Archive::INDEX_PAGE_NB_HITS_WITH_TIME_GENERATION))); destroy($dataTable); $dataTable = $this->actionsTablesByType[Piwik_Tracker_Action::TYPE_DOWNLOAD]; diff --git a/plugins/Actions/Controller.php b/plugins/Actions/Controller.php index aed8efd683..1744a63155 100644 --- a/plugins/Actions/Controller.php +++ b/plugins/Actions/Controller.php @@ -385,9 +385,14 @@ class Piwik_Actions_Controller extends Piwik_Controller $view->setColumnTranslation('bounce_rate', Piwik_Translate('General_ColumnBounceRate')); $view->setColumnTranslation('exit_rate', Piwik_Translate('General_ColumnExitRate')); $view->setColumnTranslation('avg_time_generation', Piwik_Translate('General_ColumnAverageGenerationTime')); - $view->queueFilter('ColumnCallbackReplace', array('avg_time_on_page', array('Piwik', 'getPrettyTimeFromSeconds'))); - $view->queueFilter('ColumnCallbackReplace', array('avg_time_generation', - create_function('$averageTimeOnSite', 'return $averageTimeOnSite ? Piwik::getPrettyTimeFromSeconds($averageTimeOnSite, true, true, false) : "-";'))); + + $view->queueFilter('ColumnCallbackReplace', array('avg_time_on_page', array('Piwik', 'getPrettyTimeFromSeconds'))); + + $avgTimeCallback = create_function('$time', 'return $time ? Piwik::getPrettyTimeFromSeconds($time, true, true, false) : "-";'); + $view->queueFilter('ColumnCallbackReplace', array('avg_time_generation', $avgTimeCallback)); + + $tooltipCallback = create_function('$hits', 'return $hits ? Piwik_Translate("Actions_AvgGenerationTimeTooltip", $hits) : false;'); + $view->queueFilter('ColumnCallbackAddMetadata', array('nb_hits_with_time_generation', 'avg_time_generation_tooltip', $tooltipCallback)); } if (Piwik_Common::getRequestVar('enable_filter_excludelowpop', '0', 'string') != '0') { diff --git a/plugins/CoreHome/templates/datatable.css b/plugins/CoreHome/templates/datatable.css index dfaf958e01..daddbc86b0 100644 --- a/plugins/CoreHome/templates/datatable.css +++ b/plugins/CoreHome/templates/datatable.css @@ -803,3 +803,7 @@ a.tableConfigurationIcon.highlighted { .tableConfiguration div.configItem span.action { color: #255792; } + +table.dataTable span.cell-tooltip { + cursor: default; +}
\ No newline at end of file diff --git a/plugins/CoreHome/templates/datatable.js b/plugins/CoreHome/templates/datatable.js index 2a8f437d65..c5553ca4f6 100644 --- a/plugins/CoreHome/templates/datatable.js +++ b/plugins/CoreHome/templates/datatable.js @@ -223,6 +223,7 @@ dataTable.prototype = self.handleColumnDocumentation(domElem); self.handleReportDocumentation(domElem); self.handleRowActions(domElem); + self.handleCellTooltips(domElem); self.handleRelatedReports(domElem); self.handleTriggeredEvents(domElem); }, @@ -1312,6 +1313,19 @@ dataTable.prototype = handleRowActions: function (domElem) { this.doHandleRowActions(domElem.find('table > tbody > tr')); }, + + handleCellTooltips: function(domElem) { + domElem.find('span.cell-tooltip').tooltip({ + track: true, + items: 'span', + content: function() { + return $(this).data('tooltip'); + }, + show: false, + hide: false, + tooltipClass: 'small' + }); + }, handleRelatedReports: function (domElem) { var self = this, @@ -1576,6 +1590,7 @@ actionDataTable.prototype = notifyWidgetParametersChange: dataTable.prototype.notifyWidgetParametersChange, handleRelatedReports: dataTable.prototype.handleRelatedReports, handleTriggeredEvents: dataTable.prototype.handleTriggeredEvents, + handleCellTooltips: dataTable.prototype.handleCellTooltips, _findReportHeader: dataTable.prototype._findReportHeader, //initialisation of the actionDataTable @@ -1627,6 +1642,7 @@ actionDataTable.prototype = self.handleReportDocumentation(domElem); self.handleRelatedReports(domElem); self.handleTriggeredEvents(domElem); + self.handleCellTooltips(domElem); }, //see dataTable::applyCosmetics diff --git a/plugins/CoreHome/templates/datatable_cell.tpl b/plugins/CoreHome/templates/datatable_cell.tpl index 3b1ec5cd98..0ecb4bd04c 100644 --- a/plugins/CoreHome/templates/datatable_cell.tpl +++ b/plugins/CoreHome/templates/datatable_cell.tpl @@ -1,3 +1,5 @@ +{assign var="tooltipIndex" value=$column|cat:"_tooltip"} +{if isset($row.metadata[$tooltipIndex])}<span class="cell-tooltip" data-tooltip="{$row.metadata[$tooltipIndex]|escape:'html'}">{/if} {if !$row.idsubdatatable && $column=='label' && !empty($row.metadata.url)} <a target="_blank" href='{if !in_array(substr($row.metadata.url,0,4), array('http','ftp:'))}http://{/if}{$row.metadata.url|escape:'html'}'> {if empty($row.metadata.logo)} @@ -16,3 +18,4 @@ {if !$row.idsubdatatable && $column=='label' && !empty($row.metadata.url)} </a> {/if} +{if isset($row.metadata[$tooltipIndex])}</span>{/if}
\ No newline at end of file diff --git a/plugins/VisitsSummary/Controller.php b/plugins/VisitsSummary/Controller.php index 86ebf7b5ac..5857a7a34d 100644 --- a/plugins/VisitsSummary/Controller.php +++ b/plugins/VisitsSummary/Controller.php @@ -116,6 +116,7 @@ class Piwik_VisitsSummary_Controller extends Piwik_Controller $view->urlSparklineMaxActions = $this->getUrlSparkline('getEvolutionGraph', array('columns' => array('max_actions'))); $view->urlSparklineActionsPerVisit = $this->getUrlSparkline('getEvolutionGraph', array('columns' => array('nb_actions_per_visit'))); $view->urlSparklineBounceRate = $this->getUrlSparkline('getEvolutionGraph', array('columns' => array('bounce_rate'))); + $view->urlSparklineAvgGenerationTime = $this->getUrlSparkline('getEvolutionGraph', array('columns' => array('avg_time_generation'))); $idSite = Piwik_Common::getRequestVar('idSite'); $displaySiteSearch = Piwik_Site::isSiteSearchEnabledFor($idSite); @@ -145,6 +146,7 @@ class Piwik_VisitsSummary_Controller extends Piwik_Controller $view->bounceRate = Piwik::getPercentageSafe($nbBouncedVisits, $nbVisits); $view->maxActions = (int)$dataRow->getColumn('max_actions'); $view->nbActionsPerVisit = $dataRow->getColumn('nb_actions_per_visit'); + $view->averageGenerationTime = $dataActionsRow->getColumn('avg_time_generation'); if ($displaySiteSearch) { $view->nbSearches = (int)$dataActionsRow->getColumn('nb_searches'); diff --git a/plugins/VisitsSummary/templates/sparklines.tpl b/plugins/VisitsSummary/templates/sparklines.tpl index a0302f407a..f57aa9ee94 100644 --- a/plugins/VisitsSummary/templates/sparklines.tpl +++ b/plugins/VisitsSummary/templates/sparklines.tpl @@ -17,6 +17,11 @@ {sparkline src=$urlSparklineActionsPerVisit} {'VisitsSummary_NbActionsPerVisit'|translate:"<strong>$nbActionsPerVisit</strong>"} </div> + <div class="sparkline"> + {sparkline src=$urlSparklineAvgGenerationTime} + {assign var=averageGenerationTime value=$averageGenerationTime|sumtime} + {'VisitsSummary_AverageGenerationTime'|translate:"<strong>$averageGenerationTime</strong>"} + </div> </div> <div id='rightcolumn'> |