diff options
Diffstat (limited to 'lib/os_mon')
26 files changed, 132 insertions, 1535 deletions
diff --git a/lib/os_mon/Makefile b/lib/os_mon/Makefile index 1eff8a785a..40ce94e0c7 100644 --- a/lib/os_mon/Makefile +++ b/lib/os_mon/Makefile @@ -23,11 +23,7 @@ include $(ERL_TOP)/make/$(TARGET)/otp.mk # # Macros # -ifeq ($(findstring win32,$(TARGET)),win32) -SUB_DIRECTORIES = src c_src mibs doc/src -else -SUB_DIRECTORIES = src c_src mibs doc/src -endif +SUB_DIRECTORIES = src c_src doc/src include vsn.mk VSN = $(OS_MON_VSN) diff --git a/lib/os_mon/c_src/cpu_sup.c b/lib/os_mon/c_src/cpu_sup.c index 17ef48c26e..c96a5c9f7c 100644 --- a/lib/os_mon/c_src/cpu_sup.c +++ b/lib/os_mon/c_src/cpu_sup.c @@ -152,6 +152,8 @@ static void util_measure(unsigned int **result_vec, int *result_sz); #if defined(__sun__) static unsigned int misc_measure(char* name); +#elif defined(__linux__) +static unsigned int misc_measure(char cmd); #endif static void sendi(unsigned int data); static void sendv(unsigned int data[], int ints); @@ -231,6 +233,11 @@ int main(int argc, char** argv) { case AVG1: sendi(misc_measure("avenrun_1min")); break; case AVG5: sendi(misc_measure("avenrun_5min")); break; case AVG15: sendi(misc_measure("avenrun_15min")); break; +#elif defined(__linux__) + case NPROCS: + case AVG1: + case AVG5: + case AVG15: sendi(misc_measure(cmd)); break; #elif defined(__OpenBSD__) || (defined(__APPLE__) && defined(__MACH__)) || defined(__FreeBSD__) || defined(__DragonFly__) case NPROCS: bsd_count_procs(); break; case AVG1: bsd_loadavg(0); break; @@ -238,7 +245,7 @@ int main(int argc, char** argv) { case AVG15: bsd_loadavg(2); break; #endif #if defined(__sun__) || defined(__linux__) || (defined(__APPLE__) && defined(__MACH__)) || defined(__FreeBSD__) - case UTIL: util_measure(&rv,&sz); sendv(rv, sz); break; + case UTIL: util_measure(&rv,&sz); sendv(rv, sz); break; #endif case QUIT: free((void*)rv); return 0; default: error("Bad command"); break; @@ -329,6 +336,22 @@ static void bsd_count_procs(void) { #if defined(__linux__) +static unsigned int misc_measure(char cmd) { + struct sysinfo info; + + if (sysinfo(&info)) + error(strerror(errno)); + + switch (cmd) { + case AVG1: return (unsigned int)(info.loads[0] / 256); + case AVG5: return (unsigned int)(info.loads[1] / 256); + case AVG15: return (unsigned int)(info.loads[2] / 256); + case NPROCS: return info.procs; + } + + return -1; +} + static cpu_t *read_procstat(FILE *fp, cpu_t *cpu) { char buffer[BUFFERSIZE]; @@ -357,8 +380,24 @@ static void util_measure(unsigned int **result_vec, int *result_sz) { FILE *fp; unsigned int *rv = NULL; cpu_t cpu; - + + rv = *result_vec; + rv[0] = no_of_cpus; + if ( (fp = fopen(PROCSTAT,"r")) == NULL) { + if (errno == EACCES) { /* SELinux */ + rv[1] = 1; /* just the cpu id */ + ++rv; /* first value is number of cpus */ + ++rv; /* second value is number of entries */ + for (i = 0; i < no_of_cpus; ++i) { + rv[0] = CU_CPU_ID; + rv[1] = i; + rv += 1*2; + } + *result_sz = 2 + 2*1 * no_of_cpus; + return; + } + /* Check if procfs is mounted, * otherwise: * try and try again, bad procsfs. @@ -367,20 +406,19 @@ static void util_measure(unsigned int **result_vec, int *result_sz) { return; } - /*ignore read*/ + /*ignore read*/ if (fgets(buffer, BUFFERSIZE, fp) == NULL) { *result_sz = 0; return; } - rv = *result_vec; - rv[0] = no_of_cpus; + rv[1] = CU_VALUES; ++rv; /* first value is number of cpus */ ++rv; /* second value is number of entries */ for (i = 0; i < no_of_cpus; ++i) { read_procstat(fp, &cpu); - + rv[ 0] = CU_CPU_ID; rv[ 1] = cpu.id; rv[ 2] = CU_USER; rv[ 3] = cpu.user; rv[ 4] = CU_NICE_USER; rv[ 5] = cpu.nice_user; diff --git a/lib/os_mon/doc/src/Makefile b/lib/os_mon/doc/src/Makefile index 354f8ed26b..8e9a4c333c 100644 --- a/lib/os_mon/doc/src/Makefile +++ b/lib/os_mon/doc/src/Makefile @@ -39,7 +39,6 @@ XML_APPLICATION_FILES = ref_man.xml XML_REF3_FILES = cpu_sup.xml \ disksup.xml \ memsup.xml \ - os_mon_mib.xml \ os_sup.xml \ nteventlog.xml diff --git a/lib/os_mon/doc/src/cpu_sup.xml b/lib/os_mon/doc/src/cpu_sup.xml index bada165a06..b7adb2bcd2 100644 --- a/lib/os_mon/doc/src/cpu_sup.xml +++ b/lib/os_mon/doc/src/cpu_sup.xml @@ -28,7 +28,7 @@ <date></date> <rev></rev> </header> - <module>cpu_sup</module> + <module since="">cpu_sup</module> <modulesummary>A CPU Load and CPU Utilization Supervisor Process</modulesummary> <description> <p><c>cpu_sup</c> is a process which supervises the CPU load @@ -76,7 +76,7 @@ </description> <funcs> <func> - <name>nprocs() -> UnixProcesses | {error, Reason}</name> + <name since="">nprocs() -> UnixProcesses | {error, Reason}</name> <fsummary>Get the number of UNIX processes running on this host</fsummary> <type> <v>UnixProcesses = int()</v> @@ -90,7 +90,7 @@ </desc> </func> <func> - <name>avg1() -> SystemLoad | {error, Reason}</name> + <name since="">avg1() -> SystemLoad | {error, Reason}</name> <fsummary>Get the system load average for the last minute</fsummary> <type> <v>SystemLoad = int()</v> @@ -104,7 +104,7 @@ </desc> </func> <func> - <name>avg5() -> SystemLoad | {error, Reason}</name> + <name since="">avg5() -> SystemLoad | {error, Reason}</name> <fsummary>Get the system load average for the last five minutes</fsummary> <type> <v>SystemLoad = int()</v> @@ -118,7 +118,7 @@ </desc> </func> <func> - <name>avg15() -> SystemLoad | {error, Reason}</name> + <name since="">avg15() -> SystemLoad | {error, Reason}</name> <fsummary>Get the system load average for the last fifteen minutes</fsummary> <type> <v>SystemLoad = int()</v> @@ -132,7 +132,7 @@ </desc> </func> <func> - <name>util() -> CpuUtil | {error, Reason}</name> + <name since="">util() -> CpuUtil | {error, Reason}</name> <fsummary>Get the CPU utilization</fsummary> <type> <v>CpuUtil = float()</v> @@ -156,7 +156,7 @@ </desc> </func> <func> - <name>util(Opts) -> UtilSpec | {error, Reason}</name> + <name since="">util(Opts) -> UtilSpec | {error, Reason}</name> <fsummary>Get the CPU utilization</fsummary> <type> <v>Opts = [detailed | per_cpu]</v> diff --git a/lib/os_mon/doc/src/disksup.xml b/lib/os_mon/doc/src/disksup.xml index 610ef2c907..116a6dfd19 100644 --- a/lib/os_mon/doc/src/disksup.xml +++ b/lib/os_mon/doc/src/disksup.xml @@ -28,7 +28,7 @@ <date></date> <rev></rev> </header> - <module>disksup</module> + <module since="">disksup</module> <modulesummary>A Disk Supervisor Process</modulesummary> <description> <p><c>disksup</c> is a process which supervises the available disk @@ -92,7 +92,7 @@ </section> <funcs> <func> - <name>get_disk_data() -> [DiskData]</name> + <name since="">get_disk_data() -> [DiskData]</name> <fsummary>Get data for the disks in the system</fsummary> <type> <v>DiskData = {Id, KByte, Capacity}</v> @@ -112,7 +112,7 @@ </desc> </func> <func> - <name>get_check_interval() -> MS</name> + <name since="">get_check_interval() -> MS</name> <fsummary>Get time interval, in milliseconds, for the periodic disk space check</fsummary> <type> <v>MS = int()</v> @@ -123,7 +123,7 @@ </desc> </func> <func> - <name>set_check_interval(Minutes) -> ok</name> + <name since="">set_check_interval(Minutes) -> ok</name> <fsummary>Set time interval, in minutes, for the periodic disk space check</fsummary> <type> <v>Minutes = int()>=1</v> @@ -138,7 +138,7 @@ </desc> </func> <func> - <name>get_almost_full_threshold() -> Percent</name> + <name since="">get_almost_full_threshold() -> Percent</name> <fsummary>Get threshold, in percent, for disk space utilization</fsummary> <type> <v>Percent = int()</v> @@ -148,7 +148,7 @@ </desc> </func> <func> - <name>set_almost_full_threshold(Float) -> ok</name> + <name since="">set_almost_full_threshold(Float) -> ok</name> <fsummary>Set threshold, as percentage represented by a float, for disk space utilization</fsummary> <type> <v>Float = float(), 0=<Float=<1</v> diff --git a/lib/os_mon/doc/src/memsup.xml b/lib/os_mon/doc/src/memsup.xml index c669e4670a..51c78b07c2 100644 --- a/lib/os_mon/doc/src/memsup.xml +++ b/lib/os_mon/doc/src/memsup.xml @@ -28,7 +28,7 @@ <date></date> <rev></rev> </header> - <module>memsup</module> + <module since="">memsup</module> <modulesummary>A Memory Supervisor Process</modulesummary> <description> <p><c>memsup</c> is a process which supervises the memory usage for @@ -127,7 +127,7 @@ </section> <funcs> <func> - <name>get_memory_data() -> {Total,Allocated,Worst}</name> + <name since="">get_memory_data() -> {Total,Allocated,Worst}</name> <fsummary>Get data for the memory in the system</fsummary> <type> <v>Total = Allocated = int()</v> @@ -155,7 +155,7 @@ </desc> </func> <func> - <name>get_system_memory_data() -> MemDataList</name> + <name since="">get_system_memory_data() -> MemDataList</name> <fsummary>Get system dependent memory data</fsummary> <type> <v>MemDataList = [{Tag, Size}]</v> @@ -216,7 +216,7 @@ </desc> </func> <func> - <name>get_os_wordsize() -> Wordsize</name> + <name since="">get_os_wordsize() -> Wordsize</name> <fsummary>Get the wordsize of running os.</fsummary> <type> <v>Wordsize = 32 | 64 | unsupported_os</v> @@ -226,7 +226,7 @@ </desc> </func> <func> - <name>get_check_interval() -> MS</name> + <name since="">get_check_interval() -> MS</name> <fsummary>Get time interval, in milliseconds, for the periodic memory check</fsummary> <type> <v>MS = int()</v> @@ -237,7 +237,7 @@ </desc> </func> <func> - <name>set_check_interval(Minutes) -> ok</name> + <name since="">set_check_interval(Minutes) -> ok</name> <fsummary>Set time interval, in minutes, for the periodic memory check</fsummary> <type> <v>Minutes = int()>0</v> @@ -252,7 +252,7 @@ </desc> </func> <func> - <name>get_procmem_high_watermark() -> int()</name> + <name since="">get_procmem_high_watermark() -> int()</name> <fsummary>Get threshold, in percent, for process memory allocation</fsummary> <desc> <p>Returns the threshold, in percent, for process memory @@ -260,7 +260,7 @@ </desc> </func> <func> - <name>set_procmem_high_watermark(Float) -> ok</name> + <name since="">set_procmem_high_watermark(Float) -> ok</name> <fsummary>Set threshold, as percentage represented by a float, for process memory allocation</fsummary> <desc> <p>Changes the threshold, given as a float, for process memory @@ -273,7 +273,7 @@ </desc> </func> <func> - <name>get_sysmem_high_watermark() -> int()</name> + <name since="">get_sysmem_high_watermark() -> int()</name> <fsummary>Get threshold, in percent, for system memory allocation</fsummary> <desc> <p>Returns the threshold, in percent, for system memory @@ -281,7 +281,7 @@ </desc> </func> <func> - <name>set_sysmem_high_watermark(Float) -> ok</name> + <name since="">set_sysmem_high_watermark(Float) -> ok</name> <fsummary>Set threshold, given as a float, for system memory allocation</fsummary> <desc> <p>Changes the threshold, given as a float, for system memory @@ -294,7 +294,7 @@ </desc> </func> <func> - <name>get_helper_timeout() -> Seconds</name> + <name since="">get_helper_timeout() -> Seconds</name> <fsummary>Get the timeout value, in seconds, for memory checks</fsummary> <type> <v>Seconds = int()</v> @@ -304,7 +304,7 @@ </desc> </func> <func> - <name>set_helper_timeout(Seconds) -> ok</name> + <name since="">set_helper_timeout(Seconds) -> ok</name> <fsummary>Set the timeout value, in seconds, for memory checks</fsummary> <type> <v>Seconds = int() (>= 1)</v> diff --git a/lib/os_mon/doc/src/notes.xml b/lib/os_mon/doc/src/notes.xml index 4a878dd704..64e9f281e3 100644 --- a/lib/os_mon/doc/src/notes.xml +++ b/lib/os_mon/doc/src/notes.xml @@ -31,6 +31,39 @@ </header> <p>This document describes the changes made to the OS_Mon application.</p> +<section><title>Os_Mon 2.4.7</title> + + <section><title>Fixed Bugs and Malfunctions</title> + <list> + <item> + <p> + Due to <c>/proc</c> restrictions in newer Android + releases enforced by SELinux, cpu_sup is fixed so that it + gets some basic CPU stats using the <c>sysinfo</c> + syscall rather than reading <c>/proc/loadavg</c>.</p> + <p> + Own Id: OTP-15387 Aux Id: PR-1966 </p> + </item> + </list> + </section> + +</section> + +<section><title>Os_Mon 2.4.6</title> + + <section><title>Fixed Bugs and Malfunctions</title> + <list> + <item> + <p> + Improved documentation.</p> + <p> + Own Id: OTP-15190</p> + </item> + </list> + </section> + +</section> + <section><title>Os_Mon 2.4.5</title> <section><title>Fixed Bugs and Malfunctions</title> diff --git a/lib/os_mon/doc/src/nteventlog.xml b/lib/os_mon/doc/src/nteventlog.xml index d32427227c..08cf165a24 100644 --- a/lib/os_mon/doc/src/nteventlog.xml +++ b/lib/os_mon/doc/src/nteventlog.xml @@ -28,7 +28,7 @@ <date></date> <rev></rev> </header> - <module>nteventlog</module> + <module since="">nteventlog</module> <modulesummary>Interface to Windows Event Log</modulesummary> <description> <p><c>nteventlog</c> provides a generic interface to the Windows @@ -61,8 +61,8 @@ </description> <funcs> <func> - <name>start(Identifier, MFA) -> Result</name> - <name>start_link(Identifier, MFA) -> Result</name> + <name since="">start(Identifier, MFA) -> Result</name> + <name since="">start_link(Identifier, MFA) -> Result</name> <fsummary>Start the NT eventlog server</fsummary> <type> <v>Identifier = string() | atom()</v> @@ -82,7 +82,7 @@ </desc> </func> <func> - <name>stop() -> stopped</name> + <name since="">stop() -> stopped</name> <fsummary>Stop the NT eventlog server</fsummary> <type> <v>Result = stopped</v> diff --git a/lib/os_mon/doc/src/os_mon_app.xml b/lib/os_mon/doc/src/os_mon_app.xml index 99492a2021..c77a9d0411 100644 --- a/lib/os_mon/doc/src/os_mon_app.xml +++ b/lib/os_mon/doc/src/os_mon_app.xml @@ -88,33 +88,6 @@ </section> <section> - <title>SNMP MIBs</title> - <p>The following MIBs are defined in OS_Mon:</p> - <taglist> - <tag>OTP-OS-MON-MIB</tag> - <item> - <p>This MIB contains objects for instrumentation of disk, - memory and CPU usage of the nodes in the system.</p> - </item> - </taglist> - <p>The MIB is stored in the <c>mibs</c> directory. It is defined - in SNMPv2 SMI syntax. An SNMPv1 version of the MIB is delivered - in the <c>mibs/v1</c> directory.</p> - <p>The compiled MIB is located under <c>priv/mibs</c>, and - the generated <c>.hrl</c> file under the <c>include</c> directory. - To compile a MIB that IMPORTS the <c>OTP-OS-MON-MIB</c>, give - the option <c>{il, ["os_mon/priv/mibs"]}</c> to the MIB compiler.</p> - <p>If the MIB should be used in a system, it should be loaded into - an agent with a call to <c>os_mon_mib:load(Agent)</c>, where - <c>Agent</c> is the pid or registered name of an SNMP agent. Use - <c>os_mon_mib:unload(Agent)</c> to unload the MIB. - The implementation of this MIB uses Mnesia to store a cache with - data needed, which implicates that Mnesia must be up and running. - The MIB also use functions defined for the <c>OTP-MIB</c>, thus - that MIB must be loaded as well.</p> - </section> - - <section> <title>See Also</title> <p><seealso marker="cpu_sup">cpu_sup(3)</seealso>, <seealso marker="disksup">disksup(3)</seealso>, diff --git a/lib/os_mon/doc/src/os_mon_mib.xml b/lib/os_mon/doc/src/os_mon_mib.xml deleted file mode 100644 index e995bf3de1..0000000000 --- a/lib/os_mon/doc/src/os_mon_mib.xml +++ /dev/null @@ -1,74 +0,0 @@ -<?xml version="1.0" encoding="utf-8" ?> -<!DOCTYPE erlref SYSTEM "erlref.dtd"> - -<erlref> - <header> - <copyright> - <year>2004</year><year>2018</year> - <holder>Ericsson AB. All Rights Reserved.</holder> - </copyright> - <legalnotice> - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - </legalnotice> - - <title>os_mon_mib</title> - <prepared>Ingela Andin</prepared> - <responsible></responsible> - <docno></docno> - <date></date> - <rev></rev> - </header> - <module>os_mon_mib</module> - <modulesummary>Loading and Unloading of OTP-OS-MON-MIB</modulesummary> - <description> - <p>Functions for loading and unloading the OTP-OS-MON-MIB into/from - an SNMP agent. The instrumentation of the OTP-OS-MON-MIB uses - Mnesia, hence Mnesia must be started prior to loading - the OTP-OS-MON-MIB.</p> - <warning> - <p>This module has been deprecated and will be removed in a furture release.</p> - </warning> - </description> - <funcs> - <func> - <name>load(Agent) -> ok | {error, Reason}</name> - <fsummary>Load the OTP-OS-MON-MIB</fsummary> - <type> - <v>Agent = pid() | atom()</v> - <v>Reason = term()</v> - </type> - <desc> - <p>Loads the OTP-OS-MON-MIB.</p> - </desc> - </func> - <func> - <name>unload(Agent) -> ok | {error, Reason}</name> - <fsummary>Unload the OTP-OS-MON-MIB</fsummary> - <type> - <v>Agent = pid() | atom() </v> - <v>Reason = term()</v> - </type> - <desc> - <p>Unloads the OTP-OS-MON-MIB.</p> - </desc> - </func> - </funcs> - - <section> - <title>See Also</title> - <p><seealso marker="os_mon_app">os_mon(6)</seealso>, - <seealso marker="snmp:snmp">snmp(3)</seealso></p> - </section> -</erlref> - diff --git a/lib/os_mon/doc/src/os_sup.xml b/lib/os_mon/doc/src/os_sup.xml index d517f387b4..4a84165a6c 100644 --- a/lib/os_mon/doc/src/os_sup.xml +++ b/lib/os_mon/doc/src/os_sup.xml @@ -28,7 +28,7 @@ <date></date> <rev></rev> </header> - <module>os_sup</module> + <module since="">os_sup</module> <modulesummary>Interface to OS System Messages</modulesummary> <description> <p><c>os_sup</c> is a process providing a message passing service @@ -159,8 +159,8 @@ </section> <funcs> <func> - <name>enable() -> ok | {error, Res}</name> - <name>enable(Dir, Conf) -> ok | {error, Error}</name> + <name since="">enable() -> ok | {error, Res}</name> + <name since="">enable(Dir, Conf) -> ok | {error, Error}</name> <fsummary>Enable the service (Solaris only)</fsummary> <type> <v>Dir = Conf = Res = string()</v> @@ -194,8 +194,8 @@ </desc> </func> <func> - <name>disable() -> ok | {error, Res}</name> - <name>disable(Dir, Conf) -> ok | {error, Error}</name> + <name since="">disable() -> ok | {error, Res}</name> + <name since="">disable(Dir, Conf) -> ok | {error, Error}</name> <fsummary>Disable the service (Solaris only)</fsummary> <type> <v>Dir = Conf = Res = string()</v> diff --git a/lib/os_mon/doc/src/ref_man.xml b/lib/os_mon/doc/src/ref_man.xml index a8f847a8ba..57dd5c5f0b 100644 --- a/lib/os_mon/doc/src/ref_man.xml +++ b/lib/os_mon/doc/src/ref_man.xml @@ -36,7 +36,6 @@ <xi:include href="cpu_sup.xml"/> <xi:include href="disksup.xml"/> <xi:include href="memsup.xml"/> - <xi:include href="os_mon_mib.xml"/> <xi:include href="os_sup.xml"/> <xi:include href="nteventlog.xml"/> </application> diff --git a/lib/os_mon/mibs/Makefile b/lib/os_mon/mibs/Makefile deleted file mode 100644 index dbc105ee3d..0000000000 --- a/lib/os_mon/mibs/Makefile +++ /dev/null @@ -1,101 +0,0 @@ -# -# %CopyrightBegin% -# -# Copyright Ericsson AB 1997-2016. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# %CopyrightEnd% -# -include $(ERL_TOP)/make/target.mk -include $(ERL_TOP)/make/$(TARGET)/otp.mk - -# ---------------------------------------------------- -# Application version -# ---------------------------------------------------- -include ../vsn.mk -VSN=$(OS_MON_VSN) - -# ---------------------------------------------------- -# Release directory specification -# ---------------------------------------------------- -RELSYSDIR = $(RELEASE_PATH)/lib/os_mon-$(VSN) - -# ---------------------------------------------------- -# Target Specs -# ---------------------------------------------------- - -MIB_FILES= OTP-OS-MON-MIB.mib -FUNCS_FILES = OTP-OS-MON-MIB.funcs - -BIN_TARGETS= $(MIB_FILES:%.mib=$(SNMP_BIN_TARGET_DIR)/%.bin) -HRL_TARGETS= $(MIB_FILES:%.mib=$(SNMP_HRL_TARGET_DIR)/%.hrl) -V1_MIB_FILES= $(MIB_FILES:%.mib=v1/%.mib.v1) - -TARGET_FILES= $(SNMP_BIN_TARGET_DIR)/OTP-REG.bin \ - $(SNMP_BIN_TARGET_DIR)/OTP-TC.bin \ - $(SNMP_BIN_TARGET_DIR)/OTP-MIB.bin \ - $(BIN_TARGETS) $(HRL_TARGETS) $(V1_MIB_FILES) - -# ---------------------------------------------------- -# FLAGS -# ---------------------------------------------------- -SNMP_FLAGS = -I $(SNMP_BIN_TARGET_DIR) - -# ---------------------------------------------------- -# Targets -# ---------------------------------------------------- - -debug opt: $(TARGET_FILES) - -clean: - rm -f $(TARGET_FILES) - rm -f core - -docs: - -OTP_MIBDIR = $(shell if test -d ../../otp_mibs; then echo otp_mibs; \ - else echo sasl; fi) - -$(SNMP_BIN_TARGET_DIR)/OTP-REG.bin: $(ERL_TOP)/lib/$(OTP_MIBDIR)/mibs/OTP-REG.mib - $(snmp_verbose)$(ERLC) -pa $(SNMP_TOOLKIT)/ebin -I $(SNMP_TOOLKIT)/priv/mibs $(SNMP_FLAGS) -o $(SNMP_BIN_TARGET_DIR) $< - -$(SNMP_BIN_TARGET_DIR)/OTP-TC.bin: $(ERL_TOP)/lib/$(OTP_MIBDIR)/mibs/OTP-TC.mib - $(snmp_verbose)$(ERLC) -pa $(SNMP_TOOLKIT)/ebin -I $(SNMP_TOOLKIT)/priv/mibs $(SNMP_FLAGS) -o $(SNMP_BIN_TARGET_DIR) $< - -$(SNMP_BIN_TARGET_DIR)/OTP-MIB.bin: $(ERL_TOP)/lib/$(OTP_MIBDIR)/mibs/OTP-MIB.mib - $(snmp_verbose)$(ERLC) -pa $(SNMP_TOOLKIT)/ebin -I $(SNMP_TOOLKIT)/priv/mibs $(SNMP_FLAGS) -o $(SNMP_BIN_TARGET_DIR) $< - -v1/%.mib.v1: %.mib - $(gen_verbose)$(ERL_TOP)/lib/snmp/bin/snmp-v2tov1 -o $@ $< - -$(SNMP_BIN_TARGET_DIR)/OTP-OS-MON-MIB.bin: \ - $(SNMP_BIN_TARGET_DIR)/OTP-REG.bin \ - $(SNMP_BIN_TARGET_DIR)/OTP-MIB.bin \ - -# ---------------------------------------------------- -# Release Target -# ---------------------------------------------------- -include $(ERL_TOP)/make/otp_release_targets.mk - -release_spec: opt - $(INSTALL_DIR) "$(RELSYSDIR)/mibs" - $(INSTALL_DIR) "$(RELSYSDIR)/mibs/v1" - $(INSTALL_DATA) $(MIB_FILES) $(FUNCS_FILES) "$(RELSYSDIR)/mibs" - $(INSTALL_DATA) $(V1_MIB_FILES) "$(RELSYSDIR)/mibs/v1" - $(INSTALL_DIR) "$(RELSYSDIR)/include" - $(INSTALL_DATA) $(HRL_TARGETS) "$(RELSYSDIR)/include" - $(INSTALL_DIR) "$(RELSYSDIR)/priv/mibs" - $(INSTALL_DATA) $(BIN_TARGETS) "$(RELSYSDIR)/priv/mibs" - -release_docs_spec: diff --git a/lib/os_mon/mibs/OTP-OS-MON-MIB.funcs b/lib/os_mon/mibs/OTP-OS-MON-MIB.funcs deleted file mode 100644 index 7ed76517b9..0000000000 --- a/lib/os_mon/mibs/OTP-OS-MON-MIB.funcs +++ /dev/null @@ -1,5 +0,0 @@ -{loadMemorySystemWatermark, {os_mon_mib, mem_sys_mark, []}}. -{loadMemoryErlProcWatermark, {os_mon_mib, mem_proc_mark, []}}. -{loadTable, {os_mon_mib, load_table, []}}. -{diskAlmostFullThreshold, {os_mon_mib, disk_threshold, []}}. -{diskTable, {os_mon_mib, disk_table, []}}. diff --git a/lib/os_mon/mibs/OTP-OS-MON-MIB.mib b/lib/os_mon/mibs/OTP-OS-MON-MIB.mib deleted file mode 100644 index e027e96154..0000000000 --- a/lib/os_mon/mibs/OTP-OS-MON-MIB.mib +++ /dev/null @@ -1,423 +0,0 @@ --- --- %CopyrightBegin% --- --- Copyright Ericsson AB 1997-2016. All Rights Reserved. --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- --- %CopyrightEnd% --- - -OTP-OS-MON-MIB DEFINITIONS ::= BEGIN - -IMPORTS - MODULE-IDENTITY, NOTIFICATION-TYPE, OBJECT-TYPE, - Counter32, Gauge32, Integer32, Unsigned32, Counter64 - FROM SNMPv2-SMI - TEXTUAL-CONVENTION, DisplayString - FROM SNMPv2-TC - MODULE-COMPLIANCE, NOTIFICATION-GROUP, OBJECT-GROUP - FROM SNMPv2-CONF - otpModules, otpApplications - FROM OTP-REG - erlNodeId - FROM OTP-MIB - ; - - -otpOsMonModule MODULE-IDENTITY - LAST-UPDATED "0305090900Z" - ORGANIZATION "Ericsson" - CONTACT-INFO - "Contact: Erlang Support see license agreement for Erlang/OTP." - - DESCRIPTION - "This MIB is part of the OTP MIB. It defines MIB objects - for the os_mon application in OTP." - - REVISION "0508260900Z" - DESCRIPTION - "Removed dependeny on EVA." - REVISION "0305090900Z" - DESCRIPTION - "Changed CONTACT-INFO as it was outdated, made it more generic - to avoid such changes in the future." - - REVISION "9807080900Z" - DESCRIPTION - "Changed MAX-ACCESS for diskDescr from not-accessible to - read-only." - - REVISION "9801270900Z" - DESCRIPTION - "Changed erroneous name of this module to otpOsMonModule." - - REVISION "9712010900Z" - DESCRIPTION - "Converted to v2 SMI and placed in the OTP tree." - - REVISION "9608191700Z" - DESCRIPTION - "The initial revision of MIB module OTP-OS-MON-MIB." - ::= { otpModules 4 } - -OTPCounterBasedGauge64 ::= TEXTUAL-CONVENTION - STATUS current - DESCRIPTION - "The CounterBasedGauge64 type represents a non-negative - integer, which may increase or decrease, but shall never - exceed a maximum value, nor fall below a minimum value. The - maximum value can not be greater than 2^64-1 - (18446744073709551615 decimal), and the minimum value can - - not be smaller than 0. The value of a CounterBasedGauge64 - has its maximum value whenever the information being modeled - is greater than or equal to its maximum value, and has its - minimum value whenever the information being modeled is - smaller than or equal to its minimum value. If the - information being modeled subsequently decreases below - (increases above) the maximum (minimum) value, the - CounterBasedGauge64 also decreases (increases). - - Note that this TC is not strictly supported in SMIv2, - because the 'always increasing' and 'counter wrap' semantics - associated with the Counter64 base type are not preserved. - It is possible that management applications which rely - solely upon the (Counter64) ASN.1 tag to determine object - semantics will mistakenly operate upon objects of this type - as they would for Counter64 objects. - - This textual convention represents a limited and short-term - solution, and may be deprecated as a long term solution is - defined and deployed to replace it." - SYNTAX Counter64 - -otpOsMonMIB OBJECT IDENTIFIER ::= { otpApplications 2 } -otpOsMonMIBConformance - OBJECT IDENTIFIER ::= { otpOsMonMIB 1 } -otpOsMonMIBObjects - OBJECT IDENTIFIER ::= { otpOsMonMIB 2 } -otpOsMonMIBAlarms - OBJECT IDENTIFIER ::= { otpOsMonMIB 4 } -otpOsMonMIBAlarmsV2 - OBJECT IDENTIFIER ::= { otpOsMonMIBAlarms 0 } - - --- Datatypes - --- Managed Objects - -load OBJECT IDENTIFIER ::= { otpOsMonMIBObjects 1 } -disk OBJECT IDENTIFIER ::= { otpOsMonMIBObjects 2 } - -loadMemorySystemWatermark OBJECT-TYPE - SYNTAX Integer32 (0..100) - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "Threshold in percent of the total available system - memory, which specifies how much memory can be allocated - by the system before an alarm is sent." - ::= { load 1 } - -loadMemoryErlProcWatermark OBJECT-TYPE - SYNTAX Integer32 (0..100) - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "Threshold in percent of the total available system - memory, which specifies how much memory can be allocated - by one Erlang process before an alarm is sent." - ::= { load 2 } - -loadTable OBJECT-TYPE - SYNTAX SEQUENCE OF LoadEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "A table with load and memory information - for each node." - ::= { load 3 } - -loadEntry OBJECT-TYPE - SYNTAX LoadEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "A conceptual row in the loadTable." - INDEX { loadErlNodeName } - ::= { loadTable 1 } - -LoadEntry ::= SEQUENCE { - loadErlNodeName DisplayString, - loadSystemTotalMemory Gauge32, - loadSystemUsedMemory Gauge32, - loadLargestErlProcess DisplayString, - loadLargestErlProcessUsedMemory Gauge32, - loadCpuLoad Integer32, - loadCpuLoad5 Integer32, - loadCpuLoad15 Integer32, - loadOsWordsize Unsigned32, - loadSystemTotalMemory64 OTPCounterBasedGauge64, - loadSystemUsedMemory64 OTPCounterBasedGauge64, - loadLargestErlProcessUsedMemory64 OTPCounterBasedGauge64 - } - -loadErlNodeName OBJECT-TYPE - SYNTAX DisplayString - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The name of the erlang node, e.g. erlnode@host1." - ::= { loadEntry 1 } - -loadSystemTotalMemory OBJECT-TYPE - SYNTAX Gauge32 - UNITS "bytes" - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The amount of total memory in the system." - ::= { loadEntry 2 } - -loadSystemUsedMemory OBJECT-TYPE - SYNTAX Gauge32 - UNITS "bytes" - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The amount of used memory." - ::= { loadEntry 3 } - -loadLargestErlProcess OBJECT-TYPE - SYNTAX DisplayString - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The process identifier (Pid) of the largest Erlang - process." - ::= { loadEntry 4 } - -loadLargestErlProcessUsedMemory OBJECT-TYPE - SYNTAX Gauge32 - UNITS "bytes" - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The amount of memory used by the largest Erlang - process." - ::= { loadEntry 5 } - -loadCpuLoad OBJECT-TYPE - SYNTAX Integer32 (0..100) - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The average load the last minute in percent of the CPU - where the Erlang node runs." - ::= { loadEntry 6 } - -loadCpuLoad5 OBJECT-TYPE - SYNTAX Integer32 (0..100) - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The average load the last 5 minutes in percent of the CPU - where the Erlang node runs." - ::= { loadEntry 7} - -loadCpuLoad15 OBJECT-TYPE - SYNTAX Integer32 (0..100) - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The average load the last 15 minutes in percent of the CPU - where the Erlang node runs." - ::= { loadEntry 8} - -loadOsWordsize OBJECT-TYPE - SYNTAX Unsigned32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The wordsize of the operating operating system." - ::= { loadEntry 9 } - -loadSystemTotalMemory64 OBJECT-TYPE - SYNTAX OTPCounterBasedGauge64 - UNITS "bytes" - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The amount of total memory in the system for 64-bit operating system." - ::= { loadEntry 10 } - -loadSystemUsedMemory64 OBJECT-TYPE - SYNTAX OTPCounterBasedGauge64 - UNITS "bytes" - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The amount of used memory for 64-bit operating system." - ::= { loadEntry 11 } - -loadLargestErlProcessUsedMemory64 OBJECT-TYPE - SYNTAX OTPCounterBasedGauge64 - UNITS "bytes" - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The amount of memory used by the largest Erlang - process for 64-bit operating system.." - ::= { loadEntry 12 } - -diskAlmostFullThreshold OBJECT-TYPE - SYNTAX Integer32 (0..100) - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "Threshold in percent of the available disk space, - which specifies how much disk space can be used by - a disk or partition before an alarm is sent." - ::= { disk 1 } - -diskTable OBJECT-TYPE - SYNTAX SEQUENCE OF DiskEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "A table with all local disks or partitions on each - node." - ::= { disk 2 } - -diskEntry OBJECT-TYPE - SYNTAX DiskEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "A conceptual row in the diskTable." - INDEX { erlNodeId, diskId } - ::= { diskTable 1 } - -DiskEntry ::= SEQUENCE { - diskId Integer32, - diskDescr DisplayString, - diskKBytes Gauge32, - diskCapacity Integer32 - } - -diskId OBJECT-TYPE - SYNTAX Integer32 - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "An integer that uniquely identifies the disk - or partition." - ::= { diskEntry 1 } - -diskDescr OBJECT-TYPE - SYNTAX DisplayString - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "A string that identifies the disk or partition." - ::= { diskEntry 2 } - -diskKBytes OBJECT-TYPE - SYNTAX Gauge32 - UNITS "kbytes" - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The amount of total disk/partition space. " - ::= { diskEntry 3 } - -diskCapacity OBJECT-TYPE - SYNTAX Integer32 (0..100) - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "How much of the disk's/partition's total capacity has - been used, in percent." - ::= { diskEntry 4 } - - --- conformance information - -otpOsMonMIBCompliances - OBJECT IDENTIFIER ::= { otpOsMonMIBConformance 1 } -otpOsMonMIBGroups - OBJECT IDENTIFIER ::= { otpOsMonMIBConformance 2 } - - --- compliance statements - -otpOsMonBasicCompliance MODULE-COMPLIANCE - STATUS current - DESCRIPTION - "The compliance statement for SNMPv2 entities which - implement the OTP-OS-MON-MIB." - MODULE -- this module - GROUP loadGroup - DESCRIPTION - "This group is mandatory for systems implementing the - load supervison functionality." - GROUP loadAlarmsGroup - DESCRIPTION - "This group is optional for systems implementing the - load supervison functionality." - GROUP diskGroup - DESCRIPTION - "This group is mandatory for system implementing the - disk supervison functionality." - GROUP diskAlarmsGroup - DESCRIPTION - "This group is optional for systems implementing the - disk supervison functionality." - ::= { otpOsMonMIBCompliances 1 } - - --- units of conformance - -loadGroup OBJECT-GROUP - OBJECTS { loadMemorySystemWatermark, - loadMemoryErlProcWatermark, - loadSystemTotalMemory, - loadSystemUsedMemory, - loadLargestErlProcess, - loadLargestErlProcessUsedMemory, - loadCpuLoad, - loadCpuLoad5, - loadCpuLoad15, - loadOsWordsize, - loadSystemTotalMemory64, - loadSystemUsedMemory64, - loadLargestErlProcessUsedMemory64} - STATUS current - DESCRIPTION - "A collection of objects providing basic instrumentation - of the load of the OTP system." - ::= { otpOsMonMIBGroups 1 } - -diskGroup OBJECT-GROUP - OBJECTS { diskAlmostFullThreshold, - diskDescr, - diskKBytes, - diskCapacity } - STATUS current - DESCRIPTION - "A collection of objects providing basic instrumentation - of the disks in the OTP system." - ::= { otpOsMonMIBGroups 3 } - -END diff --git a/lib/os_mon/mibs/v1/.gitignore b/lib/os_mon/mibs/v1/.gitignore deleted file mode 100644 index e69de29bb2..0000000000 --- a/lib/os_mon/mibs/v1/.gitignore +++ /dev/null diff --git a/lib/os_mon/src/Makefile b/lib/os_mon/src/Makefile index fc2eb22393..923a31f290 100644 --- a/lib/os_mon/src/Makefile +++ b/lib/os_mon/src/Makefile @@ -34,8 +34,7 @@ RELSYSDIR = $(RELEASE_PATH)/lib/os_mon-$(VSN) # ---------------------------------------------------- # Target Specs # ---------------------------------------------------- -MODULES= disksup memsup cpu_sup os_mon os_mon_mib os_sup os_mon_sysinfo \ - nteventlog +MODULES= disksup memsup cpu_sup os_mon os_sup os_mon_sysinfo nteventlog INCLUDE=../include CSRC=../c_src diff --git a/lib/os_mon/src/cpu_sup.erl b/lib/os_mon/src/cpu_sup.erl index 81e049ef22..ba2d89313e 100644 --- a/lib/os_mon/src/cpu_sup.erl +++ b/lib/os_mon/src/cpu_sup.erl @@ -220,17 +220,21 @@ code_change(_OldVsn, State, _Extra) -> %% internal functions %%---------------------------------------------------------------------- -get_uint32_measurement(Request, #internal{os_type = {unix, linux}}) -> - {ok,F} = file:open("/proc/loadavg",[read,raw]), - {ok,D} = file:read_line(F), - ok = file:close(F), - {ok,[Load1,Load5,Load15,_PRun,PTotal],_} = io_lib:fread("~f ~f ~f ~d/~d", D), - case Request of - ?avg1 -> sunify(Load1); - ?avg5 -> sunify(Load5); - ?avg15 -> sunify(Load15); - ?ping -> 4711; - ?nprocs -> PTotal +get_uint32_measurement(Request, #internal{port = P, os_type = {unix, linux}}) -> + case file:open("/proc/loadavg",[read,raw]) of + {ok,F} -> + {ok,D} = file:read_line(F), + ok = file:close(F), + {ok,[Load1,Load5,Load15,_PRun,PTotal],_} = io_lib:fread("~f ~f ~f ~d/~d", D), + case Request of + ?avg1 -> sunify(Load1); + ?avg5 -> sunify(Load5); + ?avg15 -> sunify(Load15); + ?ping -> 4711; + ?nprocs -> PTotal + end; + {error,_} -> + port_server_call(P, Request) end; get_uint32_measurement(Request, #internal{port = P, os_type = {unix, Sys}}) when Sys == sunos; diff --git a/lib/os_mon/src/memsup.erl b/lib/os_mon/src/memsup.erl index 9d6447430d..b69d657aa7 100644 --- a/lib/os_mon/src/memsup.erl +++ b/lib/os_mon/src/memsup.erl @@ -701,6 +701,7 @@ get_os_wordsize_with_uname() -> "sparc64" -> 64; "amd64" -> 64; "ppc64" -> 64; + "ppc64le" -> 64; "s390x" -> 64; _ -> 32 end. diff --git a/lib/os_mon/src/os_mon.app.src b/lib/os_mon/src/os_mon.app.src index 8be94f65d4..6c9b0d7576 100644 --- a/lib/os_mon/src/os_mon.app.src +++ b/lib/os_mon/src/os_mon.app.src @@ -21,7 +21,7 @@ {application, os_mon, [{description, "CPO CXC 138 46"}, {vsn, "%VSN%"}, - {modules, [os_mon, os_mon_mib, os_sup, + {modules, [os_mon, os_sup, disksup, memsup, cpu_sup, os_mon_sysinfo, nteventlog]}, {registered, [os_mon_sup, os_mon_sysinfo, disksup, memsup, cpu_sup, os_sup_server]}, @@ -31,6 +31,4 @@ {start_memsup, true}, {start_os_sup, false}]}, {mod, {os_mon, []}}, - {runtime_dependencies, ["stdlib-2.0","snmp-4.25.1","sasl-2.4", - "otp_mibs-1.0.9","mnesia-4.12","kernel-3.0", - "erts-6.0"]}]}. + {runtime_dependencies, ["stdlib-2.0","sasl-2.4","kernel-3.0","erts-6.0"]}]}. diff --git a/lib/os_mon/src/os_mon_mib.erl b/lib/os_mon/src/os_mon_mib.erl deleted file mode 100644 index 9b5d2fbba6..0000000000 --- a/lib/os_mon/src/os_mon_mib.erl +++ /dev/null @@ -1,251 +0,0 @@ -%% -%% %CopyrightBegin% -%% -%% Copyright Ericsson AB 1996-2016. All Rights Reserved. -%% -%% Licensed under the Apache License, Version 2.0 (the "License"); -%% you may not use this file except in compliance with the License. -%% You may obtain a copy of the License at -%% -%% http://www.apache.org/licenses/LICENSE-2.0 -%% -%% Unless required by applicable law or agreed to in writing, software -%% distributed under the License is distributed on an "AS IS" BASIS, -%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -%% See the License for the specific language governing permissions and -%% limitations under the License. -%% -%% %CopyrightEnd% -%% --module(os_mon_mib). -%%%----------------------------------------------------------------- -%%% Description: This module implements the OS-MON-MIB. -%%% The tables are implemented as shadow tables with the module -%%% snmp_shadow_table. Here the update functions are implemented. -%%%----------------------------------------------------------------- - --include("../../otp_mibs/include/OTP-MIB.hrl"). - -%% API --export([load/1, unload/1]). - -%% Deprecated API --export([init/1, stop/1]). - --deprecated([{init,1,eventually}, - {stop,1,eventually}]). - -%% SNMP instrumentation --export([load_table/1, load_table/3, disk_table/1, disk_table/3, - mem_sys_mark/1, mem_proc_mark/1, disk_threshold/1]). - -%% SNMP shadow functions --export([update_load_table/0, update_disk_table/0]). - -%% Exported for internal use via rpc --export([get_load/1, get_disks/1]). - -%% Shadow tables --record(loadTable, { - loadErlNodeName, - loadSystemTotalMemory, - loadSystemUsedMemory, - loadLargestErlProcess, - loadLargestErlProcessUsedMemory, - loadCpuLoad, - loadCpuLoad5, - loadCpuLoad15, - loadOsWordsize, - loadSystemTotalMemory64, - loadSystemUsedMemory64, - loadLargestErlProcessUsedMemory64}). - --record(diskTable, - {key, diskDescr, diskKBytes, diskCapacity}). - -%% Shadow argument macros --define(loadShadowArgs, - {loadTable, string, record_info(fields, loadTable), 5000, - fun os_mon_mib:update_load_table/0}). - --define(diskShadowArgs, - {diskTable, {integer, integer}, record_info(fields, diskTable), 5000, - fun os_mon_mib:update_disk_table/0}). - -%% Misc --record(diskAlloc, {diskDescr, diskId}). - -%%%========================================================================= -%%% API -%%%========================================================================= - -%%------------------------------------------------------------------------- -%% load(Agent) -> ok | {error, Reason} -%% Agent - pid() | atom() -%% Reason - term() -%% Description: Loads the OTP-OS-MON-MIB -%%------------------------------------------------------------------------- -load(Agent) -> - MibDir = filename:join(code:priv_dir(os_mon), "mibs"), - snmpa:load_mibs(Agent, [filename:join(MibDir, "OTP-OS-MON-MIB")]). - -%%------------------------------------------------------------------------- -%% unload(Agent) -> ok | {error, Reason} -%% Agent - pid() | atom() -%% Reason - term() -%% Description: Unloads the OTP-OS-MON-MIB -%%------------------------------------------------------------------------- -unload(Agent) -> - snmpa:unload_mibs(Agent, ["OTP-OS-MON-MIB"]). - -%% To be backwards compatible -init(Agent) -> - load(Agent). -stop(Agent) -> - unload(Agent). - -%%%========================================================================= -%%% SNMP instrumentation -%%%========================================================================= -load_table(Op) -> - snmp_shadow_table:table_func(Op, ?loadShadowArgs). -load_table(Op, RowIndex, Cols) -> - snmp_shadow_table:table_func(Op, RowIndex, Cols, ?loadShadowArgs). - -disk_table(new) -> - Tab = diskAlloc, - Storage = ram_copies, - case lists:member(Tab, mnesia:system_info(tables)) of - true -> - case mnesia:table_info(Tab, storage_type) of - unknown -> - {atomic, ok}=mnesia:add_table_copy(Tab, node(), Storage); - Storage -> - catch delete_all(Tab) - end; - false -> - Nodes = [node()], - Props = [{type, set}, - {attributes, record_info(fields, diskAlloc)}, - {local_content, true}, - {Storage, Nodes}], - {atomic, ok} = mnesia:create_table(Tab, Props) - - end, - Rec = #diskAlloc{diskDescr = next_index, diskId = 1}, - ok = mnesia:dirty_write(Rec), - snmp_shadow_table:table_func(new, ?diskShadowArgs). - -disk_table(Op, RowIndex, Cols) -> - snmp_shadow_table:table_func(Op, RowIndex, Cols, ?diskShadowArgs). - -mem_sys_mark(get) -> - {value, memsup:get_sysmem_high_watermark()}; -mem_sys_mark(_) -> - ok. - -mem_proc_mark(get) -> - {value, memsup:get_procmem_high_watermark()}; -mem_proc_mark(_) -> - ok. - -disk_threshold(get) -> - {value, disksup:get_almost_full_threshold()}; -disk_threshold(_) -> - ok. - -%%%========================================================================= -%%% SNMP shadow functions -%%%========================================================================= -update_load_table() -> - delete_all(loadTable), - lists:foreach( - fun(Node) -> - case rpc:call(Node, os_mon_mib, get_load, [Node]) of - Load when is_record(Load,loadTable) -> - ok = mnesia:dirty_write(Load); - _Else -> - ok - end - end, [node() | nodes()]). - - -update_disk_table() -> - delete_all(diskTable), - node_update_disk_table( - otp_mib:erl_node_table(get_next, [], [?erlNodeName,?erlNodeOutBytes])). - -%%%======================================================================== -%%% Exported for internal use via rpc -%%%======================================================================== -get_load(Node) -> - {Total, Allocated, PidString, PidAllocated} = case memsup:get_memory_data() of - {MemTot, MemAlloc, undefined} -> {MemTot, MemAlloc, "undefined", 0}; - {MemTot, MemAlloc, {Pid, PidMem}} -> {MemTot, MemAlloc, pid_to_str(Pid), PidMem} - end, - OsWordsize = case memsup:get_os_wordsize() of - WS when is_integer(WS) -> WS; - _ -> 0 - end, - #loadTable{ - loadErlNodeName = atom_to_list(Node), - loadSystemTotalMemory = mask_int32(Total), - loadSystemUsedMemory = mask_int32(Allocated), - loadLargestErlProcess = PidString, - loadLargestErlProcessUsedMemory = mask_int32(PidAllocated), - loadCpuLoad = get_cpu_load(avg1), - loadCpuLoad5 = get_cpu_load(avg5), - loadCpuLoad15 = get_cpu_load(avg15), - loadOsWordsize = OsWordsize, - loadSystemTotalMemory64 = Total, - loadSystemUsedMemory64 = Allocated, - loadLargestErlProcessUsedMemory64 = PidAllocated - }. - -mask_int32(Value) -> Value band ((1 bsl 32) - 1). - -get_disks(NodeId) -> - element(1, - lists:mapfoldl( - fun({Descr, KByte, Capacity}, DiskId) -> - {#diskTable{key = {NodeId, DiskId}, - diskDescr = Descr, - diskKBytes = KByte, - diskCapacity = Capacity}, - DiskId + 1} - end, 1, disksup:get_disk_data())). - - -%%%======================================================================== -%%% Internal functions -%%%======================================================================== -node_update_disk_table([_, endOfTable]) -> - ok; - -node_update_disk_table([{[?erlNodeName | IndexList], NodeStr}, _]) -> - Disks = rpc:call(list_to_atom(NodeStr), os_mon_mib, get_disks, - IndexList), - lists:foreach(fun(Disk) -> - mnesia:dirty_write(Disk) - end, Disks), - node_update_disk_table(otp_mib:erl_node_table(get_next, - IndexList, - [?erlNodeName, - ?erlNodeOutBytes])). - -get_cpu_load(X) when X == avg1; X == avg5; X == avg15 -> - case erlang:round(apply(cpu_sup, X, [])/2.56) of - Large when Large > 100 -> - 100; - Load -> - Load - end. - -delete_all(Name) -> delete_all(mnesia:dirty_first(Name), Name). -delete_all('$end_of_table', _Name) -> done; -delete_all(Key, Name) -> - Next = mnesia:dirty_next(Name, Key), - ok = mnesia:dirty_delete({Name, Key}), - delete_all(Next, Name). - -pid_to_str(Pid) -> lists:flatten(io_lib:format("~w", [Pid])). diff --git a/lib/os_mon/test/Makefile b/lib/os_mon/test/Makefile index 6ac67e6bae..03c73b95ec 100644 --- a/lib/os_mon/test/Makefile +++ b/lib/os_mon/test/Makefile @@ -30,7 +30,6 @@ MODULES= \ disksup_SUITE \ memsup_SUITE \ cpu_sup_SUITE \ - os_mon_mib_SUITE \ os_sup_SUITE \ os_mon_conf @@ -87,7 +86,6 @@ release_tests_spec: make_emakefile $(INSTALL_DIR) "$(RELSYSDIR)" $(INSTALL_DATA) os_mon.spec os_mon.cover os_mon_smoke.spec \ $(EMAKEFILE) $(SOURCE) "$(RELSYSDIR)" - $(INSTALL_DATA) os_mon_mib_SUITE.cfg "$(RELSYSDIR)" ## tar chf - *_SUITE_data | (cd "$(RELSYSDIR)"; tar xf -) diff --git a/lib/os_mon/test/os_mon.spec b/lib/os_mon/test/os_mon.spec index 4b4286b313..d292b258f3 100644 --- a/lib/os_mon/test/os_mon.spec +++ b/lib/os_mon/test/os_mon.spec @@ -1,2 +1 @@ {suites,"../os_mon_test",all}. -{config,"os_mon_mib_SUITE.cfg"}.
\ No newline at end of file diff --git a/lib/os_mon/test/os_mon_mib_SUITE.cfg b/lib/os_mon/test/os_mon_mib_SUITE.cfg deleted file mode 100644 index a33c23530b..0000000000 --- a/lib/os_mon/test/os_mon_mib_SUITE.cfg +++ /dev/null @@ -1,8 +0,0 @@ -%% -*- erlang -*- -{snmp, [{start_agent,true}, - {users,[{os_mon_mib_test,[snmpm_user_default,[]]}]}, - {managed_agents,[{os_mon_mib_test, - [os_mon_mib_test, {127,0,0,1}, 4000, []]}]}, - {agent_sysname,"Test os_mon_mibs"}, - {mgr_port,5001} - ]}. diff --git a/lib/os_mon/test/os_mon_mib_SUITE.erl b/lib/os_mon/test/os_mon_mib_SUITE.erl deleted file mode 100644 index f40d5f442c..0000000000 --- a/lib/os_mon/test/os_mon_mib_SUITE.erl +++ /dev/null @@ -1,578 +0,0 @@ -%% -%% %CopyrightBegin% -%% -%% Copyright Ericsson AB 2004-2016. All Rights Reserved. -%% -%% Licensed under the Apache License, Version 2.0 (the "License"); -%% you may not use this file except in compliance with the License. -%% You may obtain a copy of the License at -%% -%% http://www.apache.org/licenses/LICENSE-2.0 -%% -%% Unless required by applicable law or agreed to in writing, software -%% distributed under the License is distributed on an "AS IS" BASIS, -%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -%% See the License for the specific language governing permissions and -%% limitations under the License. -%% -%% %CopyrightEnd% -%% --module(os_mon_mib_SUITE). - -%%----------------------------------------------------------------- -%% This suite can no longer be executed standalone, i.e. it must be -%% executed with common test. The reason is that ct_snmp is used -%% instead of the snmp application directly. The suite requires a -%% config file, os_mon_mib_SUITE.cfg, found in the same directory as -%% the suite. -%% -%% Execute with: -%% > ct_run -suite os_mon_mib_SUITE -config os_mon_mib_SUITE.cfg -%%----------------------------------------------------------------- - --include_lib("common_test/include/ct.hrl"). --include_lib("os_mon/include/OTP-OS-MON-MIB.hrl"). --include_lib("snmp/include/snmp_types.hrl"). - -% Test server specific exports --export([all/0, suite/0, groups/0, - init_per_suite/1, end_per_suite/1]). - - -% Test cases must be exported. --export([update_load_table/1]). - --export([get_mem_sys_mark/1, get_mem_proc_mark/1, get_disk_threshold/1, - get_load_table/1, get_disk_table/1, - real_snmp_request/1, load_unload/1]). - --export([sys_tot_mem/1, sys_used_mem/1, large_erl_process/1, - large_erl_process_mem/1, cpu_load/1, cpu_load5/1, cpu_load15/1, - os_wordsize/1, sys_tot_mem64/1, sys_used_mem64/1, - large_erl_process_mem64/1, disk_descr/1, disk_kbytes/1, - disk_capacity/1]). - --export([otp_6351/1, otp_7441/1]). - --define(TRAP_UDP, 5000). --define(AGENT_UDP, 4000). --define(CONF_FILE_VER, [v2]). --define(SYS_NAME, "Test os_mon_mibs"). --define(MAX_MSG_SIZE, 484). --define(ENGINE_ID, "mgrEngine"). --define(MGR_PORT, 5001). - -%%--------------------------------------------------------------------- - -suite() -> - [{ct_hooks,[ts_install_cth]}, - {timetrap,{minutes,6}}, - {require, snmp_mgr_agent, snmp}]. - -all() -> - [load_unload, get_mem_sys_mark, get_mem_proc_mark, - get_disk_threshold, get_load_table, - {group, get_next_load_table}, get_disk_table, - {group, get_next_disk_table}, real_snmp_request, - update_load_table, {group, tickets}]. - -groups() -> - [{tickets, [], [otp_6351, otp_7441]}, - {get_next_load_table, [], - [sys_tot_mem, sys_used_mem, large_erl_process, - large_erl_process_mem, cpu_load, cpu_load5, cpu_load15, - os_wordsize, sys_tot_mem64, sys_used_mem64, - large_erl_process_mem64]}, - {get_next_disk_table, [], - [disk_descr, disk_kbytes, disk_capacity]}]. - - -%%--------------------------------------------------------------------- -%%-------------------------------------------------------------------- -%% Function: init_per_suite(Config) -> Config -%% Config - [tuple()] -%% A list of key/value pairs, holding the test case configuration. -%% Description: Initiation before the whole suite -%% -%% Note: This function is free to add any key/value pairs to the Config -%% variable, but should NOT alter/remove any existing entries. -%%-------------------------------------------------------------------- -init_per_suite(Config) -> - application:start(sasl), - application:start(mnesia), - application:start(os_mon), - - ok = ct_snmp:start(Config,snmp_mgr_agent), - - %% Load the mibs that should be tested - otp_mib:load(snmp_master_agent), - os_mon_mib:load(snmp_master_agent), - - Config. -%%-------------------------------------------------------------------- -%% Function: end_per_suite(Config) -> _ -%% Config - [tuple()] -%% A list of key/value pairs, holding the test case configuration. -%% Description: Cleanup after the whole suite -%%-------------------------------------------------------------------- -end_per_suite(Config) -> - PrivDir = proplists:get_value(priv_dir, Config), - ConfDir = filename:join(PrivDir,"conf"), - DbDir = filename:join(PrivDir,"db"), - MgrDir = filename:join(PrivDir, "mgr"), - - %% Uload mibs - snmpa:unload_mibs(snmp_master_agent,["OTP-OS-MON-MIB"]), - otp_mib:unload(snmp_master_agent), - - %% Clean up - application:stop(snmp), - application:stop(mnesia), - application:stop(os_mon), - - del_dir(ConfDir), - del_dir(DbDir), - (catch del_dir(MgrDir)), - ok. - -%%--------------------------------------------------------------------- -%% Test cases -%%--------------------------------------------------------------------- - -%% Test to unload and the reload the OTP.mib -load_unload(Config) when is_list(Config) -> - os_mon_mib:unload(snmp_master_agent), - os_mon_mib:load(snmp_master_agent), - ok. -%%--------------------------------------------------------------------- - -%% check os_mon_mib:update_load_table error handling -update_load_table(Config) when is_list(Config) -> - Node = start_node(), - ok = rpc:call(Node,application,start,[sasl]), - ok = rpc:call(Node,application,start,[os_mon]), - ok = os_mon_mib:update_load_table(), - rpc:call(Node,application,stop,[os_mon]), - ok = os_mon_mib:update_load_table(), - stop_node(Node), - ok. - -%% like update_load_table, when memsup_system_only==true -otp_6351(Config) when is_list(Config) -> - Node = start_node(), - ok = rpc:call(Node,application,start,[sasl]), - ok = rpc:call(Node,application,load,[os_mon]), - ok = rpc:call(Node,application,set_env, - [os_mon,memsup_system_only,true]), - ok = rpc:call(Node,application,start,[os_mon]), - Res = rpc:call(Node,os_mon_mib,get_load,[Node]), - if - is_tuple(Res), element(1, Res)==loadTable -> - ok; - true -> - ct:fail(Res) - end, - rpc:call(Node,application,stop,[os_mon]), - stop_node(Node), - ok. - - -%%--------------------------------------------------------------------- -%% Simulates a get call to test the instrumentation function -%% for the loadMemorySystemWatermark variable. -get_mem_sys_mark(Config) when is_list(Config) -> - case os_mon_mib:mem_sys_mark(get) of - {value, SysMark} when is_integer(SysMark) -> - ok; - _ -> - ct:fail(sys_mark_value_not_integer) - end. -%%--------------------------------------------------------------------- -%% Simulates a get call to test the instrumentation function -%% for the loadMemoryErlProcWatermark variable. -get_mem_proc_mark(Config) when is_list(Config) -> - case os_mon_mib:mem_proc_mark(get) of - {value, ProcMark} when is_integer(ProcMark) -> - ok; - _ -> - ct:fail(proc_mark_value_not_integer) - end. -%%--------------------------------------------------------------------- -%% Simulates a get call to test the instrumentation function -%% for the diskAlmostFullThreshold variable. -get_disk_threshold(Config) when is_list(Config) -> - case os_mon_mib:disk_threshold(get) of - {value, ProcMark} when is_integer(ProcMark) -> - ok; - _ -> - ct:fail(disk_threshold_value_not_integer) - end. -%%--------------------------------------------------------------------- - -%%% Note that when we have a string key, as in loadTable, the -%%% instrumentation will deal with the [length(String), String]. We -%%% have to know about this, when short cutting SNMP and calling -%%% instrumentation functions directly as done in most test cases in -%%% this test suite - -%% Simulates get calls to test the instrumentation function -%% for the loadTable -get_load_table(Config) when is_list(Config) -> - - NodeStr = atom_to_list(node()), - NodeLen = length(NodeStr), - - {_, _, {Pid, _}} = memsup:get_memory_data(), - PidStr = lists:flatten(io_lib:format("~w", [Pid])), - [{value, NodeStr},{value, PidStr}] = - os_mon_mib:load_table(get, [NodeLen | NodeStr], - [?loadErlNodeName, ?loadLargestErlProcess]), - - Values = os_mon_mib:load_table(get, [NodeLen | NodeStr] , - [?loadSystemTotalMemory, - ?loadSystemUsedMemory, - ?loadLargestErlProcessUsedMemory, - ?loadCpuLoad, - ?loadCpuLoad5, - ?loadCpuLoad15, - ?loadOsWordsize, - ?loadSystemTotalMemory64, - ?loadSystemUsedMemory64, - ?loadLargestErlProcessUsedMemory64]), - - IsInt = fun({value, Val}) when is_integer(Val) -> - true; - (_) -> - false - end, - - NewValues = lists:filter(IsInt, Values), - - case length(NewValues) of - 10 -> - ok; - _ -> - ct:fail(value_not_integer) - end, - - [{noValue,noSuchInstance}, {noValue,noSuchInstance}, - {noValue,noSuchInstance}, {noValue,noSuchInstance}, - {noValue,noSuchInstance}, {noValue,noSuchInstance}, - {noValue,noSuchInstance}, {noValue,noSuchInstance}, - {noValue,noSuchInstance}, {noValue,noSuchInstance}, - {noValue,noSuchInstance}, {noValue,noSuchInstance}] = - os_mon_mib:load_table(get, [3, 102, 111, 111], - [?loadErlNodeName, - ?loadSystemTotalMemory, - ?loadSystemUsedMemory, - ?loadLargestErlProcess, - ?loadLargestErlProcessUsedMemory, - ?loadCpuLoad, - ?loadCpuLoad5, - ?loadCpuLoad15, - ?loadOsWordsize, - ?loadSystemTotalMemory64, - ?loadSystemUsedMemory64, - ?loadLargestErlProcessUsedMemory64]), - - ok. -%%--------------------------------------------------------------------- - -sys_tot_mem(Config) when is_list(Config) -> - [{[?loadSystemTotalMemory, Len | NodeStr], Mem}] = - os_mon_mib:load_table(get_next, [], [?loadSystemTotalMemory]), - Len = length(NodeStr), - true = lists:member(list_to_atom(NodeStr), [node() | nodes()]), - - case Mem of - Mem when is_integer(Mem) -> - ok; - _ -> - ct:fail(sys_tot_mem_value_not_integer) - end. - -sys_used_mem(Config) when is_list(Config) -> - [{[?loadSystemUsedMemory, Len | NodeStr], Mem}] = - os_mon_mib:load_table(get_next,[], [?loadSystemUsedMemory]), - Len = length(NodeStr), - true = lists:member(list_to_atom(NodeStr), [node() | nodes()]), - - case Mem of - Mem when is_integer(Mem) -> - ok; - _ -> - ct:fail(sys_used_mem_value_not_integer) - end. - -large_erl_process(Config) when is_list(Config) -> - {_, _, {Pid, _}} = memsup:get_memory_data(), - PidStr = lists:flatten(io_lib:format("~w", [Pid])), - [{[?loadLargestErlProcess, Len | NodeStr], PidStr}] = - os_mon_mib:load_table(get_next,[], [?loadLargestErlProcess]), - Len = length(NodeStr), - true = lists:member(list_to_atom(NodeStr), [node() | nodes()]), - ok. - -large_erl_process_mem(Config) when is_list(Config) -> - - [{[?loadLargestErlProcessUsedMemory, Len | NodeStr], Mem}] = - os_mon_mib:load_table(get_next,[], - [?loadLargestErlProcessUsedMemory]), - Len = length(NodeStr), - true = lists:member(list_to_atom(NodeStr), [node() | nodes()]), - - case Mem of - Mem when is_integer(Mem) -> - ok; - _ -> - ct:fail(erl_pid_mem_value_not_integer) - end. - -cpu_load(Config) when is_list(Config) -> - [{[?loadCpuLoad, Len | NodeStr], Load}] = - os_mon_mib:load_table(get_next,[], [?loadCpuLoad]), - Len = length(NodeStr), - true = lists:member(list_to_atom(NodeStr), [node() | nodes()]), - - case Load of - Load when is_integer(Load) -> - ok; - _ -> - ct:fail(cpu_load_value_not_integer) - end. - -cpu_load5(Config) when is_list(Config) -> - [{[?loadCpuLoad5, Len | NodeStr], Load}] = - os_mon_mib:load_table(get_next,[], [?loadCpuLoad5]), - Len = length(NodeStr), - true = lists:member(list_to_atom(NodeStr), [node() | nodes()]), - - case Load of - Load when is_integer(Load) -> - ok; - _ -> - ct:fail(cpu_load5_value_not_integer) - end. - -cpu_load15(Config) when is_list(Config) -> - [{[?loadCpuLoad15, Len | NodeStr], Load}] = - os_mon_mib:load_table(get_next,[], [?loadCpuLoad15]), - Len = length(NodeStr), - true = lists:member(list_to_atom(NodeStr), [node() | nodes()]), - - case Load of - Load when is_integer(Load) -> - ok; - _ -> - ct:fail(cpu_load15_value_not_integer) - end. - -os_wordsize(Config) when is_list(Config) -> - [{[?loadOsWordsize, Len | NodeStr], Wordsize}] = - os_mon_mib:load_table(get_next,[], [?loadOsWordsize]), - Len = length(NodeStr), - true = lists:member(list_to_atom(NodeStr), [node() | nodes()]), - - case Wordsize of - Wordsize when is_integer(Wordsize) -> - ok; - _ -> - ct:fail(os_wordsize_value_not_integer) - end. - -sys_tot_mem64(Config) when is_list(Config) -> - [{[?loadSystemTotalMemory64, Len | NodeStr], Mem}] = - os_mon_mib:load_table(get_next, [], [?loadSystemTotalMemory64]), - Len = length(NodeStr), - true = lists:member(list_to_atom(NodeStr), [node() | nodes()]), - - case Mem of - Mem when is_integer(Mem) -> - ok; - _ -> - ct:fail(sys_tot_mem_value_not_integer) - end. - -sys_used_mem64(Config) when is_list(Config) -> - [{[?loadSystemUsedMemory64, Len | NodeStr], Mem}] = - os_mon_mib:load_table(get_next,[], [?loadSystemUsedMemory64]), - Len = length(NodeStr), - true = lists:member(list_to_atom(NodeStr), [node() | nodes()]), - - case Mem of - Mem when is_integer(Mem) -> - ok; - _ -> - ct:fail(sys_used_mem_value_not_integer) - end. - -large_erl_process_mem64(Config) when is_list(Config) -> - - [{[?loadLargestErlProcessUsedMemory64, Len | NodeStr], Mem}] = - os_mon_mib:load_table(get_next,[], - [?loadLargestErlProcessUsedMemory64]), - Len = length(NodeStr), - true = lists:member(list_to_atom(NodeStr), [node() | nodes()]), - - case Mem of - Mem when is_integer(Mem) -> - ok; - _ -> - ct:fail(erl_pid_mem_value_not_integer) - end. -%%--------------------------------------------------------------------- -%% Simulates get calls to test the instrumentation function -%% for the diskTable. -get_disk_table(Config) when is_list(Config) -> - - DiskData = disksup:get_disk_data(), - DiskDataLen = length(DiskData), - - if - DiskDataLen > 0 -> - [{value, Value}] = - os_mon_mib:disk_table(get, [1,1], [?diskDescr]), - - case is_list(Value) of - true -> - ok; - false -> - ct:fail(value_not_a_string) - end, - - Values = os_mon_mib:disk_table(get, [1,1], - [?diskId, - ?diskKBytes, - ?diskCapacity]), - - IsInt = fun({value, Val}) when is_integer(Val) -> - true; - (_) -> - false - end, - - NewValues = lists:filter(IsInt, Values), - - case length(NewValues) of - 3 -> - ok; - _ -> - ct:fail(value_not_integer) - end - end, - - [{noValue,noSuchInstance}, {noValue,noSuchInstance}, - {noValue,noSuchInstance}, {noValue,noSuchInstance}] = - os_mon_mib:disk_table(get, [1, DiskDataLen + 1], [?diskId, - ?diskDescr, - ?diskKBytes, - ?diskCapacity]), - - ok. - -%%--------------------------------------------------------------------- - -disk_descr(Config) when is_list(Config) -> - [{[?diskDescr, 1,1], Descr}] = - os_mon_mib:disk_table(get_next, [], [?diskDescr]), - - case Descr of - Descr when is_list(Descr) -> - ok; - _ -> - ct:fail(disk_descr_value_not_a_string) - end. - -disk_kbytes(Config) when is_list(Config) -> - [{[?diskKBytes, 1,1], Kbytes}] = - os_mon_mib:disk_table(get_next,[], [?diskKBytes]), - - case Kbytes of - Kbytes when is_integer(Kbytes) -> - ok; - _ -> - ct:fail(disk_kbytes_value_not_integer) - end. - - -disk_capacity(Config) when is_list(Config) -> - [{[?diskCapacity, 1,1], Capacity}] = - os_mon_mib:disk_table(get_next,[], [?diskCapacity]), - - case Capacity of - Capacity when is_integer(Capacity) -> - ok; - _ -> - ct:fail(disk_capacity_value_not_integer) - end. - -%%--------------------------------------------------------------------- -%% Starts an snmp manager and sends a real snmp-request. i.e. -%% sends a udp message on the correct format. -real_snmp_request(Config) when is_list(Config) -> - NodStr = atom_to_list(node()), - Len = length(NodStr), - {_, _, {Pid, _}} = memsup:get_memory_data(), - PidStr = lists:flatten(io_lib:format("~w", [Pid])), - io:format("FOO: ~p~n", [PidStr]), - ok = snmp_get([?loadEntry ++ - [?loadLargestErlProcess, Len | NodStr]], - PidStr), - ok = snmp_get_next([?loadEntry ++ - [?loadSystemUsedMemory, Len | NodStr]], - ?loadEntry ++ [?loadSystemUsedMemory + 1, Len - | NodStr], PidStr), - ok = snmp_set([?loadEntry ++ [?loadLargestErlProcess, Len | NodStr]], - s, "<0.101.0>", Config), - ok. - -%% Starts an snmp manager and requests total memory. Was previously -%% integer32 which was errornous on 64 bit machines. -otp_7441(Config) when is_list(Config) -> - NodStr = atom_to_list(node()), - Len = length(NodStr), - Oids = [Oid|_] = [?loadEntry ++ [?loadSystemTotalMemory, Len | NodStr]], - {noError,0,[#varbind{oid = Oid, variabletype = 'Unsigned32'}]} = - ct_snmp:get_values(os_mon_mib_test, Oids, snmp_mgr_agent), - - ok. - -%%--------------------------------------------------------------------- -%% Internal functions -%%--------------------------------------------------------------------- -start_node() -> - Pa = filename:dirname(code:which(?MODULE)), - {ok,Node} = test_server:start_node(testnisse, slave, [{args, " -pa " ++ Pa}]), - Node. - -stop_node(Node) -> - test_server:stop_node(Node). - -del_dir(Dir) -> - io:format("Deleting: ~s~n",[Dir]), - {ok, Files} = file:list_dir(Dir), - FullPathFiles = lists:map(fun(File) -> filename:join(Dir, File) end, - Files), - lists:foreach(fun file:delete/1, FullPathFiles), - file:del_dir(Dir). - -%%--------------------------------------------------------------------- -snmp_get(Oids = [Oid |_], Result) -> - {noError,0,[#varbind{oid = Oid, - variabletype = 'OCTET STRING', - value = Result}]} = - ct_snmp:get_values(os_mon_mib_test, Oids, snmp_mgr_agent), - ok. - -snmp_get_next(Oids, NextOid, Result) -> - {noError,0,[#varbind{oid = NextOid, - variabletype = 'OCTET STRING', - value = Result}]} = - ct_snmp:get_next_values(os_mon_mib_test, Oids, snmp_mgr_agent), - ok. - -snmp_set(Oid, ValuType, Value, Config) -> - {notWritable, _, _} = - ct_snmp:set_values(os_mon_mib_test, [{Oid, ValuType, Value}], - snmp_mgr_agent, Config), - ok. diff --git a/lib/os_mon/vsn.mk b/lib/os_mon/vsn.mk index 4a327e5506..9713f6bc6b 100644 --- a/lib/os_mon/vsn.mk +++ b/lib/os_mon/vsn.mk @@ -1 +1 @@ -OS_MON_VSN = 2.4.5 +OS_MON_VSN = 2.4.7 |