#==============================================================================
# JVM Management MIB - Instrumentation Classes
#==============================================================================
In this directory:
------------------
README: this file
commands.env: a file containing some ksh variables & functions
that I have used to generate & compile all the
stuff. Probably only valid in my own environment.
logging.properties: logging.properties file that can be used to obtain
trace information.
*.java: utility and custom classes for the JVM Management MIB.
These classes show how to provide instrumentation for
a mibgen generated MIB, how to simulate virtual tables,
and how to make use of the SnmpUserDataFactory.
Only the jvmMemory group and its tables are instrumented.
Dependency
----------
jvmManagementMib.txt : the JVM Management MIB module in compilable form.
Tiger SNMP Runtime : SNMP Runtime classes for Tiger. We assume these
classes could be part of the JMX delivery
(classes in com.sun.jmx.snmp.*)
JDMK 5.1 : The jdmktk.jar contains the com.sun.jdmk.tools.MibGen class
used to compile the MIB. JDMK also has a mibgen.sh script
to start mibgen. By default mibgen generates code that can
integrate with JDMK SNMP runtime. In order to generate
code that integrate with Tiger SNMP runtime, you need to
start mibgen with a non-default resource file.
JDMK 5.1 workspace contains a mibgen resource file
specific for tiger: mibgen.property.tiger
Custom Instrumentation Code: the files in this directory.
How to proceed:
---------------
Get mibgen from JDMK 5.1. Start mibgen with mibgen resource file for
on the Java command line.
Use mibgen to generate code for the jvmManagementMib.txt file. Note that
the custom classes provided in this directory are all in the
sun.management.snmp.jvminstr package, and expect the generated classes to
be in another sun.management.snmp.jvmmib package (use mibgen option
If this package name does not suit you, simply change it to something else,
both in the custom classes below (you might use 'sed' or do it manually)
and in the -tp option that you will pass to mibgen.
It is recommended to generate all classes in a different directory (if
you read command.env you will see that I have put the custom classes
in a "custom" directory, and the generated classes in a "parsed"
directory. This makes it easier to cleanup the mib. You can safely
do a rm -rf <parsed> and call mibgen again.
Then compile the generated classes - you will need JMX and Tiger SNMP
runtime classes in your classpath - if you compile with a tiger build that
already have them then you don't need to specify anything special.
Then make your classpath point to the compiled generated classes, and
compile the custom code in this directory.
Then you can use the SnmpDaemonTest class to start a JVM with the
intsrumented MIB, and you can use e.g. the easymanager contrib of
JDMK to view the MIB through SNMP.
#==============================================================================
# Classes Details
#==============================================================================
Utility Classes developped for the JVM Management MIB:
------------------------------------------------------
JvmContextFactory.java : The context factory allocates a Map that
serves as request contextual cache.
Values obtained from JSR 163 API can be
cached in this object.
A request contextual cache is allocated
each time a request is being processed,
and is released at the end of processing.
Object: 1) preserve atomicity
2) minimize API calls
3) ensure consistency of the
various pieces of data returned.
MibLogger.java : Send traces to java.util.logging
SnmpTableHandler.java : an interface used to access table data.
SnmpCachedData.java : This object can be use to cache a snapshot
of the data contained in a table.
SnmpTableCache.java : A weak cache for table data. The data is
computed on demand and cached in a
weakreference. Makes it possible to specify
a validity period for the cache data.
SnmpListTableCache.java : Extends SnmpTableCache - for tables whose
data is returned in a List object.
SnmpNamedListTableCache.java : Extends SnmpListTableCache - for tables whose
elements can be named by a unique string.
SnmpDaemonTest.java : A dummy standalone SNMP agent that registers
the JVM Managemnt MIB in Tiger's SNMP
adaptor. This is the "main". Note that
this not the class that will be used to
start the adaptor in the final Tiger - it is
just a dummy test main.
JVM Management MIB
------------------
JVM_MANAGEMENT_MIB_IMPL.java : subclasses the generated JVM_MANAGEMENT_MIB
class.
Object: overriding factory method in order
to instantiate custom code instead
of generated code.
JVM Memory Group
----------------
JvmMemoryImpl.java : Provides instrumentation for the jvmMemory
group. Replaces the generated JvmMemory class,
which is not used and can be thrown away.
Implements the generated JvmMemoryMBean
interface (which was also implemented by
the generated JvmMemory skeleton class)
Use the request contextual cache
in order to ensure consistency when
returning MemoryUsage datas. Note that all
tables in this group have been implemented
as virtual tables. As a consequence, the
generated TableJvmMemXXXXXTable.java classes
are not needed.
JvmMemoryMetaImpl.java : Custom MetaData class for the jvmMemory group.
Subclasses the generated JvmMemoryMeta class.
Object: overrides the factory methods in order
to instantiate custom meta data classes
for the jvmMemManagerTable,
jvmMemGCTable,
jvmMemPoolTable,
jvmMemMgrPoolRelTable.
JVM Memory Manager Table
------------------------
JvmMemManagerTableMetaImpl.java : Custom MetaData class for the
jvmMemManagerTable. This MetaData traps
all the SNMP Runtime calls made to the
table - in order to make the Memory Manager
table virtual: i.e. the table does not have
to be maintained permanently in memory.
Instead, the table is computed "on demand",
and the data is cached in a weak cache
(see SnmpNamedListTableCache) which remains
valid for a few ms. If the data is found
to be obsolete, or was garbage collected,
the table is recomputed.
JvmMemManagerEntryImpl.java : Custom Entry class for jvmMemManagerTable.
Entries are created on the fly when it
becomes necessary to get data from a
Memory Managers. They are temporary objects
that wrap the MemoryManager just for the
call duration - and are released just after.
JVM Memory GC Table
-------------------
JvmMemGCTableMetaImpl.java : Custom MetaData class for the
jvmMemGCTable. This MetaData traps
all the SNMP Runtime calls made to the
table - in order to make the GC
table virtual: the GC table reuses the
cached data computed for the
jvmMemManagerTable - simply acting as a
filter that only shows those elements that
are instance of GarbageCollectorMetrics.
In other words it implements a fitered view
of the jvmMemManagerTable.
JvmMemGCEntryImpl.java : Provide access to the data specific to
GarbageCollectorMetrics objects. Objects
of this classes are created on the fly,
when data needs to be returned from a
GarbageCollectorMetrics object, and are
released just after. They are not kept in
memory.
JVM Memory Pool Table
---------------------
JvmMemPoolTableMetaImpl.java : Custom MetaData class for the jvmMemPoolTable.
This is quite similar to what was done for
the jvmMemManagerTable in
JvmMemManagerTableMetaImpl. Most of the code
here was obtain by cut&paste-ing from
JvmMemManagerTableMetaImpl and replacing
"Manager" with "Pool".
JvmMemPoolEntryImpl.java : Provide access to the data specific to
MemoryPoolMetrics objects. Objects
of this classes are created on the fly,
when data needs to be returned from a
MemoryPoolMetrics object, and are
released just after. They are not kept in
memory. Use the request contextual cache
in order to ensure consistency when
returning MemoryUsage datas.
JVM Memory Manager / Memory Pool Relation Table
------------------------------------------------
JvmMemMgrPoolRelTableMetaImpl.java : Custom MetaData class for the
jvmMemMgrPoolRelTable. This meta data
uses the JvmMemManagerTableMetaImpl and
JvmMemPoolTableMetaImpl in order to
find out the content of the
jvmMemManagerTable and the mapping between
Memory Pool Name and Memory Pool Index.
For each element of the jvmMemManagerTable
it calls the JSR 163 APIs to find the
related Memory Pool, then finds out their
index, and then creates the corresponding
row in the jvmMemMgrPoolRelTable cached data.
Like all the other tables, this table is
virtual: the data is kept on a weak cache
and recomputed on demand, if its validity
as expired or if it has been gc'ed.
JvmMemMgrPoolRelEntryImpl.java : A simple couple MemoryManager/MemoryPool.
Models a row in the jvmMemMgrPoolRelTable.
Objects of this type are cached in the
jvmMemMgrPoolRelTable cached data.
#==============================================================================
#==============================================================================