KEYCLOAK-2710 Improve hibernate statistics report
This commit is contained in:
parent
8f1292494f
commit
20fe2b75b5
1 changed files with 61 additions and 12 deletions
|
@ -21,6 +21,8 @@ import javax.persistence.EntityManagerFactory;
|
||||||
|
|
||||||
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;
|
||||||
|
@ -32,6 +34,8 @@ import org.keycloak.services.scheduled.ScheduledTask;
|
||||||
*/
|
*/
|
||||||
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);
|
||||||
|
|
||||||
|
@ -53,21 +57,66 @@ public class HibernateStatsReporter implements ScheduledTask {
|
||||||
|
|
||||||
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)
|
|
||||||
.append("executionCount=" + queryStats.getExecutionCount()).append(lineSep)
|
|
||||||
.append("executionAvgTime=" + queryStats.getExecutionAvgTime()).append(" ms").append(lineSep)
|
|
||||||
.append(lineSep);
|
|
||||||
|
|
||||||
builder.append(lineSep);
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.infof(builder.toString());
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue