From 75bd14267e7a5507e0d58b9945dbb24e5d831af8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 20 Jan 2023 14:24:20 +0100 Subject: [PATCH] check-health: monitor CPU load MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ---- ✂️ ---- 🧮️📈️ Health warning: CPU load The average CPU load on MikroTik is at 76%! ---- ✂️ ---- 🧮️📉️ Health recovery: CPU load The average CPU load on MikroTik decreased to 64%. ---- ✂️ ---- --- check-health | 16 ++++++++++++++ .../notification-01-cpu-load-high.avif | Bin 0 -> 6066 bytes .../notification-02-cpu-load-ok.avif | Bin 0 -> 6378 bytes ...tage.avif => notification-03-voltage.avif} | Bin ... => notification-04-temperature-high.avif} | Bin ...if => notification-05-temperature-ok.avif} | Bin ...ail.avif => notification-06-psu-fail.avif} | Bin ...su-ok.avif => notification-07-psu-ok.avif} | Bin doc/check-health.md | 20 ++++++++++++------ global-functions | 1 + 10 files changed, 30 insertions(+), 7 deletions(-) create mode 100644 doc/check-health.d/notification-01-cpu-load-high.avif create mode 100644 doc/check-health.d/notification-02-cpu-load-ok.avif rename doc/check-health.d/{notification-01-voltage.avif => notification-03-voltage.avif} (100%) rename doc/check-health.d/{notification-02-temperature-high.avif => notification-04-temperature-high.avif} (100%) rename doc/check-health.d/{notification-03-temperature-ok.avif => notification-05-temperature-ok.avif} (100%) rename doc/check-health.d/{notification-04-psu-fail.avif => notification-06-psu-fail.avif} (100%) rename doc/check-health.d/{notification-05-psu-ok.avif => notification-07-psu-ok.avif} (100%) diff --git a/check-health b/check-health index e754d69..3957ad1 100644 --- a/check-health +++ b/check-health @@ -10,6 +10,8 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:global CheckHealthCPULoad; +:global CheckHealthCPULoadNotified; :global CheckHealthLast; :global CheckHealthTemperature; :global CheckHealthTemperatureDeviation; @@ -43,6 +45,20 @@ $ScriptLock $0; +:set CheckHealthCPULoad (($CheckHealthCPULoad * 4 + [ /system/resource/get cpu-load ] * 10) / 5); +:if ($CheckHealthCPULoad > 750 && $CheckHealthCPULoadNotified != true) do={ + $SendNotification2 ({ origin=$0; \ + subject=([ $SymbolForNotification "abacus,chart-increasing" ] . "Health warning: CPU load"); \ + message=("The average CPU load on " . $Identity . " is at " . ($CheckHealthCPULoad / 10) . "%!") }); + :set CheckHealthCPULoadNotified true; +} +:if ($CheckHealthCPULoad < 650 && $CheckHealthCPULoadNotified = true) do={ + $SendNotification2 ({ origin=$0; \ + subject=([ $SymbolForNotification "abacus,chart-decreasing" ] . "Health recovery: CPU load"); \ + message=("The average CPU load on " . $Identity . " decreased to " . ($CheckHealthCPULoad / 10) . "%.") }); + :set CheckHealthCPULoadNotified false; +} + :foreach Voltage in=[ /system/health/find where type="V" ] do={ :local Name [ /system/health/get $Voltage name ]; :local Value [ /system/health/get $Voltage value ]; diff --git a/doc/check-health.d/notification-01-cpu-load-high.avif b/doc/check-health.d/notification-01-cpu-load-high.avif new file mode 100644 index 0000000000000000000000000000000000000000..3c1a4685af3340f8bb446b4efd39b718f9198d19 GIT binary patch literal 6066 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 literal 0 HcmV?d00001 diff --git a/doc/check-health.d/notification-02-cpu-load-ok.avif b/doc/check-health.d/notification-02-cpu-load-ok.avif new file mode 100644 index 0000000000000000000000000000000000000000..4f12b700e27c3bfa533d6b1c38a8f00dd8be7899 GIT binary patch literal 6378 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