/**
* Helios, OpenSource Monitoring
* Brought to you by the Helios Development Group
*
* Copyright 2007, Helios Development Group and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*
*/
package org.helios.apmrouter.hibernate;
import java.util.Date;
import org.helios.apmrouter.server.ServerComponentBean;
import org.hibernate.SessionFactory;
import org.hibernate.jmx.StatisticsService;
import org.springframework.jmx.export.annotation.ManagedAttribute;
import org.springframework.jmx.export.annotation.ManagedMetric;
import org.springframework.jmx.export.annotation.ManagedOperation;
import org.springframework.jmx.export.annotation.ManagedOperationParameter;
import org.springframework.jmx.export.annotation.ManagedOperationParameters;
import org.springframework.jmx.support.MetricType;
/**
* <p>Title: HibernateStatsService</p>
* <p>Description: Wrapper for the Hibernate stats service {@link StatisticsService} to expose internal stats as open data types</p>
* <p>Company: Helios Development Group LLC</p>
* @author Whitehead (nwhitehead AT heliosdev DOT org)
* <p><code>org.helios.apmrouter.hibernate.HibernateStatsService</code></p>
*/
public class HibernateStatsService extends ServerComponentBean implements HibernateStatsServiceMXBean {
/** The delegate stats service */
protected final StatisticsService delegate = new StatisticsService();
/**
* Creates a new HibernateStatsService
* @param sessionFactory The session factory to monitor
*/
public HibernateStatsService(SessionFactory sessionFactory) {
delegate.setSessionFactory(sessionFactory);
}
/**
* {@inheritDoc}
* @see org.helios.apmrouter.hibernate.HibernateStatsServiceMXBean#clear()
*/
@Override
@ManagedOperation(description="Resets the JMX Hibernate statistics")
public void clear() {
delegate.clear();
}
/**
* {@inheritDoc}
* @see org.helios.apmrouter.hibernate.HibernateStatsServiceMXBean#getEntityStatistics(java.lang.String)
*/
@Override
@ManagedOperation(description="Retrieves the Hibernate entity statistics for the passed entity name")
@ManagedOperationParameters({@ManagedOperationParameter(name="entityName", description="The name of the Hibernate entity to acquire statistics for")})
public OpenEntityStatisticsMBean getEntityStatistics(String entityName) {
return new OpenEntityStatistics(delegate.getEntityStatistics(entityName));
}
/**
* {@inheritDoc}
* @see org.helios.apmrouter.hibernate.HibernateStatsServiceMXBean#getEntityStatistics()
*/
@Override
@ManagedAttribute(description="The Hibernate entity statistics")
public OpenEntityStatisticsMBean[] getEntityStatistics() {
String[] keys = getEntityNames();
OpenEntityStatisticsMBean[] stats = new OpenEntityStatisticsMBean[keys.length];
for(int i = 0; i < keys.length; i++) {
stats[i] = getEntityStatistics(keys[i]);
}
return stats;
}
/**
* {@inheritDoc}
* @see org.helios.apmrouter.hibernate.HibernateStatsServiceMXBean#getCollectionStatistics(java.lang.String)
*/
@Override
@ManagedOperation(description="Retrieves the Hibernate collection statistics for the passed collection role")
@ManagedOperationParameters({@ManagedOperationParameter(name="role", description="The name of the Hibernate role to acquire collection statistics for")})
public OpenCollectionStatisticsMBean getCollectionStatistics(String role) {
return new OpenCollectionStatistics(delegate.getCollectionStatistics(role));
}
/**
* {@inheritDoc}
* @see org.helios.apmrouter.hibernate.HibernateStatsServiceMXBean#getCollectionStatistics()
*/
@Override
@ManagedAttribute(description="The Hibernate collection statistics")
public OpenCollectionStatisticsMBean[] getCollectionStatistics() {
String[] keys = getCollectionRoleNames();
OpenCollectionStatisticsMBean[] stats = new OpenCollectionStatisticsMBean[keys.length];
for(int i = 0; i < keys.length; i++) {
stats[i] = getCollectionStatistics(keys[i]);
}
return stats;
}
// /**
// * @param regionName
// * @return
// * @see org.hibernate.jmx.StatisticsService#getSecondLevelCacheStatistics(java.lang.String)
// */
// public SecondLevelCacheStatistics getSecondLevelCacheStatistics(
// String regionName) {
// return delegate.getSecondLevelCacheStatistics(regionName);
// }
/**
* {@inheritDoc}
* @see org.helios.apmrouter.hibernate.HibernateStatsServiceMXBean#getQueryStatistics(java.lang.String)
*/
@Override
@ManagedOperation(description="Retrieves the Hibernate query statistics for the passed sql")
@ManagedOperationParameters({@ManagedOperationParameter(name="hql", description="The hql to retrieve the Hibernate query statistics for")})
public OpenQueryStatisticsMBean getQueryStatistics(String hql) {
return new OpenQueryStatistics(delegate.getQueryStatistics(hql));
}
/**
* {@inheritDoc}
* @see org.helios.apmrouter.hibernate.HibernateStatsServiceMXBean#getQueryStatistics()
*/
@Override
@ManagedAttribute(description="The Hibernate query statistics")
public OpenQueryStatisticsMBean[] getQueryStatistics() {
String[] keys = getQueries();
OpenQueryStatisticsMBean[] stats = new OpenQueryStatisticsMBean[keys.length];
for(int i = 0; i < keys.length; i++) {
stats[i] = getQueryStatistics(keys[i]);
}
return stats;
}
/**
* {@inheritDoc}
* @see org.helios.apmrouter.hibernate.HibernateStatsServiceMXBean#getEntityDeleteCount()
*/
@Override
@ManagedMetric(category="Hibernate", displayName="EntityDeleteCount", metricType=MetricType.COUNTER, description="The total number of deleted entities")
public long getEntityDeleteCount() {
return delegate.getEntityDeleteCount();
}
/**
* {@inheritDoc}
* @see org.helios.apmrouter.hibernate.HibernateStatsServiceMXBean#getEntityInsertCount()
*/
@Override
@ManagedMetric(category="Hibernate", displayName="EntityInsertCount", metricType=MetricType.COUNTER, description="The total number of inserted entities")
public long getEntityInsertCount() {
return delegate.getEntityInsertCount();
}
/**
* {@inheritDoc}
* @see org.helios.apmrouter.hibernate.HibernateStatsServiceMXBean#getEntityLoadCount()
*/
@Override
@ManagedMetric(category="Hibernate", displayName="EntityLoadCount", metricType=MetricType.COUNTER, description="The total number of loaded entities")
public long getEntityLoadCount() {
return delegate.getEntityLoadCount();
}
/**
* {@inheritDoc}
* @see org.helios.apmrouter.hibernate.HibernateStatsServiceMXBean#getEntityFetchCount()
*/
@Override
@ManagedMetric(category="Hibernate", displayName="EntityFetchCount", metricType=MetricType.COUNTER, description="The total number of fetched entities")
public long getEntityFetchCount() {
return delegate.getEntityFetchCount();
}
/**
* {@inheritDoc}
* @see org.helios.apmrouter.hibernate.HibernateStatsServiceMXBean#getEntityUpdateCount()
*/
@Override
@ManagedMetric(category="Hibernate", displayName="EntityUpdateCount", metricType=MetricType.COUNTER, description="The total number of updated entities")
public long getEntityUpdateCount() {
return delegate.getEntityUpdateCount();
}
/**
* {@inheritDoc}
* @see org.helios.apmrouter.hibernate.HibernateStatsServiceMXBean#getQueryExecutionCount()
*/
@Override
@ManagedMetric(category="Hibernate", displayName="QueryExecutionCount", metricType=MetricType.COUNTER, description="The total number of executed queries")
public long getQueryExecutionCount() {
return delegate.getQueryExecutionCount();
}
/**
* {@inheritDoc}
* @see org.helios.apmrouter.hibernate.HibernateStatsServiceMXBean#getQueryCacheHitCount()
*/
@Override
@ManagedMetric(category="Hibernate", displayName="QueryCacheHitCount", metricType=MetricType.COUNTER, description="The query cache hit count")
public long getQueryCacheHitCount() {
return delegate.getQueryCacheHitCount();
}
/**
* {@inheritDoc}
* @see org.helios.apmrouter.hibernate.HibernateStatsServiceMXBean#getQueryExecutionMaxTime()
*/
@Override
@ManagedMetric(category="Hibernate", displayName="QueryExecutionMaxTime", metricType=MetricType.GAUGE, description="The maximum query execution time in ms.")
public long getQueryExecutionMaxTime() {
return delegate.getQueryExecutionMaxTime();
}
/**
* {@inheritDoc}
* @see org.helios.apmrouter.hibernate.HibernateStatsServiceMXBean#getQueryCacheMissCount()
*/
@Override
@ManagedMetric(category="Hibernate", displayName="QueryCacheMissCount", metricType=MetricType.COUNTER, description="The query cache miss count")
public long getQueryCacheMissCount() {
return delegate.getQueryCacheMissCount();
}
/**
* {@inheritDoc}
* @see org.helios.apmrouter.hibernate.HibernateStatsServiceMXBean#getQueryCachePutCount()
*/
@Override
@ManagedMetric(category="Hibernate", displayName="QueryCachePutCount", metricType=MetricType.COUNTER, description="The query cache put count")
public long getQueryCachePutCount() {
return delegate.getQueryCachePutCount();
}
/**
* {@inheritDoc}
* @see org.helios.apmrouter.hibernate.HibernateStatsServiceMXBean#getFlushCount()
*/
@Override
@ManagedMetric(category="Hibernate", displayName="FlushCount", metricType=MetricType.COUNTER, description="The hibernate flush count")
public long getFlushCount() {
return delegate.getFlushCount();
}
/**
* {@inheritDoc}
* @see org.helios.apmrouter.hibernate.HibernateStatsServiceMXBean#getConnectCount()
*/
@Override
@ManagedMetric(category="Hibernate", displayName="ConnectCount", metricType=MetricType.COUNTER, description="The global number of connections asked by the sessions")
public long getConnectCount() {
return delegate.getConnectCount();
}
/**
* {@inheritDoc}
* @see org.helios.apmrouter.hibernate.HibernateStatsServiceMXBean#getSessionCloseCount()
*/
@Override
@ManagedMetric(category="Hibernate", displayName="CloseCount", metricType=MetricType.COUNTER, description="The global number of sessions closed")
public long getSessionCloseCount() {
return delegate.getSessionCloseCount();
}
/**
* {@inheritDoc}
* @see org.helios.apmrouter.hibernate.HibernateStatsServiceMXBean#getSessionOpenCount()
*/
@Override
@ManagedMetric(category="Hibernate", displayName="SessionOpenCount", metricType=MetricType.COUNTER, description="The number of open sessions")
public long getSessionOpenCount() {
return delegate.getSessionOpenCount();
}
/**
* {@inheritDoc}
* @see org.helios.apmrouter.hibernate.HibernateStatsServiceMXBean#getCollectionLoadCount()
*/
@Override
@ManagedMetric(category="Hibernate", displayName="CollectionLoadCount", metricType=MetricType.COUNTER, description="The number of loaded collections")
public long getCollectionLoadCount() {
return delegate.getCollectionLoadCount();
}
/**
* {@inheritDoc}
* @see org.helios.apmrouter.hibernate.HibernateStatsServiceMXBean#getCollectionFetchCount()
*/
@Override
@ManagedMetric(category="Hibernate", displayName="CollectionFetchCount", metricType=MetricType.COUNTER, description="The number of fetched collections")
public long getCollectionFetchCount() {
return delegate.getCollectionFetchCount();
}
/**
* {@inheritDoc}
* @see org.helios.apmrouter.hibernate.HibernateStatsServiceMXBean#getCollectionUpdateCount()
*/
@Override
@ManagedMetric(category="Hibernate", displayName="CollectionUpdateCount", metricType=MetricType.COUNTER, description="The number of updated collections")
public long getCollectionUpdateCount() {
return delegate.getCollectionUpdateCount();
}
/**
* {@inheritDoc}
* @see org.helios.apmrouter.hibernate.HibernateStatsServiceMXBean#getCollectionRemoveCount()
*/
@Override
@ManagedMetric(category="Hibernate", displayName="CollectionRemoveCount", metricType=MetricType.COUNTER, description="The number of removed collections")
public long getCollectionRemoveCount() {
return delegate.getCollectionRemoveCount();
}
/**
* {@inheritDoc}
* @see org.helios.apmrouter.hibernate.HibernateStatsServiceMXBean#getCollectionRecreateCount()
*/
@Override
@ManagedMetric(category="Hibernate", displayName="CollectionRecreateCount", metricType=MetricType.COUNTER, description="The number of recreated collections")
public long getCollectionRecreateCount() {
return delegate.getCollectionRecreateCount();
}
/**
* {@inheritDoc}
* @see org.helios.apmrouter.hibernate.HibernateStatsServiceMXBean#getStartTime()
*/
@Override
@ManagedAttribute(description="The service start timestamp")
public long getStartTime() {
return delegate.getStartTime();
}
/**
* {@inheritDoc}
* @see org.helios.apmrouter.hibernate.HibernateStatsServiceMXBean#getStartDate()
*/
@Override
@ManagedAttribute(description="The service start date")
public Date getStartDate() {
return new Date(delegate.getStartTime());
}
/**
* {@inheritDoc}
* @see org.helios.apmrouter.hibernate.HibernateStatsServiceMXBean#isStatisticsEnabled()
*/
@Override
@ManagedAttribute(description="The enabled state of the service")
public boolean isStatisticsEnabled() {
return delegate.isStatisticsEnabled();
}
/**
* {@inheritDoc}
* @see org.helios.apmrouter.hibernate.HibernateStatsServiceMXBean#setStatisticsEnabled(boolean)
*/
@Override
@ManagedAttribute(description="The enabled state of the service")
public void setStatisticsEnabled(boolean enable) {
delegate.setStatisticsEnabled(enable);
}
/**
* {@inheritDoc}
* @see org.helios.apmrouter.hibernate.HibernateStatsServiceMXBean#logSummary()
*/
@Override
@ManagedOperation(description="Logs the statistics to standard out")
public void logSummary() {
delegate.logSummary();
}
/**
* {@inheritDoc}
* @see org.helios.apmrouter.hibernate.HibernateStatsServiceMXBean#getCollectionRoleNames()
*/
@Override
@ManagedAttribute(description="An array of the collection role names")
public String[] getCollectionRoleNames() {
return delegate.getCollectionRoleNames();
}
/**
* {@inheritDoc}
* @see org.helios.apmrouter.hibernate.HibernateStatsServiceMXBean#getEntityNames()
*/
@Override
@ManagedAttribute(description="An array of the entity names")
public String[] getEntityNames() {
return delegate.getEntityNames();
}
/**
* {@inheritDoc}
* @see org.helios.apmrouter.hibernate.HibernateStatsServiceMXBean#getQueries()
*/
@Override
@ManagedAttribute(description="An array of the queries")
public String[] getQueries() {
return delegate.getQueries();
}
/**
* {@inheritDoc}
* @see org.helios.apmrouter.hibernate.HibernateStatsServiceMXBean#getSuccessfulTransactionCount()
*/
@Override
@ManagedMetric(category="Hibernate", displayName="SuccessfulTransactionCount", metricType=MetricType.COUNTER, description="The number of successful transactions")
public long getSuccessfulTransactionCount() {
return delegate.getSuccessfulTransactionCount();
}
/**
* {@inheritDoc}
* @see org.helios.apmrouter.hibernate.HibernateStatsServiceMXBean#getTransactionCount()
*/
@Override
@ManagedMetric(category="Hibernate", displayName="TransactionCount", metricType=MetricType.COUNTER, description="The number of executed transactions")
public long getTransactionCount() {
return delegate.getTransactionCount();
}
/**
* {@inheritDoc}
* @see org.helios.apmrouter.hibernate.HibernateStatsServiceMXBean#getCloseStatementCount()
*/
@Override
@ManagedMetric(category="Hibernate", displayName="CloseStatementCount", metricType=MetricType.COUNTER, description="The number of closed statements")
public long getCloseStatementCount() {
return delegate.getCloseStatementCount();
}
/**
* {@inheritDoc}
* @see org.helios.apmrouter.hibernate.HibernateStatsServiceMXBean#getPrepareStatementCount()
*/
@Override
@ManagedMetric(category="Hibernate", displayName="PrepareStatementCount", metricType=MetricType.COUNTER, description="The number of prepared statements acquired")
public long getPrepareStatementCount() {
return delegate.getPrepareStatementCount();
}
/**
* {@inheritDoc}
* @see org.helios.apmrouter.hibernate.HibernateStatsServiceMXBean#getOptimisticFailureCount()
*/
@Override
@ManagedMetric(category="Hibernate", displayName="OptimisticFailureCount", metricType=MetricType.COUNTER, description="The number of optimistic failures")
public long getOptimisticFailureCount() {
return delegate.getOptimisticFailureCount();
}
/**
* {@inheritDoc}
* @see org.helios.apmrouter.hibernate.HibernateStatsServiceMXBean#getQueryExecutionMaxTimeQueryString()
*/
@Override
@ManagedAttribute(description="The HQL of the slowest query")
public String getQueryExecutionMaxTimeQueryString() {
return delegate.getQueryExecutionMaxTimeQueryString();
}
/**
* @return
* @see java.lang.Object#toString()
*/
public String toString() {
return delegate.toString();
}
}