Skip to content

Commit

Permalink
KEYCLOAK-2710 Improve hibernate statistics report
Browse files Browse the repository at this point in the history
  • Loading branch information
mposolda committed Mar 24, 2016
1 parent 8f12924 commit 20fe2b7
Showing 1 changed file with 59 additions and 10 deletions.
Expand Up @@ -21,6 +21,8 @@


import org.hibernate.SessionFactory; import org.hibernate.SessionFactory;
import org.hibernate.jpa.internal.EntityManagerFactoryImpl; import org.hibernate.jpa.internal.EntityManagerFactoryImpl;
import org.hibernate.stat.CollectionStatistics;
import org.hibernate.stat.EntityStatistics;
import org.hibernate.stat.QueryStatistics; import org.hibernate.stat.QueryStatistics;
import org.hibernate.stat.Statistics; import org.hibernate.stat.Statistics;
import org.jboss.logging.Logger; import org.jboss.logging.Logger;
Expand All @@ -32,6 +34,8 @@
*/ */
public class HibernateStatsReporter implements ScheduledTask { public class HibernateStatsReporter implements ScheduledTask {


private static final int LIMIT = 100; // Just hardcoded for now

private final EntityManagerFactory emf; private final EntityManagerFactory emf;
private static final Logger logger = Logger.getLogger(HibernateStatsReporter.class); private static final Logger logger = Logger.getLogger(HibernateStatsReporter.class);


Expand All @@ -53,21 +57,66 @@ public void run(KeycloakSession session) {


protected void logStats(Statistics stats) { protected void logStats(Statistics stats) {
String lineSep = System.getProperty("line.separator"); String lineSep = System.getProperty("line.separator");
StringBuilder builder = new StringBuilder(lineSep).append(stats.toString()).append(lineSep); StringBuilder builder = new StringBuilder(lineSep).append(stats.toString()).append(lineSep).append(lineSep);
builder.append(lineSep).append("Queries statistics: ").append(lineSep).append(lineSep);


for (String query : stats.getQueries()) { logEntities(builder, lineSep, stats);
QueryStatistics queryStats = stats.getQueryStatistics(query); logCollections(builder, lineSep, stats);
logQueries(builder, lineSep, stats);


builder.append(query).append(lineSep) logger.infof(builder.toString());
.append("executionCount=" + queryStats.getExecutionCount()).append(lineSep) }
.append("executionAvgTime=" + queryStats.getExecutionAvgTime()).append(" ms").append(lineSep)
.append(lineSep);


builder.append(lineSep);
protected void logEntities(StringBuilder builder, String lineSep, Statistics stats) {
builder.append("Important entities statistics: ").append(lineSep);
for (String entity : stats.getEntityNames()) {
EntityStatistics entityStats = stats.getEntityStatistics(entity);
if (entityStats.getInsertCount() > LIMIT || entityStats.getDeleteCount() > LIMIT || entityStats.getUpdateCount() > LIMIT || entityStats.getLoadCount() > LIMIT || entityStats.getFetchCount() > LIMIT) {
builder.append(entity + " - ")
.append("inserted: " + entityStats.getInsertCount())
.append(", updated: " + entityStats.getUpdateCount())
.append(", removed: " + entityStats.getDeleteCount())
.append(", loaded: " + entityStats.getLoadCount())
.append(", fetched: " + entityStats.getFetchCount())
.append(lineSep);
}
} }
builder.append(lineSep);
}


logger.infof(builder.toString());
protected void logCollections(StringBuilder builder, String lineSep, Statistics stats) {
builder.append("Important collections statistics: ").append(lineSep);
for (String col : stats.getCollectionRoleNames()) {
CollectionStatistics collectionStats = stats.getCollectionStatistics(col);
if (collectionStats.getRecreateCount() > LIMIT || collectionStats.getUpdateCount() > LIMIT || collectionStats.getRemoveCount() > LIMIT ||
collectionStats.getLoadCount() > LIMIT || collectionStats.getFetchCount() > LIMIT) {
builder.append(col + " - ")
.append("recreated: " + collectionStats.getRecreateCount())
.append(", updated: " + collectionStats.getUpdateCount())
.append(", removed: " + collectionStats.getRemoveCount())
.append(", loaded: " + collectionStats.getLoadCount())
.append(", fetched: " + collectionStats.getFetchCount())
.append(lineSep);
}
}
builder.append(lineSep);
}


protected void logQueries(StringBuilder builder, String lineSep, Statistics stats) {
builder.append("Important queries statistics: ").append(lineSep).append(lineSep);
for (String query : stats.getQueries()) {
QueryStatistics queryStats = stats.getQueryStatistics(query);

if (queryStats.getExecutionCount() > LIMIT || (queryStats.getExecutionCount() * queryStats.getExecutionAvgTime() > LIMIT)) {
builder.append(query).append(lineSep)
.append("executionCount=" + queryStats.getExecutionCount()).append(lineSep)
.append("executionAvgTime=" + queryStats.getExecutionAvgTime()).append(" ms").append(lineSep)
.append(lineSep)
.append(lineSep);
}
}
} }


} }

0 comments on commit 20fe2b7

Please sign in to comment.