...
Currently, there is not a good way of surfacing Geronimo's server information so that an administrator can monitor the server's status. The architecture of using MBeans is established, but not fully exploited. This enhancement will take advantage of what Geronimo currently offers and extend it so that a server can tap into a cluster of servers and extract information from specific Geronimo servers or even aggregates of Geronimo servers.
Goal
The goal is to have at least one machine be able to reach out to all Geronimo servers in order to fetch data or even alter their state. This will be especially useful in the case of someone having to monitor a large number of Geronimo servers.
How it works
...
As part of the design, there are five major components.
Management Node(s): An instance of Geronimo that has sole purpose of managing and viewing information from Server Nodes, must include admin console.
Management Plugin: Will reside on all Management Nodes and will handle the connection to the Remote Control Plugin to pull relevant information and control the machine.
Connection Information DB: Resides on either a Management Node or a different database server, has Server Name, IP:Port information and JMX Authentication remote authentication information for all Server Nodes. Management Nodes use this information to connect to the Server Nodes
Server Node(s): An instance of Geronimo that runs as usual, can be Little G with our MBean and anywhere up from there.
Remote Control Plugin: Will be present on all Server Nodes, handle JSR-77 statistics collection, control the thread which takes snapshots of the server's current state.
The proposed solution would incorporate a scalable design, using the same methods to keep track of statistics and read them locally that it would be pulling them remotely from N machines. This is accomplished by creating a centralized MBean thin layer (Remote Control Plugin) that will work to be a tie-in point for all the statistics, taking a 'snapshot' of the current state of things every X minutes and recording in a database or XML file for a predetermined amount of time before there is rollover. With this MBean thin layer serving as a relay point for this data, we can simply connect to it via JMX remote OpenEJB authentication through the Management Plugin, or a different remote machine (i.e. a proposed 'management node') to pull the information, as well as gain control over functions such as simple start/stop/restart, or in the future could be expanded to deploying/uninstalling/redeploying across an entire cluster.
Due to the use of JMX, there There will not be an active connection from the management node to the server nodes at all times, and will instead be an on-demand connection that will be used only when control or information is requested, resulting in little network overhead.
Management Plugin Architecture
...
- Server group management
- Deploy/undeploy across multiple, set attributes across multiple, start/stop/restart multiple
- Historical statistics view for 1-n servers
- Ability to custom-define statistics collection per-machine, per-group, across entire cluster
- Manipulate snapshot interval, retention period
- Enable/disable archiving, define archiving time/retention
Currently Implemented
- Simple Tomcat statistics graph generation for localhost only
- Bytes/sec in
- Bytes/sec out
- Requests/sec
- Errors/sec
- Bytes/Request
- Processing Time/Request
- 1 hour time frame, 1 minute interval snapshots
Current Dependencies
- Geronimo 2.x Tomcat minimal
- Admin Console Plugin
- Pluto Plugin
- Dojo Plugin
Remote Control Plugin Architecture
Note |
---|
There are two methods to collect statistics
|
Collecting Statistics Using MEJB (Method 1)
The RCP, or collecting agent, The RCP will reside on the Server Node and will be in charge of preparing information for the Management Node. Since there are many statistics for different MBeans that the admin could potentially wish to track, we will use the MEJB class component that is already implemented in Geronimo to contact these MBeans.
The Master Controller will be is the collecting agent that will do the managerial tasks such as query the mbeans for their statusstatistics and what not. Additionally, the Master Controller will spawn a thread at the start of the server (or at deployment time) in order to keep an ongoing history of set timers via the EJB TimerService in order to periodically capture "snapshots." This term will refer to the server's status. The thread will stop and start with the GBean life-cycle of the RCPstatistics for a given time. With the timers set, we can save the history of the server's statistics. Upon request, the Master Controller will gather all of the information (either by calling MEJB or looking into the server's history stored by the Snapshot XML Builderin a database) and respond by shipping the data back to the Management Node.
Note: All stats will be JSR-77 compliant.
Taking snapshots
As of now, the RCP will spawn a threadcollecting agent will create EJB Timers, if it does not already exist, to capture the server's essential information. The thread will store On each callback the snapshot information on the server itself in the form of an XMLwill be stored to the local database residing on the Server Node. In order to preserve the history and not have a ridiculously large XML file, there will be a monthly (default, but can be configured) archive of the server's information stored locally. The information stored in these XML files are what is passed on to the Management Plugin for further processing.
Current Goals
Collecting Statistics Using Pure JMX (Method 2)
There is a second flavor of a collecting agent. The second option is to use pure JMX, bypassing the retrieval of the MEJB mbean in the server. All of the functionality is the same, because EJB timers are replaced with threads. Therefore, stopping a snapshot querying may take longer because of the use of threads as opposed to EJB Timers.
MEJB Method Dependencies
Code Block |
---|
agent-ejb // MEJB controller library
agent-ds // datasource plugin
agent-ear // packaging of agent-ejb and agent-jar
agent-jar // common utility classes used to talk to the DB
agent-sql // common sql commands to execute during deployment (used by agent-ds)
|
Pure JMX Method Depenedencies
Code Block |
---|
agent-car-jmx // JMX controller library
agent-ds // datasource plugin
agent-ear // packaging of agent-ejb and agent-jar
agent-jar // common utility classes used to talk to the DB
agent-sql // common sql commands to execute during deployment (used by agent-ds)
|
Using other Databases to store snapshot information on the Server Node
The current architecture of the collecting agent really comes in a pair of plugins (one for the providing the thin layer, and the other for providing that thin layer with a couple datasources). By modularizing these different entities, if the admin would swap out the Datasource with his/her own, the admin could save the snapshot information into any database that is supported by Geronimo. Other examples of notable plugins that use this technique of having a Datasource as a plugin are Jetspeed and Roller.
Database Schema (subject to change soon)
MBeans
-> id (PK)
-> mbeanName
-> statsNameList
Statistics
-> id (PK)
-> mbeanId (FK references MBeans.id)
-> snapshot_time
-> statsValueList
The values of MBeans.statsNameList and Statistics.statsValueList are CSV strings to represent an MBean's statistics name and value respectively. This is not the final design and will be changed.
Currently Implemented
- Archive snapshots every month
- Return arbitrary number of snapshots' information
- Ability to start/stop snapshot thread
- Ability to specify the duration of time in between snapshots
- Ability to fetch JSR-77 stats
- Ability to modify mbean attributes
- Ability to add additional mbeans to keep track of in the snapshot process
- Ability to remove mbeans from the list that the snapshot process refers to to get take its snapshots
- JSR-77 stats for Tomcat Connectors and Jetty Containers are surfaced
- Turn statistics option on for all StatisticsProvider components.
- Package collecting agent as a plugin (CAR) with a dependency on the MEJB module.
- Provide support for Jetty Connector stats (in Geronimo's code-base)
Current Goals
- Restore statistics option (on or off) when the collecting agent is undeployed.
- Provide ability
- Extract stats using the JSR-77 model
- Provide support for Jetty stats
- Provide interface to add/remote/update servers controlled and monitored
- Tie start/stop of the snapshot thread with the start/stop of the Geronimo Kernel. Currently, the Management Node has to manually start the snapshot process (not practical).
- Provide interface to control the stopping/starting of components within server .
- Upgrade portlet to be compatible with the new Pluggable Administration Console.
- Design a good way to enumerate all existing MBeans available on the Server Nodes for the Management Plugin.
Current Concerns
- Security of the JMX connection information residing on the Connection Information DB
Screenshots
...
- using StateManageable Objects (SMO).
Current Concerns
- The connection between client and server requires for the server to have OpenEJB installed. This will tremendously limit the plugin to work only with Application Servers with OpenEJB. Perhaps JMX remoting is another option or alternative.