machine-status: Make new runner status prettier

- Remove bottom margin
- Properly format memory in human format
- Calculate free memory
- Format the load with 2 digits after comma
- Lpad pressure percentages
- Use a macro to render pressure
- Score -> Scheduling Score
- More spacing in the load
- Add IRQ pressure
This commit is contained in:
Janne Heß
2025-08-01 11:25:14 +02:00
committed by ahuston-0
parent ea2024a9bc
commit bfd2a4c4f9
3 changed files with 30 additions and 22 deletions

View File

@@ -9,6 +9,7 @@ use Hydra::Helper::CatalystUtils;
use Hydra::View::TT;
use Nix::Store;
use Nix::Config;
use Number::Bytes::Human qw(format_bytes);
use Encode;
use File::Basename;
use JSON::MaybeXS;
@@ -215,6 +216,19 @@ sub machines :Local Args(0) {
"where busy != 0 order by machine, stepnr",
{ Slice => {} });
$c->stash->{template} = 'machine-status.tt';
$c->stash->{human_bytes} = sub {
my ($bytes) = @_;
return format_bytes($bytes, si => 1);
};
$c->stash->{pretty_load} = sub {
my ($load) = @_;
return sprintf('%.2f', $load);
};
$c->stash->{pretty_percent} = sub {
my ($percent) = @_;
my $ret = sprintf('%.2f', $percent);
return (' ' x (6 - length($ret))) . $ret;
};
$self->status_ok($c, entity => $c->stash->{machines});
}

View File

@@ -25,36 +25,29 @@
</span>
&nbsp;
[% WRAPPER makePopover title="Details" classes="btn-secondary btn-sm" %]
<ul class="list-unstyled">
<ul class="list-unstyled mb-0">
<li><b>System types:&nbsp;</b>[% comma=0; FOREACH system IN m.value.systemTypes %][% IF comma; %], [% ELSE; comma = 1; END %]<tt>[% system %]</tt>[% END %]</li>
<li><b>Supported Features:&nbsp;</b>[% comma=0; FOREACH feat IN m.value.supportedFeatures %][% IF comma; %], [% ELSE; comma = 1; END %]<tt>[% feat %]</tt>[% END %]</li>
<li><b>Mandatory Features:&nbsp;</b>[% comma=0; FOREACH feat IN m.value.mandatoryFeatures %][% IF comma; %], [% ELSE; comma = 1; END %]<tt>[% feat %]</tt>[% END %]</li>
<li><b>Capacity:&nbsp;</b>[% INCLUDE renderYesNo value=m.value.hasCapacity %]&nbsp;<b>Static:&nbsp;</b>[% INCLUDE renderYesNo value=m.value.hasStaticCapacity %]&nbsp;<b>Dynamic:&nbsp;</b>[% INCLUDE renderYesNo value=m.value.hasDynamicCapacity %]</li>
<li><b>Score:&nbsp;</b>[% m.value.score %]</li>
<li><b>Load:&nbsp;</b><tt>[% m.value.stats.load1 %]</tt>&nbsp;&nbsp;<tt>[% m.value.stats.load5 %]</tt>&nbsp;&nbsp;<tt>[% m.value.stats.load15 %]</tt></li>
<li><b>Memory:&nbsp;</b><tt>[% mibs(m.value.stats.memUsage / (1024 * 1024)) %] MiB</tt> bytes of <tt>[% mibs(m.value.memTotal / (1024 * 1024)) %] MiB</tt> bytes used</li>
<li><b>Scheduling Score:&nbsp;</b>[% m.value.score %]</li>
<li><b>Load:&nbsp;</b><tt>[% pretty_load(m.value.stats.load1) %]</tt>&nbsp;&nbsp;&nbsp;<tt>[% pretty_load(m.value.stats.load5) %]</tt>&nbsp;&nbsp;&nbsp;<tt>[% pretty_load(m.value.stats.load15) %]</tt></li>
<li><b>Memory:&nbsp;</b><tt>[% human_bytes(m.value.stats.memUsage) %]</tt> of <tt>[% human_bytes(m.value.memTotal) %]</tt> used (<tt>[% human_bytes(m.value.memTotal - m.value.stats.memUsage) %]</tt> free)</li>
[% pressure = m.value.stats.pressure %]
[% MACRO render_pressure(title, pressure) BLOCK %]
[% IF pressure %]
<tr><td><b>[% title %]:</b></td><td><tt>[% pretty_percent(pressure.avg10) %]%</tt></td><td><td><tt>[% pretty_percent(pressure.avg60) %]%</tt></td><td><td><tt>[% pretty_percent(pressure.avg300) %]%</tt></td><td>
[% END %]
[% END %]
[% IF pressure %]
<li><b>Pressure:&nbsp;</b>
<table class="pressureTable">
[% IF pressure.cpuSome %]
<tr><td><b>Some CPU:</b></td><td><tt>[% pressure.cpuSome.avg10 %]%</tt></td><td><td><tt>[% pressure.cpuSome.avg60 %]%</tt></td><td><td><tt>[% pressure.cpuSome.avg300 %]%</tt></td><td>
[% END %]
[% IF pressure.ioSome %]
<tr><td><b>Some IO:</b></td><td><tt>[% pressure.ioSome.avg10 %]%</tt></td><td><td><tt>[% pressure.ioSome.avg60 %]%</tt></td><td><td><tt>[% pressure.ioSome.avg300 %]%</tt></td><td>
[% END %]
[% IF pressure.ioFull %]
<tr><td><b>Full IO:</b></td><td><tt>[% pressure.ioFull.avg10 %]%</tt></td><td><td><tt>[% pressure.ioFull.avg60 %]%</tt></td><td><td><tt>[% pressure.ioFull.avg300 %]%</tt></td><td>
[% END %]
[% IF pressure.irqFull %]
<tr><td><b>Full IRQ:</b></td><td><tt>[% pressure.irqFull.avg10 %]%</tt></td><td><td><tt>[% pressure.irqFull.avg60 %]%</tt></td><td><td><tt>[% pressure.irqFull.avg300 %]%</tt></td><td>
[% END %]
[% IF pressure.memSome %]
<tr><td><b>Some Memory:</b></td><td><tt>[% pressure.memSome.avg10 %]%</tt></td><td><td><tt>[% pressure.memSome.avg60 %]%</tt></td><td><td><tt>[% pressure.memSome.avg300 %]%</tt></td><td>
[% END %]
[% IF pressure.memFull %]
<tr><td><b>Full Memory:</b></td><td><tt>[% pressure.memFull.avg10 %]%</tt></td><td><td><tt>[% pressure.memFull.avg60 %]%</tt></td><td><td><tt>[% pressure.memFull.avg300 %]%</tt></td><td>
[% END %]
[% render_pressure('Some CPU', pressure.cpuSome) %]
[% render_pressure('Some IO', pressure.ioSome) %]
[% render_pressure('Full IO', pressure.ioFull) %]
[% render_pressure('Full IRQ', pressure.irqFull) %]
[% render_pressure('Some Memory', pressure.memSome) %]
[% render_pressure('Full Memory', pressure.memFull) %]
</table>
</li>
[% END %]