OpenJPA
  1. OpenJPA
  2. OPENJPA-1844

Create a JConsole plugin to display DataCache statistics and help tune the cache

    Details

    • Type: Improvement Improvement
    • Status: Closed
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: None
    • Fix Version/s: 2.1.0
    • Component/s: datacache, instrumentation
    • Labels:
      None

      Description

      I have created a simple JConsole plugin that will enable a OpenJPA user to view DataCache statistics and it also allows for some runtime interactions with the cache. These changes are going to come in two parts. The first part will be the plugin side of changes and second part is going to come via another JIRA which will feature the OpenJPA core runtime changes.

      The features that I have currently implemented are:

      • A view of cache hits, reads, and writes.
      • A button to evict the entire contents of the cache.
      • A button to reset the statistics.
      • A check box to enable / disable statistics gathering
      • The ability to disable / enable caching specific types.

      I would like to add the following features:

      • Show the current DataCache configuration and show what (if any) changes have been made at runtime (ie: Stopped caching a certain type).
      • Allow changing the cache size.
      • Evict only a certain type.
      • Make some cute bar charts for hit/miss ratio.

      This works both in a JSE environment and in a WebSphere environment(sans security). I'll add more details on how to run jconsole with the plugin once I have some code committed.

      1. screenshot.jpg
        74 kB
        Rick Curtis

        Activity

        Hide
        Rick Curtis added a comment -

        Closing resolved issues.

        Show
        Rick Curtis added a comment - Closing resolved issues.
        Hide
        Michael Dick added a comment -

        If there's more work to be done for this issue please re-open, or open a sub task for the remaining work.

        Show
        Michael Dick added a comment - If there's more work to be done for this issue please re-open, or open a sub task for the remaining work.
        Hide
        Rick Curtis added a comment -

        With revision 1028808 I committed all of the changes for the JConsole plugin to openjpa-tools... but I messed up the commit message. See OPENJPA-1801 for the commit. I took a 180 from my original commit as I removed the dependency on ANY runtime code and now it can run in a true standalone fashion.

        [java_home]\bin>jconsole.exe -pluginpath openjpa-tools-0.1.0-SNAPSHOT.jar

        A few things to note:

        • This plugin is now completely independent from the OpenJPA runtime code. I had to make use of java.util.ResourceBundle and java.text.MessageFormat for localization of strings.
        • To launch the plugin you no longer need to specify the classpath.
        • I added org.apache.openjpa.jconsole.DataCacheMBean interface which includes a subset of the runtimes MBean interface(org.apache.openjpa.instrumentation.jmx.DataCacheJMXInstrumentMBean). I did this as a convenience so I could use JMX.newMBeanProxy(...), rather than using the 'reflection' way of invoking MBean methods.
        Show
        Rick Curtis added a comment - With revision 1028808 I committed all of the changes for the JConsole plugin to openjpa-tools... but I messed up the commit message. See OPENJPA-1801 for the commit. I took a 180 from my original commit as I removed the dependency on ANY runtime code and now it can run in a true standalone fashion. [java_home] \bin>jconsole.exe -pluginpath openjpa-tools-0.1.0-SNAPSHOT.jar A few things to note: This plugin is now completely independent from the OpenJPA runtime code. I had to make use of java.util.ResourceBundle and java.text.MessageFormat for localization of strings. To launch the plugin you no longer need to specify the classpath. I added org.apache.openjpa.jconsole.DataCacheMBean interface which includes a subset of the runtimes MBean interface(org.apache.openjpa.instrumentation.jmx.DataCacheJMXInstrumentMBean). I did this as a convenience so I could use JMX.newMBeanProxy(...), rather than using the 'reflection' way of invoking MBean methods.
        Hide
        Jeremy Bauer added a comment -

        I think the JConsole/Swing code should be pulled out of kernel and included into a new trunk/openjpa-tools submodule. I don't think the tools artifacts should go into the base openjpa.jar, but wouldn't be opposed to putting it into the openjpa-all jar. Also, I think the binary distribution zip should include the tools jar along side the openjpa and openjpa-all jars.

        Show
        Jeremy Bauer added a comment - I think the JConsole/Swing code should be pulled out of kernel and included into a new trunk/openjpa-tools submodule. I don't think the tools artifacts should go into the base openjpa.jar, but wouldn't be opposed to putting it into the openjpa-all jar. Also, I think the binary distribution zip should include the tools jar along side the openjpa and openjpa-all jars.
        Hide
        Donald Woods added a comment -

        trunk/openjpa-tools would be the only other place, which would get pulled into the zip and openjpa-all.jar and/or openjpa.jar

        Show
        Donald Woods added a comment - trunk/openjpa-tools would be the only other place, which would get pulled into the zip and openjpa-all.jar and/or openjpa.jar
        Hide
        Rick Curtis added a comment -

        @Pinaki - Agreed. Any suggestions?

        Show
        Rick Curtis added a comment - @Pinaki - Agreed. Any suggestions?
        Hide
        Pinaki Poddar added a comment -

        While I like the feature, there must be a better way than to bring JConsole dependency to openjpa kerne

        Show
        Pinaki Poddar added a comment - While I like the feature, there must be a better way than to bring JConsole dependency to openjpa kerne
        Hide
        Donald Woods added a comment -

        Add code to handle different location of jconsole.jar on MacOSX in r1027257.

        Show
        Donald Woods added a comment - Add code to handle different location of jconsole.jar on MacOSX in r1027257.
        Hide
        Donald Woods added a comment -

        The following doesn't work on Mac OSX -
        <dependency>
        <groupId>sun.jconsole</groupId>
        <artifactId>jconsole</artifactId>
        <version>1.6.0</version>
        <scope>system</scope>
        <systemPath>$

        {java.home}/../lib/jconsole.jar</systemPath>
        </dependency>
        as there is no JRE vs. JDK separation. Instead it needs to be -
        <systemPath>${java.home}

        /lib/jconsole.jar</systemPath>

        Show
        Donald Woods added a comment - The following doesn't work on Mac OSX - <dependency> <groupId>sun.jconsole</groupId> <artifactId>jconsole</artifactId> <version>1.6.0</version> <scope>system</scope> <systemPath>$ {java.home}/../lib/jconsole.jar</systemPath> </dependency> as there is no JRE vs. JDK separation. Instead it needs to be - <systemPath>${java.home} /lib/jconsole.jar</systemPath>
        Hide
        Rick Curtis added a comment -

        A few comments for the initial code drop:

        • Look closely at the DataCacheManager changes. I added the ability to selectively start/stop caching a certain type.
        • Look closely at MetaDataRepository/ClassMetaData changes. I added a mapping of {String class name] -> java.lang.Class.

        There are still a few todos:

        • There are a number of strings in the plugin code that should be localized
        • Still need to add some unit tests for the new runtime changes.
        • Need to add doc.

        For any early tire kickers out there, here are the steps needed to get this plugin working (in JSE). I'm going to recommend using the Sun JVM for now.

        • Start a JPA application with openjpa.Instrumentation enabled for the DataCache[1].
        • After a EntityManager is created, launch the jconsole[2].
        • If you haven't enabled DataCache statistics, check the enable statistics box.

        [1] <property name="openjpa.Instrumentation" value="jmx(Instrument='DataCache,QueryCache')"/>
        [2] [java_home]\bin>jconsole.exe -pluginpath openjpa-all-2.1.0-SNAPSHOT.jar -J-Djava.class.path=..\lib\jconsole.jar;..\lib\tools.jar;openjpa-all-2.1.0-SNAPSHOT.jar

        Show
        Rick Curtis added a comment - A few comments for the initial code drop: Look closely at the DataCacheManager changes. I added the ability to selectively start/stop caching a certain type. Look closely at MetaDataRepository/ClassMetaData changes. I added a mapping of {String class name] -> java.lang.Class. There are still a few todos: There are a number of strings in the plugin code that should be localized Still need to add some unit tests for the new runtime changes. Need to add doc. For any early tire kickers out there, here are the steps needed to get this plugin working (in JSE). I'm going to recommend using the Sun JVM for now. Start a JPA application with openjpa.Instrumentation enabled for the DataCache [1] . After a EntityManager is created, launch the jconsole [2] . If you haven't enabled DataCache statistics, check the enable statistics box. [1] <property name="openjpa.Instrumentation" value="jmx(Instrument='DataCache,QueryCache')"/> [2] [java_home] \bin>jconsole.exe -pluginpath openjpa-all-2.1.0-SNAPSHOT.jar -J-Djava.class.path=..\lib\jconsole.jar;..\lib\tools.jar;openjpa-all-2.1.0-SNAPSHOT.jar
        Hide
        Rick Curtis added a comment -

        Attaching a screenshot of the JConsole UI.

        Show
        Rick Curtis added a comment - Attaching a screenshot of the JConsole UI.

          People

          • Assignee:
            Rick Curtis
            Reporter:
            Rick Curtis
          • Votes:
            1 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development