From 20fe2b75b5f439e6bbd6c004dafbfc5066f4a40c Mon Sep 17 00:00:00 2001 From: mposolda Date: Thu, 24 Mar 2016 09:47:48 +0100 Subject: [PATCH] KEYCLOAK-2710 Improve hibernate statistics report --- .../jpa/HibernateStatsReporter.java | 73 ++++++++++++++++--- 1 file changed, 61 insertions(+), 12 deletions(-) diff --git a/model/jpa/src/main/java/org/keycloak/connections/jpa/HibernateStatsReporter.java b/model/jpa/src/main/java/org/keycloak/connections/jpa/HibernateStatsReporter.java index fbe09ae47e..349bd40ab5 100644 --- a/model/jpa/src/main/java/org/keycloak/connections/jpa/HibernateStatsReporter.java +++ b/model/jpa/src/main/java/org/keycloak/connections/jpa/HibernateStatsReporter.java @@ -21,6 +21,8 @@ import javax.persistence.EntityManagerFactory; import org.hibernate.SessionFactory; 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.Statistics; import org.jboss.logging.Logger; @@ -32,6 +34,8 @@ import org.keycloak.services.scheduled.ScheduledTask; */ public class HibernateStatsReporter implements ScheduledTask { + private static final int LIMIT = 100; // Just hardcoded for now + private final EntityManagerFactory emf; private static final Logger logger = Logger.getLogger(HibernateStatsReporter.class); @@ -53,21 +57,66 @@ public class HibernateStatsReporter implements ScheduledTask { protected void logStats(Statistics stats) { String lineSep = System.getProperty("line.separator"); - StringBuilder builder = new StringBuilder(lineSep).append(stats.toString()).append(lineSep); - builder.append(lineSep).append("Queries statistics: ").append(lineSep).append(lineSep); + StringBuilder builder = new StringBuilder(lineSep).append(stats.toString()).append(lineSep).append(lineSep); - for (String query : stats.getQueries()) { - QueryStatistics queryStats = stats.getQueryStatistics(query); - - builder.append(query).append(lineSep) - .append("executionCount=" + queryStats.getExecutionCount()).append(lineSep) - .append("executionAvgTime=" + queryStats.getExecutionAvgTime()).append(" ms").append(lineSep) - .append(lineSep); - - builder.append(lineSep); - } + logEntities(builder, lineSep, stats); + logCollections(builder, lineSep, stats); + logQueries(builder, lineSep, stats); logger.infof(builder.toString()); } + + 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); + } + + + 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); + } + } + } + }