Skip to content

Commit

Permalink
Merge pull request #2874 from uxen-ab/bugs-in-the-average-metrics-graph
Browse files Browse the repository at this point in the history
Bugs in the average metrics graph
  • Loading branch information
jbrooksuk committed Jan 21, 2018
2 parents 7155b77 + 9af7978 commit 2783824
Show file tree
Hide file tree
Showing 7 changed files with 108 additions and 42 deletions.
10 changes: 5 additions & 5 deletions app/Repositories/Metric/MetricRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -60,15 +60,15 @@ public function __construct(MetricInterface $repository, DateFactory $dates)
public function listPointsLastHour(Metric $metric)
{
$dateTime = $this->dates->make();
$pointKey = $dateTime->format('H:i');
$pointKey = $dateTime->format('Y-m-d H:i');
$points = $this->repository->getPointsSinceMinutes($metric, 60)->pluck('value', 'key')->take(60);

for ($i = 0; $i <= 60; $i++) {
if (!$points->has($pointKey)) {
$points->put($pointKey, $metric->default_value);
}

$pointKey = $dateTime->sub(new DateInterval('PT1M'))->format('H:i');
$pointKey = $dateTime->sub(new DateInterval('PT1M'))->format('Y-m-d H:i');
}

return $points->sortBy(function ($point, $key) {
Expand All @@ -87,17 +87,17 @@ public function listPointsLastHour(Metric $metric)
public function listPointsToday(Metric $metric, $hours = 12)
{
$dateTime = $this->dates->make();
$pointKey = $dateTime->format('H:00');
$pointKey = $dateTime->format('Y-m-d H:00');
$points = $this->repository->getPointsSinceHour($metric, $hours)->pluck('value', 'key');

for ($i = 0; $i <= $hours; $i++) {
if (!$points->has($pointKey)) {
$points->put($pointKey, $metric->default_value);
}

$pointKey = $dateTime->sub(new DateInterval('PT1H'))->format('H:00');
}
$pointKey = $dateTime->sub(new DateInterval('PT1H'))->format('Y-m-d H:00');

}
return $points->sortBy(function ($point, $key) {
return $key;
});
Expand Down
23 changes: 20 additions & 3 deletions app/Repositories/Metric/MySqlRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,13 @@ class MySqlRepository extends AbstractMetricRepository implements MetricInterfac
public function getPointsSinceMinutes(Metric $metric, $minutes)
{
$queryType = $this->getQueryType($metric);
$points = DB::select("SELECT DATE_FORMAT({$this->getMetricPointsTable()}.`created_at`, '%H:%i') AS `key`, {$queryType} FROM {$this->getMetricsTable()} INNER JOIN {$this->getMetricPointsTable()} ON {$this->getMetricsTable()}.id = {$this->getMetricPointsTable()}.metric_id WHERE {$this->getMetricsTable()}.id = :metricId AND {$this->getMetricPointsTable()}.`created_at` >= DATE_SUB(NOW(), INTERVAL :minutes MINUTE) GROUP BY HOUR({$this->getMetricPointsTable()}.`created_at`), MINUTE({$this->getMetricPointsTable()}.`created_at`) ORDER BY {$this->getMetricPointsTable()}.`created_at`", [

$points = DB::select("SELECT DATE_FORMAT({$this->getMetricPointsTable()}.`created_at`, '%Y-%m-%d %H:%i') AS `key`, {$queryType} " .
"FROM {$this->getMetricsTable()} INNER JOIN {$this->getMetricPointsTable()} ON {$this->getMetricsTable()}.id = {$this->getMetricPointsTable()}.metric_id " .
"WHERE {$this->getMetricsTable()}.id = :metricId " .
"AND {$this->getMetricPointsTable()}.`created_at` >= DATE_SUB(NOW(), INTERVAL :minutes MINUTE) " .
"AND {$this->getMetricPointsTable()}.`created_at` <= NOW() " .
"GROUP BY HOUR({$this->getMetricPointsTable()}.`created_at`), MINUTE({$this->getMetricPointsTable()}.`created_at`) ORDER BY {$this->getMetricPointsTable()}.`created_at`", [
'metricId' => $metric->id,
'minutes' => $minutes,
]);
Expand All @@ -51,7 +57,13 @@ public function getPointsSinceMinutes(Metric $metric, $minutes)
public function getPointsSinceHour(Metric $metric, $hour)
{
$queryType = $this->getQueryType($metric);
$points = DB::select("SELECT DATE_FORMAT({$this->getMetricPointsTable()}.`created_at`, '%H:00') AS `key`, {$queryType} FROM {$this->getMetricsTable()} INNER JOIN {$this->getMetricPointsTable()} ON {$this->getMetricsTable()}.id = {$this->getMetricPointsTable()}.metric_id WHERE {$this->getMetricsTable()}.id = :metricId AND {$this->getMetricPointsTable()}.`created_at` >= DATE_SUB(NOW(), INTERVAL :hour HOUR) GROUP BY HOUR({$this->getMetricPointsTable()}.`created_at`) ORDER BY {$this->getMetricPointsTable()}.`created_at`", [
$points = DB::select("SELECT DATE_FORMAT({$this->getMetricPointsTable()}.`created_at`, '%Y-%m-%d %H:00') AS `key`, {$queryType} " .
"FROM {$this->getMetricsTable()} INNER JOIN {$this->getMetricPointsTable()} ON {$this->getMetricsTable()}.id = {$this->getMetricPointsTable()}.metric_id " .
"WHERE {$this->getMetricsTable()}.id = :metricId " .
"AND {$this->getMetricPointsTable()}.`created_at` >= DATE_SUB(NOW(), INTERVAL :hour HOUR) " .
"AND {$this->getMetricPointsTable()}.`created_at` <= NOW() " .
"GROUP BY HOUR({$this->getMetricPointsTable()}.`created_at`) " .
"ORDER BY {$this->getMetricPointsTable()}.`created_at`", [
'metricId' => $metric->id,
'hour' => $hour,
]);
Expand All @@ -70,7 +82,12 @@ public function getPointsSinceHour(Metric $metric, $hour)
public function getPointsSinceDay(Metric $metric, $day)
{
$queryType = $this->getQueryType($metric);
$points = DB::select("SELECT DATE_FORMAT({$this->getMetricPointsTable()}.`created_at`, '%Y-%m-%d') AS `key`, {$queryType} FROM {$this->getMetricsTable()} INNER JOIN {$this->getMetricPointsTable()} ON {$this->getMetricsTable()}.id = {$this->getMetricPointsTable()}.metric_id WHERE {$this->getMetricsTable()}.id = :metricId AND {$this->getMetricPointsTable()}.`created_at` >= DATE_SUB(NOW(), INTERVAL :day DAY) GROUP BY DATE({$this->getMetricPointsTable()}.`created_at`) ORDER BY {$this->getMetricPointsTable()}.`created_at`", [
$points = DB::select("SELECT DATE_FORMAT({$this->getMetricPointsTable()}.`created_at`, '%Y-%m-%d') AS `key`, {$queryType} " .
"FROM {$this->getMetricsTable()} INNER JOIN {$this->getMetricPointsTable()} ON {$this->getMetricsTable()}.id = {$this->getMetricPointsTable()}.metric_id " .
"WHERE {$this->getMetricsTable()}.id = :metricId " .
"AND {$this->getMetricPointsTable()}.`created_at` >= DATE_SUB(NOW(), INTERVAL :day DAY) " .
"AND {$this->getMetricPointsTable()}.`created_at` <= NOW() " .
"GROUP BY DATE({$this->getMetricPointsTable()}.`created_at`) ORDER BY {$this->getMetricPointsTable()}.`created_at`", [
'metricId' => $metric->id,
'day' => $day,
]);
Expand Down
24 changes: 21 additions & 3 deletions app/Repositories/Metric/PgSqlRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,13 @@ class PgSqlRepository extends AbstractMetricRepository implements MetricInterfac
public function getPointsSinceMinutes(Metric $metric, $minutes)
{
$queryType = $this->getQueryType($metric);
$points = DB::select("SELECT to_char({$this->getMetricPointsTable()}.created_at, 'HH24:MI') AS key, {$queryType} FROM {$this->getMetricsTable()} INNER JOIN {$this->getMetricPointsTable()} ON {$this->getMetricsTable()}.id = {$this->getMetricPointsTable()}.metric_id WHERE {$this->getMetricsTable()}.id = :metricId AND {$this->getMetricPointsTable()}.created_at >= (NOW() - INTERVAL '{$minutes}' MINUTE) GROUP BY to_char({$this->getMetricPointsTable()}.created_at, 'HH24:MI') ORDER BY to_char({$this->getMetricPointsTable()}.created_at, 'HH24:MI')", [
$points = DB::select("SELECT to_char({$this->getMetricPointsTable()}.created_at, 'YYYY-MM-DD HH24:MI') AS key, {$queryType} " .
"FROM {$this->getMetricsTable()} INNER JOIN {$this->getMetricPointsTable()} ON {$this->getMetricsTable()}.id = {$this->getMetricPointsTable()}.metric_id " .
"WHERE {$this->getMetricsTable()}.id = :metricId " .
"AND {$this->getMetricPointsTable()}.created_at >= (NOW() - INTERVAL '{$minutes}' MINUTE) " .
"AND {$this->getMetricPointsTable()}.created_at <= NOW() " .
"GROUP BY to_char({$this->getMetricPointsTable()}.created_at, 'HH24:MI') " .
"ORDER BY to_char({$this->getMetricPointsTable()}.created_at, 'HH24:MI')", [
'metricId' => $metric->id,
]);

Expand All @@ -51,7 +57,13 @@ public function getPointsSinceMinutes(Metric $metric, $minutes)
public function getPointsSinceHour(Metric $metric, $hour)
{
$queryType = $this->getQueryType($metric);
$points = DB::select("SELECT to_char({$this->getMetricPointsTable()}.created_at, 'HH24:00') AS key, {$queryType} FROM {$this->getMetricsTable()} INNER JOIN {$this->getMetricPointsTable()} ON {$this->getMetricsTable()}.id = {$this->getMetricPointsTable()}.metric_id WHERE {$this->getMetricsTable()}.id = :metricId AND {$this->getMetricPointsTable()}.created_at >= (NOW() - INTERVAL '{$hour}' HOUR) GROUP BY to_char({$this->getMetricPointsTable()}.created_at, 'HH24:00') ORDER BY to_char({$this->getMetricPointsTable()}.created_at, 'HH24:00')", [
$points = DB::select("SELECT to_char({$this->getMetricPointsTable()}.created_at, 'YYYY-MM-DD HH24:00') AS key, {$queryType} " .
"FROM {$this->getMetricsTable()} INNER JOIN {$this->getMetricPointsTable()} ON {$this->getMetricsTable()}.id = {$this->getMetricPointsTable()}.metric_id " .
"WHERE {$this->getMetricsTable()}.id = :metricId " .
"AND {$this->getMetricPointsTable()}.created_at >= (NOW() - INTERVAL '{$hour}' HOUR) " .
"AND {$this->getMetricPointsTable()}.created_at <= NOW() " .
"GROUP BY to_char({$this->getMetricPointsTable()}.created_at, 'HH24:00') " .
"ORDER BY to_char({$this->getMetricPointsTable()}.created_at, 'HH24:00')", [
'metricId' => $metric->id,
]);

Expand All @@ -69,7 +81,13 @@ public function getPointsSinceHour(Metric $metric, $hour)
public function getPointsSinceDay(Metric $metric, $day)
{
$queryType = $this->getQueryType($metric);
$points = DB::select("SELECT DATE({$this->getMetricPointsTable()}.created_at) AS key, {$queryType} FROM {$this->getMetricsTable()} INNER JOIN {$this->getMetricPointsTable()} ON {$this->getMetricsTable()}.id = {$this->getMetricPointsTable()}.metric_id WHERE {$this->getMetricsTable()}.id = :metricId AND {$this->getMetricPointsTable()}.created_at >= (DATE(NOW()) - INTERVAL '{$day}' DAY) GROUP BY DATE({$this->getMetricPointsTable()}.created_at) ORDER BY DATE({$this->getMetricPointsTable()}.created_at)", [
$points = DB::select("SELECT DATE({$this->getMetricPointsTable()}.created_at) AS key, {$queryType} " .
"FROM {$this->getMetricsTable()} INNER JOIN {$this->getMetricPointsTable()} ON {$this->getMetricsTable()}.id = {$this->getMetricPointsTable()}.metric_id " .
"WHERE {$this->getMetricsTable()}.id = :metricId " .
"AND {$this->getMetricPointsTable()}.created_at >= (DATE(NOW()) - INTERVAL '{$day}' DAY) " .
"AND {$this->getMetricPointsTable()}.created_at <= DATE(NOW()) " .
"GROUP BY DATE({$this->getMetricPointsTable()}.created_at) " .
"ORDER BY DATE({$this->getMetricPointsTable()}.created_at)", [
'metricId' => $metric->id,
]);

Expand Down
24 changes: 21 additions & 3 deletions app/Repositories/Metric/SqliteRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,14 @@ class SqliteRepository extends AbstractMetricRepository implements MetricInterfa
public function getPointsSinceMinutes(Metric $metric, $minutes)
{
$queryType = $this->getQueryType($metric);
$points = DB::select("SELECT strftime('%H:%M', {$this->getMetricPointsTable()}.`created_at`) AS `key`, {$queryType} FROM {$this->getMetricsTable()} INNER JOIN {$this->getMetricPointsTable()} ON {$this->getMetricsTable()}.id = {$this->getMetricPointsTable()}.metric_id WHERE {$this->getMetricsTable()}.id = :metricId AND {$this->getMetricPointsTable()}.`created_at` >= datetime('now', '-{$minutes} minutes') GROUP BY strftime('%H', {$this->getMetricPointsTable()}.`created_at`), strftime('%M', {$this->getMetricPointsTable()}.`created_at`) ORDER BY {$this->getMetricPointsTable()}.`created_at`", [
$points = DB::select("SELECT strftime('%Y-%m-%d %H:%M', {$this->getMetricPointsTable()}.`created_at`) AS `key`, {$queryType} " .
"FROM {$this->getMetricsTable()} " .
"INNER JOIN {$this->getMetricPointsTable()} ON {$this->getMetricsTable()}.id = {$this->getMetricPointsTable()}.metric_id " .
"WHERE {$this->getMetricsTable()}.id = :metricId " .
"AND {$this->getMetricPointsTable()}.`created_at` >= datetime('now', '-{$minutes} minutes') " .
"AND {$this->getMetricPointsTable()}.`created_at` <= datetime('now') " .
"GROUP BY strftime('%H', {$this->getMetricPointsTable()}.`created_at`), strftime('%M', {$this->getMetricPointsTable()}.`created_at`) " .
"ORDER BY {$this->getMetricPointsTable()}.`created_at`", [
'metricId' => $metric->id,
]);

Expand All @@ -51,7 +58,12 @@ public function getPointsSinceMinutes(Metric $metric, $minutes)
public function getPointsSinceHour(Metric $metric, $hour)
{
$queryType = $this->getQueryType($metric);
$points = DB::select("SELECT strftime('%H:00', {$this->getMetricPointsTable()}.`created_at`) AS `key`, {$queryType} FROM {$this->getMetricsTable()} INNER JOIN {$this->getMetricPointsTable()} ON {$this->getMetricsTable()}.id = {$this->getMetricPointsTable()}.metric_id WHERE {$this->getMetricsTable()}.id = :metricId AND {$this->getMetricPointsTable()}.`created_at` >= datetime('now', '-{$hour} hours') GROUP BY strftime('%H', {$this->getMetricPointsTable()}.`created_at`) ORDER BY {$this->getMetricPointsTable()}.`created_at`", [
$points = DB::select("SELECT strftime('%Y-%m-%d %H:00', {$this->getMetricPointsTable()}.`created_at`) AS `key`, {$queryType} " .
"FROM {$this->getMetricsTable()} INNER JOIN {$this->getMetricPointsTable()} ON {$this->getMetricsTable()}.id = {$this->getMetricPointsTable()}.metric_id " .
"WHERE {$this->getMetricsTable()}.id = :metricId " .
"AND {$this->getMetricPointsTable()}.`created_at` >= datetime('now', '-{$hour} hours') " .
"AND {$this->getMetricPointsTable()}.`created_at` <= datetime('now') " .
"GROUP BY strftime('%H', {$this->getMetricPointsTable()}.`created_at`) ORDER BY {$this->getMetricPointsTable()}.`created_at`", [
'metricId' => $metric->id,
]);

Expand All @@ -69,7 +81,13 @@ public function getPointsSinceHour(Metric $metric, $hour)
public function getPointsSinceDay(Metric $metric, $day)
{
$queryType = $this->getQueryType($metric);
$points = DB::select("SELECT strftime('%Y-%m-%d', {$this->getMetricPointsTable()}.`created_at`) AS `key`, {$queryType} FROM {$this->getMetricsTable()} INNER JOIN {$this->getMetricPointsTable()} ON {$this->getMetricsTable()}.id = {$this->getMetricPointsTable()}.metric_id WHERE {$this->getMetricsTable()}.id = :metricId AND {$this->getMetricPointsTable()}.`created_at` >= datetime('now', '-{$day} days') GROUP BY DATE({$this->getMetricPointsTable()}.`created_at`) ORDER BY {$this->getMetricPointsTable()}.`created_at`", [
$points = DB::select("SELECT strftime('%Y-%m-%d', {$this->getMetricPointsTable()}.`created_at`) AS `key`, {$queryType} " .
"FROM {$this->getMetricsTable()} INNER JOIN {$this->getMetricPointsTable()} ON {$this->getMetricsTable()}.id = {$this->getMetricPointsTable()}.metric_id " .
"WHERE {$this->getMetricsTable()}.id = :metricId " .
"AND {$this->getMetricPointsTable()}.`created_at` >= datetime('now', '-{$day} days') " .
"AND {$this->getMetricPointsTable()}.`created_at` <= datetime('now') " .
"GROUP BY DATE({$this->getMetricPointsTable()}.`created_at`) " .
"ORDER BY {$this->getMetricPointsTable()}.`created_at`", [
'metricId' => $metric->id,
]);

Expand Down
36 changes: 18 additions & 18 deletions public/dist/js/all.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion public/dist/js/app.js

Large diffs are not rendered by default.

31 changes: 22 additions & 9 deletions resources/assets/js/components/status-page/Metric.vue
Original file line number Diff line number Diff line change
Expand Up @@ -116,11 +116,25 @@ module.exports = {
if (this.chart !== null) {
this.chart.destroy()
}
//Used in tooltip callback where this.metric is not the same.
var metric = this.metric;
/*
* Datetimes are used as keys instead of just time in order to
* improve ordering of labels in "Last 12 hours", so we cut the
* labels.
* This cutting is done only if there is an hour in the string, so
* if the view by day is set it doesn't fail.
*/
var data_keys = _.keys(this.data);
if (0 < data_keys.length && data_keys[0].length > 10) {
for (var i = 0; i < data_keys.length; i++) {
data_keys[i] = data_keys[i].substr(11);
}
}
this.chart = new Chart(this.context, {
type: 'line',
data: {
labels: _.keys(this.data),
labels: data_keys,
datasets: [{
data: _.values(this.data),
// backgroundColor: "{{ $theme_metrics }}",
Expand Down Expand Up @@ -164,15 +178,14 @@ module.exports = {
}
}]
},
},
tooltips: {
callbacks: {
label: function(tooltipItem, data) {
return tooltipItem.yLabel + ' ' + result.data.metric.suffix
tooltips: {
callbacks: {
label: function(tooltipItem, data) {
return tooltipItem.yLabel + ' ' + metric.suffix;
}
}
}
}
})
}})
}
}
}
Expand Down

0 comments on commit 2783824

Please sign in to comment.