diff --git a/userspace/snmpd/WR-SWITCH-MIB.txt b/userspace/snmpd/WR-SWITCH-MIB.txt index 596e72bc83a7eebad05b5603f80cfbe58165494e..53424b90c6c69e39444b76de4992668d9e9d28d1 100644 --- a/userspace/snmpd/WR-SWITCH-MIB.txt +++ b/userspace/snmpd/WR-SWITCH-MIB.txt @@ -188,6 +188,21 @@ wrsMemoryFreeLow OBJECT-TYPE Warning - more than 50% memory used" ::= { wrsOSStatusGroup 3 } +wrsCpuLoadHigh OBJECT-TYPE + SYNTAX INTEGER { + na(0), + ok(1), + error(2), + warning(3) + } + MAX-ACCESS read-only + STATUS current + DESCRIPTION + "Status of CPU load. Based on averag load in group wrsCpuLoad. + Error - average CPU load is more than 3 for 1min, 2 for 5min and 1.5 for 15min + Warning - average CPU load is more than 2 for 1min, 1.5 for 5min and 1 for 15min" + ::= { wrsOSStatusGroup 4 } + -- wrsTimingStatusGroup (.6.2.2) wrsTimingStatusGroup OBJECT IDENTIFIER ::= { wrsDetailedStatusesGroup 2 } diff --git a/userspace/snmpd/wrsOSStatusGroup.c b/userspace/snmpd/wrsOSStatusGroup.c index 03dbe1060dd90a73c5ae539e60800cdf42fa8c98..33ad68c2269d8a1a41a88e171ee96f3e6510a82d 100644 --- a/userspace/snmpd/wrsOSStatusGroup.c +++ b/userspace/snmpd/wrsOSStatusGroup.c @@ -2,15 +2,25 @@ #include "wrsBootStatusGroup.h" #include "wrsTemperatureGroup.h" #include "wrsMemoryGroup.h" +#include "wrsCpuLoadGroup.h" #include "wrsOSStatusGroup.h" #define WRSMEMORYFREELOW_TRESHOLD_ERROR 80 #define WRSMEMORYFREELOW_TRESHOLD_WARNING 50 +/* To avoid float values for cpu load, they are multiplied by 100 */ +#define WRSCPULOAD_1MIN_WARNING 200 +#define WRSCPULOAD_5MIN_WARNING 150 +#define WRSCPULOAD_15MIN_WARNING 100 +#define WRSCPULOAD_1MIN_ERROR 300 +#define WRSCPULOAD_5MIN_ERROR 200 +#define WRSCPULOAD_15MIN_ERROR 150 + static struct pickinfo wrsOSStatus_pickinfo[] = { FIELD(wrsOSStatus_s, ASN_INTEGER, wrsBootSuccessful), FIELD(wrsOSStatus_s, ASN_INTEGER, wrsTemperatureWarning), FIELD(wrsOSStatus_s, ASN_INTEGER, wrsMemoryFreeLow), + FIELD(wrsOSStatus_s, ASN_INTEGER, wrsCpuLoadHigh), }; struct wrsOSStatus_s wrsOSStatus_s; @@ -21,16 +31,20 @@ time_t wrsOSStatus_data_fill(void) time_t time_temp; /* time when temperature data was updated */ time_t time_boot; /* time when boot data was updated */ time_t time_free_mem; /* time when free memory data was updated */ + time_t time_cpu_load; /* time when cpu load data was updated */ struct wrsBootStatus_s *b; struct wrsMemory_s *f; + struct wrsCpuLoad_s *c; time_boot = wrsBootStatus_data_fill(); time_temp = wrsTemperature_data_fill(); time_free_mem = wrsMemory_data_fill(); + time_cpu_load = wrsCpuLoad_data_fill(); if (time_boot <= time_update && time_temp <= time_update - && time_free_mem <= time_update) { + && time_free_mem <= time_update + && time_cpu_load <= time_update) { /* cache not updated, return last update time */ return time_update; } @@ -156,6 +170,26 @@ time_t wrsOSStatus_data_fill(void) wrsOSStatus_s.wrsMemoryFreeLow = WRS_MEMORY_FREE_LOW_OK; } + /*********************************************************************\ + |************************** wrsCpuLoadHigh **************************| + \*********************************************************************/ + /* Check CPU load */ + c = &wrsCpuLoad_s; + if (c->wrsCPULoadAvg1min > WRSCPULOAD_1MIN_ERROR + || c->wrsCPULoadAvg5min > WRSCPULOAD_5MIN_ERROR + || c->wrsCPULoadAvg15min > WRSCPULOAD_15MIN_ERROR) { + /* CPU load above error threshold level */ + wrsOSStatus_s.wrsCpuLoadHigh = WRS_CPU_LOAD_HIGH_ERROR; + } else if (c->wrsCPULoadAvg1min > WRSCPULOAD_1MIN_WARNING + || c->wrsCPULoadAvg5min > WRSCPULOAD_5MIN_WARNING + || c->wrsCPULoadAvg15min > WRSCPULOAD_15MIN_WARNING) { + /* CPU load above warning threshold level */ + wrsOSStatus_s.wrsCpuLoadHigh = WRS_CPU_LOAD_HIGH_WARNING; + } else { + /* CPU load below threshold levels */ + wrsOSStatus_s.wrsCpuLoadHigh = WRS_CPU_LOAD_HIGH_OK; + } + /* there was an update, return current time */ return time_update; } diff --git a/userspace/snmpd/wrsOSStatusGroup.h b/userspace/snmpd/wrsOSStatusGroup.h index c40734115d43eec1388b17dd9d951e6536d1323f..3301415671adfae0810e83a7c5ae417ca12609b3 100644 --- a/userspace/snmpd/wrsOSStatusGroup.h +++ b/userspace/snmpd/wrsOSStatusGroup.h @@ -22,10 +22,15 @@ * equal to 0 (NA),shouldn't happen in * normal operation */ +#define WRS_CPU_LOAD_HIGH_OK 1 /* ok */ +#define WRS_CPU_LOAD_HIGH_ERROR 2 /* error */ +#define WRS_CPU_LOAD_HIGH_WARNING 3 /* warning */ + struct wrsOSStatus_s { int wrsBootSuccessful; int wrsTemperatureWarning; int wrsMemoryFreeLow; + int wrsCpuLoadHigh; }; extern struct wrsOSStatus_s wrsOSStatus_s;