aboutsummaryrefslogtreecommitdiffstats
path: root/lib/otp_mibs/src
diff options
context:
space:
mode:
authorErlang/OTP <[email protected]>2009-11-20 14:54:40 +0000
committerErlang/OTP <[email protected]>2009-11-20 14:54:40 +0000
commit84adefa331c4159d432d22840663c38f155cd4c1 (patch)
treebff9a9c66adda4df2106dfd0e5c053ab182a12bd /lib/otp_mibs/src
downloadotp-84adefa331c4159d432d22840663c38f155cd4c1.tar.gz
otp-84adefa331c4159d432d22840663c38f155cd4c1.tar.bz2
otp-84adefa331c4159d432d22840663c38f155cd4c1.zip
The R13B03 release.OTP_R13B03
Diffstat (limited to 'lib/otp_mibs/src')
-rw-r--r--lib/otp_mibs/src/Makefile105
-rw-r--r--lib/otp_mibs/src/otp_mib.erl198
-rw-r--r--lib/otp_mibs/src/otp_mibs.app.src27
-rw-r--r--lib/otp_mibs/src/otp_mibs.appup.src20
4 files changed, 350 insertions, 0 deletions
diff --git a/lib/otp_mibs/src/Makefile b/lib/otp_mibs/src/Makefile
new file mode 100644
index 0000000000..833a439adb
--- /dev/null
+++ b/lib/otp_mibs/src/Makefile
@@ -0,0 +1,105 @@
+#
+# %CopyrightBegin%
+#
+# Copyright Ericsson AB 2003-2009. All Rights Reserved.
+#
+# The contents of this file are subject to the Erlang Public License,
+# Version 1.1, (the "License"); you may not use this file except in
+# compliance with the License. You should have received a copy of the
+# Erlang Public License along with this software. If not, it can be
+# retrieved online at http://www.erlang.org/.
+#
+# Software distributed under the License is distributed on an "AS IS"
+# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+# the License for the specific language governing rights and limitations
+# under the License.
+#
+# %CopyrightEnd%
+#
+include $(ERL_TOP)/make/target.mk
+
+ifeq ($(TYPE),debug)
+ERL_COMPILE_FLAGS += -Ddebug -W
+endif
+
+include $(ERL_TOP)/make/$(TARGET)/otp.mk
+
+# ----------------------------------------------------
+# Application version
+# ----------------------------------------------------
+include ../vsn.mk
+VSN=$(OTP_MIBS_VSN)
+
+# ----------------------------------------------------
+# Release directory specification
+# ----------------------------------------------------
+RELSYSDIR = $(RELEASE_PATH)/lib/otp_mibs-$(VSN)
+# ----------------------------------------------------
+# Target Specs
+# ----------------------------------------------------
+MODULES = \
+ otp_mib
+
+INCLUDE=../include
+
+HRL_FILES =
+
+INTERNAL_HRL_FILES =
+
+ERL_FILES = $(MODULES:%=%.erl)
+
+APP_FILE = otp_mibs.app
+APP_SRC = $(APP_FILE).src
+APP_TARGET = $(EBIN)/$(APP_FILE)
+
+APPUP_FILE = otp_mibs.appup
+APPUP_SRC = $(APPUP_FILE).src
+APPUP_TARGET = $(EBIN)/$(APPUP_FILE)
+
+TARGET_FILES = $(MODULES:%=$(EBIN)/%.$(EMULATOR))
+
+TARGETS = $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET)
+
+# ----------------------------------------------------
+# FLAGS
+# ----------------------------------------------------
+ERL_COMPILE_FLAGS += -I$(INCLUDE) +warn_obsolete_guard
+
+# ----------------------------------------------------
+# Targets
+# ----------------------------------------------------
+
+debug opt: $(TARGETS)
+
+clean:
+ rm -f $(TARGETS_FILES)
+ rm -f $(APP_TARGET)
+ rm -f $(APPUP_TARGET)
+ rm -f core
+
+docs:
+
+# ----------------------------------------------------
+# Special Build Targets
+# ----------------------------------------------------
+
+$(APP_TARGET): $(APP_SRC) ../vsn.mk
+ sed -e 's;%VSN%;$(VSN);' $< > $@
+
+$(APPUP_TARGET): $(APPUP_SRC) ../vsn.mk
+ sed -e 's;%VSN%;$(VSN);' $< > $@
+
+# ----------------------------------------------------
+# Release Target
+# ----------------------------------------------------
+include $(ERL_TOP)/make/otp_release_targets.mk
+
+release_spec: opt
+ $(INSTALL_DIR) $(RELSYSDIR)/src
+ $(INSTALL_DATA) $(ERL_FILES) $(RELSYSDIR)/src
+ $(INSTALL_DIR) $(RELSYSDIR)/ebin
+ $(INSTALL_DATA) $(TARGETS) $(RELSYSDIR)/ebin
+
+release_docs_spec:
+
+
diff --git a/lib/otp_mibs/src/otp_mib.erl b/lib/otp_mibs/src/otp_mib.erl
new file mode 100644
index 0000000000..e8b0e51b91
--- /dev/null
+++ b/lib/otp_mibs/src/otp_mib.erl
@@ -0,0 +1,198 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(otp_mib).
+%%%-----------------------------------------------------------------
+%%% Description: This module implements the OTP-MIB.
+%%% The tables are implemented as shadow tables with the module
+%%% snmp_shadow_table.
+%%%-----------------------------------------------------------------
+
+%% API
+-export([load/1, unload/1]).
+
+%% SNMP instrumentation
+-export([erl_node_table/1, erl_node_table/3, appl_table/1, appl_table/3]).
+
+%% SNMP shadow functions
+-export([update_erl_node_table/0, update_appl_table/0]).
+
+%% Exported for internal use via rpc
+-export([get_erl_node/1, get_appls/1]).
+
+%% Shadow tables
+-record(erlNodeTable,
+ {erlNodeId, erlNodeName, erlNodeMachine, erlNodeVersion,
+ erlNodeRunQueue,
+ erlNodeRunTime, erlNodeWallClock, erlNodeReductions,
+ erlNodeProcesses, erlNodeInBytes, erlNodeOutBytes}).
+
+-record(applTable, {key = '_', applName = '_', applDescr = '_',
+ applVsn = '_'}).
+
+%% Shadow argument macros
+-define(erlNodeShadowArgs,
+ {erlNodeTable, integer, record_info(fields, erlNodeTable), 5000,
+ {otp_mib, update_erl_node_table}}).
+
+-define(applShadowArgs,
+ {applTable, {integer, integer}, record_info(fields, applTable),
+ 5000, {otp_mib, update_appl_table}}).
+
+%% Misc
+-record(erlNodeAlloc, {nodeName, nodeId}).
+
+%%%=========================================================================
+%%% API
+%%%=========================================================================
+
+%%-------------------------------------------------------------------------
+%% load(Agent) -> ok | {error, Reason}
+%% Agent - pid() | atom()
+%% Reason - term()
+%% Description: Loads the OTP-MIB
+%%-------------------------------------------------------------------------
+load(Agent) ->
+ MibDir = code:priv_dir(otp_mibs) ++ "/mibs",
+ snmpa:load_mibs(Agent, [MibDir ++ "/OTP-MIB"]).
+
+%%-------------------------------------------------------------------------
+%% unload(Agent) -> ok | {error, Reason}
+%% Agent - pid() | atom()
+%% Reason - term()
+%% Description: Loads the OTP-MIB
+%%-------------------------------------------------------------------------
+unload(Agent) ->
+ snmpa:unload_mibs(Agent, ["OTP-MIB"]).
+
+
+%%%=========================================================================
+%%% SNMP instrumentation
+%%%=========================================================================
+erl_node_table(new) ->
+ Tab = erlNodeAlloc,
+ 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, erlNodeAlloc)},
+ {local_content, true},
+ {Storage, Nodes}],
+ {atomic, ok} = mnesia:create_table(Tab, Props)
+ end,
+ ok = mnesia:dirty_write({erlNodeAlloc, next_index, 1}),
+ update_node_alloc([node() | nodes()]),
+ snmp_shadow_table:table_func(new, ?erlNodeShadowArgs).
+
+erl_node_table(Op, RowIndex, Cols) ->
+ snmp_shadow_table:table_func(Op, RowIndex, Cols, ?erlNodeShadowArgs).
+
+
+appl_table(Op) ->
+ snmp_shadow_table:table_func(Op, ?applShadowArgs).
+appl_table(Op, RowIndex, Cols) ->
+ snmp_shadow_table:table_func(Op, RowIndex, Cols, ?applShadowArgs).
+
+
+%%%=========================================================================
+%%% SNMP shadow functions
+%%%=========================================================================
+update_erl_node_table() ->
+ delete_all(erlNodeTable),
+ Nodes = [node() | nodes()],
+ update_node_alloc(Nodes),
+ lists:foreach(
+ fun(Node) ->
+ [{_,_,Idx}] = mnesia:dirty_read({erlNodeAlloc, Node}),
+ ErlNode = rpc:call(Node, otp_mib, get_erl_node, [Idx]),
+ ok = mnesia:dirty_write(ErlNode)
+ end, Nodes).
+
+update_appl_table() ->
+ delete_all(applTable),
+ Nodes = [node() | nodes()],
+ update_node_alloc(Nodes),
+ lists:foreach(
+ fun(Node) ->
+ [{_,_,Idx}] = mnesia:dirty_read({erlNodeAlloc, Node}),
+ Appls = rpc:call(Node, otp_mib, get_appls, [Idx]),
+ lists:foreach(fun(Appl) ->
+ ok = mnesia:dirty_write(Appl)
+ end, Appls)
+ end, Nodes).
+
+%%%========================================================================
+%%% Exported for internal use via rpc
+%%%========================================================================
+get_erl_node(Id) ->
+ IO = erlang:statistics(io),
+ #erlNodeTable{erlNodeId = Id,
+ erlNodeName = atom_to_list(node()),
+ erlNodeVersion = erlang:system_info(version),
+ erlNodeMachine = erlang:system_info(machine),
+ erlNodeRunQueue = erlang:statistics(run_queue),
+ erlNodeRunTime = element(1, erlang:statistics(runtime)),
+ erlNodeWallClock =
+ element(1, erlang:statistics(wall_clock)),
+ erlNodeReductions =
+ element(1, erlang:statistics(reductions)),
+ erlNodeProcesses = length(processes()),
+ erlNodeInBytes = element(2, element(1, IO)),
+ erlNodeOutBytes = element(2, element(2, IO))}.
+
+get_appls(NodeId) ->
+ element(1,
+ lists:mapfoldl(
+ fun({ApplName, ApplDescr, ApplVsn}, ApplId) ->
+ {#applTable{key = {NodeId, ApplId},
+ applName = atom_to_list(ApplName),
+ applDescr = ApplDescr,
+ applVsn = ApplVsn},
+ ApplId + 1}
+ end, 1, application:which_applications())).
+
+%%%========================================================================
+%%% Internal functions
+%%%========================================================================
+update_node_alloc([Node | T]) ->
+ case mnesia:dirty_read({erlNodeAlloc, Node}) of
+ [] ->
+ [{_, _, Idx}] = mnesia:dirty_read({erlNodeAlloc, next_index}),
+ ok = mnesia:dirty_write(#erlNodeAlloc{nodeName = Node,
+ nodeId = Idx}),
+ ok = mnesia:dirty_write({erlNodeAlloc, next_index, Idx + 1});
+ _ ->
+ ok
+ end,
+ update_node_alloc(T);
+update_node_alloc([]) -> ok.
+
+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).
diff --git a/lib/otp_mibs/src/otp_mibs.app.src b/lib/otp_mibs/src/otp_mibs.app.src
new file mode 100644
index 0000000000..b177af0709
--- /dev/null
+++ b/lib/otp_mibs/src/otp_mibs.app.src
@@ -0,0 +1,27 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2003-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+
+{application, otp_mibs,
+ [{description, "SNMP managment information base for Erlang/OTP nodes."},
+ {vsn, "%VSN%"},
+ {modules, [otp_mib]},
+ {registered, []},
+ {applications, [kernel, stdlib, snmp]},
+ {env,[]}]}.
+
diff --git a/lib/otp_mibs/src/otp_mibs.appup.src b/lib/otp_mibs/src/otp_mibs.appup.src
new file mode 100644
index 0000000000..5e99dfe325
--- /dev/null
+++ b/lib/otp_mibs/src/otp_mibs.appup.src
@@ -0,0 +1,20 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2003-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+
+{"%VSN%",[],[]}.