From 0dc151a72ce495d3d94704efba609505e465292b Mon Sep 17 00:00:00 2001 From: Niels Baggesen Date: Mon, 13 Jun 2016 16:50:08 +0200 Subject: [PATCH] UCD-SNMP-MIB: Add 64-bit memory objects for large servers. --- agent/mibgroup/ucd-snmp/memory.c | 100 ++++++++++++++++++++++++-- agent/mibgroup/ucd-snmp/memory.h | 9 +++ mibs/UCD-SNMP-MIB.txt | 116 ++++++++++++++++++++++++++++++- 3 files changed, 220 insertions(+), 5 deletions(-) diff --git a/agent/mibgroup/ucd-snmp/memory.c b/agent/mibgroup/ucd-snmp/memory.c index 742186f3a..a7f060a50 100644 --- a/agent/mibgroup/ucd-snmp/memory.c +++ b/agent/mibgroup/ucd-snmp/memory.c @@ -26,7 +26,7 @@ init_memory(void) netsnmp_create_handler_registration("memory", handle_memory, memory_oid, OID_LENGTH(memory_oid), HANDLER_CAN_RONLY), - 1, 17); + 1, 26); netsnmp_register_scalar( netsnmp_create_handler_registration("memSwapError", handle_memory, memSwapError_oid, OID_LENGTH(memSwapError_oid), @@ -59,7 +59,9 @@ handle_memory(netsnmp_mib_handler *handler, netsnmp_request_info *requests) { netsnmp_memory_info *mem_info; - int val; + unsigned long val; + struct counter64 c64; + int type = ASN_INTEGER; char buf[1024]; /* @@ -184,6 +186,92 @@ handle_memory(netsnmp_mib_handler *handler, val = (mem_info->size - mem_info->free); /* cached */ val *= (mem_info->units/1024); break; + case MEMORY_SWAP_TOTAL_X: + type = ASN_COUNTER64; + mem_info = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_SWAP, 0 ); + if (!mem_info) + goto NOSUCH; + val = mem_info->size; + val *= (mem_info->units/1024); + c64.low = val & 0xFFFFFFFF; + c64.high = val >>32; + break; + case MEMORY_SWAP_AVAIL_X: + type = ASN_COUNTER64; + mem_info = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_SWAP, 0 ); + if (!mem_info) + goto NOSUCH; + val = mem_info->free; + val *= (mem_info->units/1024); + c64.low = val & 0xFFFFFFFF; + c64.high = val >>32; + break; + case MEMORY_REAL_TOTAL_X: + type = ASN_COUNTER64; + mem_info = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_PHYSMEM, 0 ); + if (!mem_info) + goto NOSUCH; + val = mem_info->size; + val *= (mem_info->units/1024); + c64.low = val & 0xFFFFFFFF; + c64.high = val >>32; + break; + case MEMORY_REAL_AVAIL_X: + type = ASN_COUNTER64; + mem_info = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_PHYSMEM, 0 ); + if (!mem_info) + goto NOSUCH; + val = mem_info->free; + val *= (mem_info->units/1024); + c64.low = val & 0xFFFFFFFF; + c64.high = val >>32; + break; + case MEMORY_SWAP_MIN_X: + type = ASN_COUNTER64; + val = minimum_swap; + c64.low = val & 0xFFFFFFFF; + c64.high = val >>32; + break; + case MEMORY_FREE_X: + type = ASN_COUNTER64; + mem_info = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_VIRTMEM, 0 ); + if (!mem_info) + goto NOSUCH; + val = mem_info->free; + val *= (mem_info->units/1024); + c64.low = val & 0xFFFFFFFF; + c64.high = val >>32; + break; + case MEMORY_SHARED_X: + type = ASN_COUNTER64; + mem_info = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_SHARED, 0 ); + if (!mem_info) + goto NOSUCH; + val = mem_info->size; + val *= (mem_info->units/1024); + c64.low = val & 0xFFFFFFFF; + c64.high = val >>32; + break; + case MEMORY_BUFFER_X: + type = ASN_COUNTER64; + mem_info = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_MBUF, 0 ); + if (!mem_info) + goto NOSUCH; + val = mem_info->size - mem_info->free; + val *= (mem_info->units/1024); + c64.low = val & 0xFFFFFFFF; + c64.high = val >>32; + break; + case MEMORY_CACHED_X: + type = ASN_COUNTER64; + mem_info = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_CACHED, 0 ); + if (!mem_info) + goto NOSUCH; + val = mem_info->size - mem_info->free; + val *= (mem_info->units/1024); + c64.low = val & 0xFFFFFFFF; + c64.high = val >>32; + break; case MEMORY_SWAP_ERROR: mem_info = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_SWAP, 0 ); if (!mem_info) @@ -213,8 +301,12 @@ handle_memory(netsnmp_mib_handler *handler, * All non-integer objects (and errors) have already been * processed. So return the integer value. */ - snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER, - (u_char *)&val, sizeof(val)); + if (type == ASN_INTEGER) + snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER, + (u_char *)&val, sizeof(val)); + else + snmp_set_var_typed_value(requests->requestvb, ASN_COUNTER64, + (u_char *)&c64, sizeof(c64)); break; default: diff --git a/agent/mibgroup/ucd-snmp/memory.h b/agent/mibgroup/ucd-snmp/memory.h index a44d82e51..ded214022 100644 --- a/agent/mibgroup/ucd-snmp/memory.h +++ b/agent/mibgroup/ucd-snmp/memory.h @@ -32,6 +32,15 @@ Netsnmp_Node_Handler handle_memory; #define MEMORY_CACHED 15 #define MEMORY_STXT_USED 16 #define MEMORY_RTXT_USED 17 +#define MEMORY_SWAP_TOTAL_X 18 +#define MEMORY_SWAP_AVAIL_X 19 +#define MEMORY_REAL_TOTAL_X 20 +#define MEMORY_REAL_AVAIL_X 21 +#define MEMORY_FREE_X 22 +#define MEMORY_SWAP_MIN_X 23 +#define MEMORY_SHARED_X 24 +#define MEMORY_BUFFER_X 25 +#define MEMORY_CACHED_X 26 #define MEMORY_SWAP_ERROR 100 #define MEMORY_SWAP_ERRMSG 101 #endif /* MEMORY_H */ diff --git a/mibs/UCD-SNMP-MIB.txt b/mibs/UCD-SNMP-MIB.txt index e8acc8c0d..cde67feb5 100644 --- a/mibs/UCD-SNMP-MIB.txt +++ b/mibs/UCD-SNMP-MIB.txt @@ -33,11 +33,14 @@ IMPORTS Integer32, Opaque, enterprises, Counter32, Unsigned32 FROM SNMPv2-SMI + CounterBasedGauge64 + FROM HCNUM-TC + TEXTUAL-CONVENTION, DisplayString, TruthValue FROM SNMPv2-TC; ucdavis MODULE-IDENTITY - LAST-UPDATED "200901190000Z" + LAST-UPDATED "201606100000Z" ORGANIZATION "University of California, Davis" CONTACT-INFO "This mib is no longer being maintained by the University of @@ -55,6 +58,10 @@ ucdavis MODULE-IDENTITY DESCRIPTION "This file defines the private UCD SNMP MIB extensions." + REVISION "201606100000Z" + DESCRIPTION + "New 64-bit memory objects" + REVISION "201105140000Z" DESCRIPTION "New objects for monitoring CPU Steal, Guest and Nice values" @@ -629,6 +636,113 @@ memUsedRealTXT OBJECT-TYPE pages from other uses of physical memory." ::= { memory 17 } +memTotalSwapX OBJECT-TYPE + SYNTAX CounterBasedGauge64 + UNITS "kB" + MAX-ACCESS read-only + STATUS current + DESCRIPTION + "The total amount of swap space configured for this host." + ::= { memory 18 } + +memAvailSwapX OBJECT-TYPE + SYNTAX CounterBasedGauge64 + UNITS "kB" + MAX-ACCESS read-only + STATUS current + DESCRIPTION + "The amount of swap space currently unused or available." + ::= { memory 19 } + +memTotalRealX OBJECT-TYPE + SYNTAX CounterBasedGauge64 + UNITS "kB" + MAX-ACCESS read-only + STATUS current + DESCRIPTION + "The total amount of real/physical memory installed + on this host." + ::= { memory 20 } + +memAvailRealX OBJECT-TYPE + SYNTAX CounterBasedGauge64 + UNITS "kB" + MAX-ACCESS read-only + STATUS current + DESCRIPTION + "The amount of real/physical memory currently unused + or available." + ::= { memory 21 } + + +memTotalFreeX OBJECT-TYPE + SYNTAX CounterBasedGauge64 + UNITS "kB" + MAX-ACCESS read-only + STATUS current + DESCRIPTION + "The total amount of memory free or available for use on + this host. This value typically covers both real memory + and swap space or virtual memory." + ::= { memory 22 } + +memMinimumSwapX OBJECT-TYPE + SYNTAX CounterBasedGauge64 + UNITS "kB" + MAX-ACCESS read-only + STATUS current + DESCRIPTION + "The minimum amount of swap space expected to be kept + free or available during normal operation of this host. + + If this value (as reported by 'memAvailSwap(4)') falls + below the specified level, then 'memSwapError(100)' will + be set to 1 and an error message made available via + 'memSwapErrorMsg(101)'." + ::= { memory 23 } + +memSharedX OBJECT-TYPE + SYNTAX CounterBasedGauge64 + UNITS "kB" + MAX-ACCESS read-only + STATUS current + DESCRIPTION + "The total amount of real or virtual memory currently + allocated for use as shared memory. + + This object will not be implemented on hosts where the + underlying operating system does not explicitly identify + memory as specifically reserved for this purpose." + ::= { memory 24 } + +memBufferX OBJECT-TYPE + SYNTAX CounterBasedGauge64 + UNITS "kB" + MAX-ACCESS read-only + STATUS current + DESCRIPTION + "The total amount of real or virtual memory currently + allocated for use as memory buffers. + + This object will not be implemented on hosts where the + underlying operating system does not explicitly identify + memory as specifically reserved for this purpose." + ::= { memory 25 } + +memCachedX OBJECT-TYPE + SYNTAX CounterBasedGauge64 + UNITS "kB" + MAX-ACCESS read-only + STATUS current + DESCRIPTION + "The total amount of real or virtual memory currently + allocated for use as cached memory. + + This object will not be implemented on hosts where the + underlying operating system does not explicitly identify + memory as specifically reserved for this purpose." + ::= { memory 26 } + memSwapError OBJECT-TYPE SYNTAX UCDErrorFlag MAX-ACCESS read-only