diff --git a/app/database/migrations/2015_01_05_202826_CreateMetricsTable.php b/app/database/migrations/2015_01_05_202826_CreateMetricsTable.php
index 9d784dfe..ad847728 100644
--- a/app/database/migrations/2015_01_05_202826_CreateMetricsTable.php
+++ b/app/database/migrations/2015_01_05_202826_CreateMetricsTable.php
@@ -19,6 +19,7 @@ class CreateMetricsTable extends Migration
$table->string('suffix');
$table->text('description');
$table->decimal('default_value', 10, 3);
+ $table->tinyInteger('calc_type');
$table->boolean('display_chart')->default(1);
$table->timestamps();
diff --git a/app/lang/de/forms.php b/app/lang/de/forms.php
index 11f33b3f..2f597b39 100644
--- a/app/lang/de/forms.php
+++ b/app/lang/de/forms.php
@@ -58,6 +58,9 @@ return [
'description' => 'Description',
'description-help' => 'You may also use Markdown.',
'display-chart' => 'Display chart on status page?',
+ 'calc_type' => 'Calculation of metrics',
+ 'type_sum' => 'Sum',
+ 'type_avg' => 'Average',
'points' => [
'value' => 'Value',
diff --git a/app/lang/en/forms.php b/app/lang/en/forms.php
index d2f79ee2..33b5bc8b 100644
--- a/app/lang/en/forms.php
+++ b/app/lang/en/forms.php
@@ -61,6 +61,9 @@ return [
'description-help' => 'You may also use Markdown.',
'display-chart' => 'Display chart on status page?',
'default-value' => 'Default value',
+ 'calc_type' => 'Calculation of metrics',
+ 'type_sum' => 'Sum',
+ 'type_avg' => 'Average',
'points' => [
'value' => 'Value',
diff --git a/app/lang/es/forms.php b/app/lang/es/forms.php
index 679d4acc..328dace9 100644
--- a/app/lang/es/forms.php
+++ b/app/lang/es/forms.php
@@ -59,6 +59,9 @@ return [
'description' => 'Descripción',
'description-help' => 'Puedes usar también Markdown.',
'display-chart' => '¿Vizualizar gráfica en la página de estado?',
+ 'calc_type' => 'Calculation of metrics',
+ 'type_sum' => 'Sum',
+ 'type_avg' => 'Average',
'points' => [
'value' => 'Valor',
diff --git a/app/lang/fr/forms.php b/app/lang/fr/forms.php
index ff9f2be9..ac023203 100644
--- a/app/lang/fr/forms.php
+++ b/app/lang/fr/forms.php
@@ -58,6 +58,9 @@ return [
'description' => 'Description',
'description-help' => 'You may also use Markdown.',
'display-chart' => 'Display chart on status page?',
+ 'calc_type' => 'Calculation of metrics',
+ 'type_sum' => 'Sum',
+ 'type_avg' => 'Average',
'points' => [
'value' => 'Value',
diff --git a/app/lang/pt-BR/forms.php b/app/lang/pt-BR/forms.php
index a0d783b5..f9b75a23 100755
--- a/app/lang/pt-BR/forms.php
+++ b/app/lang/pt-BR/forms.php
@@ -61,6 +61,9 @@ return [
'description-help' => '',
'display-chart' => '',
'default-value' => '',
+ 'calc_type' => 'Calculation of metrics',
+ 'type_sum' => 'Sum',
+ 'type_avg' => 'Average',
'points' => [
'value' => '',
diff --git a/app/views/dashboard/metrics/add.blade.php b/app/views/dashboard/metrics/add.blade.php
index ececbfbc..2a643292 100644
--- a/app/views/dashboard/metrics/add.blade.php
+++ b/app/views/dashboard/metrics/add.blade.php
@@ -31,6 +31,13 @@
+
+
+
+
diff --git a/app/views/dashboard/metrics/edit.blade.php b/app/views/dashboard/metrics/edit.blade.php
index b47acb1d..cb95aecb 100644
--- a/app/views/dashboard/metrics/edit.blade.php
+++ b/app/views/dashboard/metrics/edit.blade.php
@@ -31,6 +31,13 @@
+
+
+
+
diff --git a/app/views/partials/metrics.blade.php b/app/views/partials/metrics.blade.php
index c9d27a29..644fc636 100644
--- a/app/views/partials/metrics.blade.php
+++ b/app/views/partials/metrics.blade.php
@@ -31,37 +31,36 @@
@endforeach
diff --git a/src/Models/Metric.php b/src/Models/Metric.php
index 2861e86e..d84af1d3 100644
--- a/src/Models/Metric.php
+++ b/src/Models/Metric.php
@@ -24,6 +24,9 @@ class Metric extends Model implements TransformableInterface
{
use ValidatingTrait;
+ const CALC_SUM = 0;
+ const CALC_AVG = 1;
+
/**
* The model's attributes.
*
@@ -32,6 +35,8 @@ class Metric extends Model implements TransformableInterface
protected $attributes = [
'name' => '',
'display_chart' => 1,
+ 'default_value' => 0,
+ 'calc_type' => 0,
];
/**
@@ -43,7 +48,7 @@ class Metric extends Model implements TransformableInterface
'name' => 'required',
'suffix' => 'required',
'display_chart' => 'boolean',
- 'default_value' => 'numeric|required',
+ 'default_value' => 'numeric',
];
/**
@@ -51,7 +56,7 @@ class Metric extends Model implements TransformableInterface
*
* @var string[]
*/
- protected $fillable = ['name', 'suffix', 'description', 'display_chart', 'default_value'];
+ protected $fillable = ['name', 'suffix', 'description', 'display_chart', 'default_value', 'calc_type'];
/**
* Metrics contain many metric points.
@@ -76,9 +81,20 @@ class Metric extends Model implements TransformableInterface
$dateTime->sub(new DateInterval('PT'.$hour.'H'));
if (Config::get('database.default') === 'mysql') {
- $value = (int) $this->points()->whereRaw('DATE_FORMAT(created_at, "%Y%m%e%H") = '.$dateTime->format('YmdH'))->whereRaw('HOUR(created_at) = HOUR(DATE_SUB(NOW(), INTERVAL '.$hour.' HOUR))')->groupBy(DB::raw('HOUR(created_at)'))->sum('value');
+ if (! isset($this->calc_type) || $this->calc_type === self::CALC_SUM) {
+ $value = (int) $this->points()->whereRaw('DATE_FORMAT(created_at, "%Y%m%e%H") = '.$dateTime->format('YmdH'))->whereRaw('HOUR(created_at) = HOUR(DATE_SUB(NOW(), INTERVAL '.$hour.' HOUR))')->groupBy(DB::raw('HOUR(created_at)'))->sum('value');
+ } elseif ($this->calc_type === self::CALC_AVG) {
+ $value = (int) $this->points()->whereRaw('DATE_FORMAT(created_at, "%Y%m%e%H") = '.$dateTime->format('YmdH'))->whereRaw('HOUR(created_at) = HOUR(DATE_SUB(NOW(), INTERVAL '.$hour.' HOUR))')->groupBy(DB::raw('HOUR(created_at)'))->avg('value');
+ }
} else {
- $query = DB::select("select sum(metric_points.value) as aggregate FROM metrics JOIN metric_points ON metric_points.metric_id = metrics.id WHERE to_char(metric_points.created_at, 'YYYYMMDDHH') = :timestamp AND to_char(metric_points.created_at, 'H') = to_char(now() - interval '{$hour} hour', 'H') GROUP BY to_char(metric_points.created_at, 'H')", [
+ // Default metrics calculations.
+ if (! isset($this->calc_type) || $this->calc_type === self::CALC_SUM) {
+ $queryType = "sum(metric_points.value)";
+ } elseif ($this->calc_type === self::CALC_AVG) {
+ $queryType = "avg(metric_points.value)";
+ }
+
+ $query = DB::select("select {$queryType} as aggregate FROM metrics JOIN metric_points ON metric_points.metric_id = metrics.id WHERE to_char(metric_points.created_at, 'YYYYMMDDHH') = :timestamp AND to_char(metric_points.created_at, 'H') = to_char(now() - interval '{$hour} hour', 'H') GROUP BY to_char(metric_points.created_at, 'H')", [
'timestamp' => $dateTime->format('YmdH'),
]);