66 lines
2.0 KiB
PHP
66 lines
2.0 KiB
PHP
<?php
|
|
|
|
namespace App\Models;
|
|
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
|
use Illuminate\Support\Carbon;
|
|
use Illuminate\Support\Collection;
|
|
|
|
/**
|
|
* A day in the life of one instance: how full it was, and what it moved.
|
|
*
|
|
* Read by the customer panel to draw the storage ring and the transfer trend.
|
|
* Written by CollectInstanceTraffic, which already visits every active
|
|
* instance — a second scheduler entry hitting the same Proxmox API would only
|
|
* double the load and the failure modes.
|
|
*/
|
|
class InstanceMetric extends Model
|
|
{
|
|
protected $fillable = ['instance_id', 'day', 'disk_used_bytes', 'disk_total_bytes', 'rx_bytes', 'tx_bytes'];
|
|
|
|
protected function casts(): array
|
|
{
|
|
return [
|
|
'day' => 'date',
|
|
'disk_used_bytes' => 'integer',
|
|
'disk_total_bytes' => 'integer',
|
|
'rx_bytes' => 'integer',
|
|
'tx_bytes' => 'integer',
|
|
];
|
|
}
|
|
|
|
public function instance(): BelongsTo
|
|
{
|
|
return $this->belongsTo(Instance::class);
|
|
}
|
|
|
|
/**
|
|
* The last $days days, oldest first, with gaps left as gaps.
|
|
*
|
|
* A missing day is not a zero. Filling it would draw a cliff into the chart
|
|
* on every day the sampler could not reach the host, and the customer would
|
|
* read an outage that never happened.
|
|
*
|
|
* @return Collection<int, self>
|
|
*/
|
|
public static function series(Instance $instance, int $days = 14): Collection
|
|
{
|
|
return self::query()
|
|
->where('instance_id', $instance->id)
|
|
->where('day', '>=', Carbon::today()->subDays($days - 1))
|
|
->orderBy('day')
|
|
->get();
|
|
}
|
|
|
|
/** The most recent day that carries a disk reading, or null. */
|
|
public static function latestDisk(Instance $instance): ?self
|
|
{
|
|
return self::query()
|
|
->where('instance_id', $instance->id)
|
|
->whereNotNull('disk_used_bytes')
|
|
->orderByDesc('day')
|
|
->first();
|
|
}
|
|
}
|