#1345 - Refactor io.ebean.meta.MetaInfoManager API (query execution metrics). Breaking change for people collecting query execution metrics.

This commit is contained in:
Rob Bygrave
2018-03-10 02:51:51 +13:00
parent eda6350d89
commit 85bfe3d03e
79 changed files with 928 additions and 466 deletions
+25
View File
@@ -1,6 +1,9 @@
package io.ebean;
import io.ebean.annotation.Platform;
import io.ebean.meta.BasicMetricVisitor;
import io.ebean.meta.MetaTimedMetric;
import io.ebean.meta.MetricType;
import io.ebean.util.StringHelper;
import io.ebeaninternal.api.SpiEbeanServer;
import io.ebeaninternal.api.SpiQuery;
@@ -14,6 +17,8 @@ import org.slf4j.LoggerFactory;
import org.tests.model.basic.Country;
import java.sql.Types;
import java.util.List;
import java.util.stream.Collectors;
import static org.assertj.core.api.Assertions.assertThat;
@@ -52,6 +57,26 @@ public abstract class BaseTestCase {
}
}
protected void resetAllMetrics() {
server().getMetaInfoManager().resetAllMetrics();
}
protected BasicMetricVisitor visitMetricsBasic() {
return server().getMetaInfoManager().visitBasic();
}
protected List<MetaTimedMetric> visitTimedMetrics() {
return visitMetricsBasic().getTimedMetrics();
}
protected List<MetaTimedMetric> sqlMetrics() {
List<MetaTimedMetric> timedMetrics = visitTimedMetrics();
return timedMetrics.stream()
.filter((it) -> it.getMetricType() == MetricType.SQL)
.collect(Collectors.toList());
}
/**
* Return the generated sql trimming column alias if required.
*/
+29 -15
View File
@@ -1,7 +1,11 @@
package io.ebean;
import io.ebean.meta.BasicMetricVisitor;
import io.ebean.meta.MetaQueryMetric;
import io.ebean.meta.MetaTimedMetric;
import org.ebeantest.LoggedSqlCollector;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
import org.tests.model.basic.Contact;
@@ -13,18 +17,23 @@ import static org.assertj.core.api.Assertions.assertThat;
public class DtoQueryFromOrmTest extends BaseTestCase {
// @BeforeClass
// public static void resetStats() {
// Ebean.getDefaultServer().getMetaInfoManager().collectQueryStatistics(true);
// }
//
// @AfterClass
// public static void reportStats() {
// List<MetaQueryMetric> stats = Ebean.getDefaultServer().getMetaInfoManager().collectQueryStatistics(false);
// for (MetaQueryMetric stat : stats) {
// System.out.println(stat);
// }
// }
@BeforeClass
public static void resetStats() {
Ebean.getDefaultServer().getMetaInfoManager().resetAllMetrics();
}
@AfterClass
public static void reportStats() {
BasicMetricVisitor basic = Ebean.getDefaultServer().getMetaInfoManager().visitBasic();
for (MetaQueryMetric metric : basic.getDtoQueryMetrics()) {
System.out.println(metric);
}
System.out.println("-- transaction metrics --");
for (MetaTimedMetric metric : basic.getTimedMetrics()) {
System.out.println(metric);
}
}
@Ignore
@Test
@@ -32,9 +41,9 @@ public class DtoQueryFromOrmTest extends BaseTestCase {
ResetBasicData.reset();
Ebean.getDefaultServer().getMetaInfoManager().collectQueryStatistics(true);
resetAllMetrics();
String[] prefix = {"Bl", "B", "Red"};
String[] prefix = {"Bl", "B", "Red", "jim"};
for (String val : prefix) {
List<ContactDto> list = Ebean.find(Contact.class)
@@ -43,12 +52,15 @@ public class DtoQueryFromOrmTest extends BaseTestCase {
.orderBy().asc("lastName")
.setMaxRows(10)
.asDto(ContactDto.class)
.setLabel("prefixLoop")
.findList();
System.out.println("List:" + list);
}
List<MetaQueryMetric> stats = Ebean.getDefaultServer().getMetaInfoManager().collectQueryStatistics(true);
BasicMetricVisitor basic = visitMetricsBasic();
List<MetaQueryMetric> stats = basic.getDtoQueryMetrics();
for (MetaQueryMetric stat : stats) {
System.out.println(stat);
}
@@ -72,6 +84,7 @@ public class DtoQueryFromOrmTest extends BaseTestCase {
.where().isNotNull("email").isNotNull("lastName")
.orderBy().asc("lastName")
.asDto(ContactDto.class)
.setLabel("explicitId")
.setRelaxedMode();
List<ContactDto> dtos = query.findList();
@@ -126,6 +139,7 @@ public class DtoQueryFromOrmTest extends BaseTestCase {
List<ContactDto> contactDtos
= Ebean.find(Contact.class)
.setLabel("emailFullName")
.select("email, concat(lastName,', ',firstName) as fullName")
.where().isNotNull("email").isNotNull("lastName")
.orderBy().asc("lastName")
+10 -4
View File
@@ -1,5 +1,6 @@
package io.ebean;
import io.ebean.meta.BasicMetricVisitor;
import io.ebean.meta.MetaQueryMetric;
import org.ebeantest.LoggedSqlCollector;
import org.junit.Test;
@@ -102,7 +103,7 @@ public class DtoQueryTest extends BaseTestCase {
ResetBasicData.reset();
server().getMetaInfoManager().collectQueryStatistics(true);
resetAllMetrics();
String[] names = {"Rob", "Fiona", "Shrek"};
@@ -116,14 +117,17 @@ public class DtoQueryTest extends BaseTestCase {
log.info("Found " + custs);
}
List<MetaQueryMetric> stats = server().getMetaInfoManager().collectQueryStatistics(false);
// collect without reset
BasicMetricVisitor basic = new BasicMetricVisitor(false, true, true);
server().getMetaInfoManager().visitMetrics(basic);
List<MetaQueryMetric> stats = basic.getDtoQueryMetrics();
assertThat(stats).hasSize(1);
MetaQueryMetric queryMetric = stats.get(0);
assertThat(queryMetric.getLabel()).isEqualTo("basic");
assertThat(queryMetric.getCount()).isEqualTo(3);
assertThat(queryMetric.getName()).isEqualTo("basic");
server().findDto(DCust.class, "select c4.id, c4.name from o_customer c4 where lower(c4.name) = :name")
@@ -131,7 +135,9 @@ public class DtoQueryTest extends BaseTestCase {
.setParameter("name", "rob")
.findList();
stats = server().getMetaInfoManager().collectQueryStatistics(true);
BasicMetricVisitor metric2 = server().getMetaInfoManager().visitBasic();
stats = metric2.getDtoQueryMetrics();
assertThat(stats).hasSize(2);
log.info("stats " + stats);
+12 -1
View File
@@ -2,11 +2,14 @@ package io.ebean;
import io.ebean.annotation.IgnorePlatform;
import io.ebean.annotation.Platform;
import io.ebean.meta.BasicMetricVisitor;
import io.ebean.meta.MetaOrmQueryMetric;
import org.junit.Test;
import org.tests.model.basic.Country;
import org.tests.model.basic.Customer;
import java.sql.Timestamp;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
@@ -16,6 +19,8 @@ public class UpdateQueryTest extends BaseTestCase {
@Test
public void basic() {
resetAllMetrics();
EbeanServer server = server();
UpdateQuery<Customer> update = server.update(Customer.class);
Query<Customer> query = update
@@ -24,11 +29,17 @@ public class UpdateQueryTest extends BaseTestCase {
.where()
.eq("status", Customer.Status.NEW)
.gt("id", 1000)
.query();
.setLabel("updateActive");
query.update();
assertThat(query.getGeneratedSql()).contains("update o_customer set status=?, updtime=? where status = ? and id > ?");
BasicMetricVisitor basic = visitMetricsBasic();
List<MetaOrmQueryMetric> ormQueryMetrics = basic.getOrmQueryMetrics();
assertThat(ormQueryMetrics).hasSize(1);
assertThat(ormQueryMetrics.get(0).getType()).isEqualTo(Customer.class);
assertThat(ormQueryMetrics.get(0).getLabel()).isEqualTo("updateActive");
}
@Test
@@ -36,6 +36,7 @@ import io.ebean.config.dbplatform.DatabasePlatform;
import io.ebean.event.readaudit.ReadAuditLogger;
import io.ebean.event.readaudit.ReadAuditPrepare;
import io.ebean.meta.MetaInfoManager;
import io.ebean.meta.MetricVisitor;
import io.ebean.plugin.Property;
import io.ebean.plugin.SpiServer;
import io.ebean.text.csv.CsvReader;
@@ -275,6 +276,11 @@ public class TDSpiEbeanServer implements SpiEbeanServer {
}
@Override
public void visitMetrics(MetricVisitor visitor) {
}
@Override
public void loadMany(BeanCollection<?> collection, boolean onlyIds) {
@@ -1,5 +1,6 @@
package io.ebeaninternal.server.profile;
import io.ebean.meta.MetricType;
import io.ebeaninternal.metric.MetricFactory;
import org.junit.Test;
@@ -10,7 +11,7 @@ public class BasicProfileLocationTest {
@Test
public void obtain() {
DProfileLocation loc = new DTimedProfileLocation(12, "foo", MetricFactory.get().createTimedMetric("junk"));
DProfileLocation loc = new DTimedProfileLocation(12, "foo", MetricFactory.get().createTimedMetric(MetricType.TXN, "junk"));
assertThat(loc.obtain()).endsWith(":12)");
assertThat(loc.shortDescription()).isEqualTo("NativeMethodAccessorImpl.invoke0(Native Method:12)");
@@ -6,7 +6,7 @@ import io.ebean.EbeanServer;
import io.ebean.Transaction;
import io.ebean.annotation.PersistBatch;
import io.ebean.annotation.Transactional;
import io.ebean.meta.MetaInfoManager;
import io.ebean.meta.BasicMetricVisitor;
import io.ebean.meta.MetaTimedMetric;
import io.ebeaninternal.api.SpiTransaction;
import org.ebeantest.LoggedSqlCollector;
@@ -29,8 +29,7 @@ public class TestBatchInsertFlush extends BaseTestCase {
EbeanServer server = Ebean.getDefaultServer();
MetaInfoManager metaInfoManager = server.getMetaInfoManager();
metaInfoManager.collectTransactionStatistics(true);
resetAllMetrics();
Transaction transaction = server.beginTransaction();
try {
@@ -76,7 +75,8 @@ public class TestBatchInsertFlush extends BaseTestCase {
transaction.end();
}
List<MetaTimedMetric> txnStats = metaInfoManager.collectTransactionStatistics(true);
BasicMetricVisitor basic = visitMetricsBasic();
List<MetaTimedMetric> txnStats = basic.getTimedMetrics();
for (MetaTimedMetric txnMetric : txnStats) {
System.out.println(txnMetric);
}
@@ -2,25 +2,34 @@ package org.tests.m2m;
import io.ebean.BaseTestCase;
import io.ebean.Ebean;
import io.ebean.meta.MetaTimedMetric;
import org.junit.Assert;
import org.junit.Test;
import org.tests.model.m2m.Permission;
import org.tests.model.m2m.Role;
import org.tests.model.m2m.Tenant;
import org.junit.Assert;
import org.junit.Test;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import static org.assertj.core.api.Assertions.assertThat;
public class TestM2mDeleteObject extends BaseTestCase {
@Test
public void test() {
Ebean.createUpdate(Permission.class, "delete from Permission").execute();
resetAllMetrics();
Ebean.createUpdate(Permission.class, "delete from Permission").setLabel("deleteAllPermissions").execute();
Ebean.createUpdate(Tenant.class, "delete from Tenant").execute();
Ebean.createUpdate(Role.class, "delete from Role").execute();
List<MetaTimedMetric> sqlMetrics = sqlMetrics();
assertThat(sqlMetrics).hasSize(1);
assertThat(sqlMetrics.get(0).getName()).isEqualTo("orm.update.deleteAllPermissions");
Tenant t = new Tenant("tenant");
Ebean.save(t);
@@ -3,8 +3,8 @@ package org.tests.query.finder;
import io.ebean.BaseTestCase;
import io.ebean.Ebean;
import io.ebean.Transaction;
import io.ebean.meta.MetaInfoManager;
import io.ebean.meta.MetaQueryPlanStatistic;
import io.ebean.meta.BasicMetricVisitor;
import io.ebean.meta.MetaOrmQueryMetric;
import io.ebean.meta.MetaTimedMetric;
import org.ebeantest.LoggedSqlCollector;
import org.junit.Test;
@@ -136,9 +136,7 @@ public class TestCustomerFinder extends BaseTestCase {
ResetBasicData.reset();
MetaInfoManager metaInfoManager = Ebean.getDefaultServer().getMetaInfoManager();
metaInfoManager.collectQueryPlanStatistics(true);
metaInfoManager.collectTransactionStatistics(true);
resetAllMetrics();
List<Customer> customers = Customer.find.all();
assertThat(customers).isNotEmpty();
@@ -153,14 +151,16 @@ public class TestCustomerFinder extends BaseTestCase {
Customer.find.updateNames("Junk", 2000);
Customer.find.byId(3);
List<MetaQueryPlanStatistic> planStats = metaInfoManager.collectQueryPlanStatistics(true);
BasicMetricVisitor basic = server().getMetaInfoManager().visitBasic();
List<MetaOrmQueryMetric> planStats = basic.getOrmQueryMetrics();
assertThat(planStats.size()).isGreaterThan(4);
for (MetaQueryPlanStatistic planStat : planStats) {
for (MetaOrmQueryMetric planStat : planStats) {
System.out.println(planStat);
}
for (MetaTimedMetric txnTimed : metaInfoManager.collectTransactionStatistics(true)) {
for (MetaTimedMetric txnTimed : basic.getTimedMetrics()) {
System.out.println(txnTimed);
}
}
@@ -3,16 +3,17 @@ package org.tests.query.other;
import io.ebean.BaseTestCase;
import io.ebean.Ebean;
import io.ebean.EbeanServer;
import io.ebean.meta.BasicMetricVisitor;
import io.ebean.meta.MetaInfoManager;
import io.ebean.meta.MetaObjectGraphNodeStats;
import io.ebean.meta.MetaQueryPlanStatistic;
import io.ebean.meta.MetaOrmQueryMetric;
import io.ebean.meta.MetaOrmQueryNode;
import org.junit.Assert;
import org.junit.Test;
import org.tests.model.basic.Address;
import org.tests.model.basic.Customer;
import org.tests.model.basic.Order;
import org.tests.model.basic.OrderDetail;
import org.tests.model.basic.ResetBasicData;
import org.junit.Assert;
import org.junit.Test;
import java.util.List;
@@ -30,19 +31,19 @@ public class TestObjectGraphNodeStatsCollection extends BaseTestCase {
server.find(Order.class).findCount();
infoManager.collectNodeStatistics(true);
infoManager.collectQueryPlanStatistics(true);
infoManager.resetAllMetrics();
runFindOrderQuery(server);
runFindCustomerQuery(server);
List<MetaObjectGraphNodeStats> nodeStatistics = infoManager.collectNodeStatistics(true);
for (MetaObjectGraphNodeStats stat : nodeStatistics) {
stat.toString();
List<MetaOrmQueryNode> nodeStatistics = infoManager.collectNodeStatistics(true);
for (MetaOrmQueryNode stat : nodeStatistics) {
System.out.println(stat);
}
List<MetaQueryPlanStatistic> planStatistics = infoManager.collectQueryPlanStatistics(true);
for (MetaQueryPlanStatistic planStatistic : planStatistics) {
planStatistic.getSql();
BasicMetricVisitor basic = infoManager.visitBasic();
for (MetaOrmQueryMetric queryMetric : basic.getOrmQueryMetrics()) {
System.out.println(queryMetric);
}
}
@@ -4,6 +4,7 @@ import io.ebean.BaseTestCase;
import io.ebean.Ebean;
import io.ebean.SqlQuery;
import io.ebean.SqlRow;
import io.ebean.meta.MetaTimedMetric;
import org.ebeantest.LoggedSqlCollector;
import org.junit.Test;
import org.tests.model.basic.Order;
@@ -114,9 +115,13 @@ public class SqlQueryTests extends BaseTestCase {
ResetBasicData.reset();
SqlQuery sqlQuery = Ebean.createSqlQuery("select * from o_order where o_order.id > :id order by id");
sqlQuery.setParameter("id", 3);
sqlQuery.setMaxRows(10);
resetAllMetrics();
SqlQuery sqlQuery = Ebean.createSqlQuery("select * from o_order where o_order.id > :id order by id")
.setParameter("id", 3)
.setMaxRows(10)
.setLabel("findList-3-10");
LoggedSqlCollector.start();
sqlQuery.findList();
@@ -129,6 +134,8 @@ public class SqlQueryTests extends BaseTestCase {
} else {
assertThat(sql.get(0)).contains("select * from o_order where o_order.id > ? order by id limit 10;");
}
assertThat(sqlMetrics()).isNotEmpty();
}
@Test
@@ -136,8 +143,11 @@ public class SqlQueryTests extends BaseTestCase {
ResetBasicData.reset();
SqlQuery sqlQuery = Ebean.createSqlQuery("Select * from o_order");
sqlQuery.setMaxRows(10);
resetAllMetrics();
SqlQuery sqlQuery = Ebean.createSqlQuery("Select * from o_order")
.setMaxRows(10)
.setLabel("findEach-Max10Rows");
LoggedSqlCollector.start();
sqlQuery.findEach(bean -> bean.get("id"));
@@ -150,6 +160,10 @@ public class SqlQueryTests extends BaseTestCase {
} else {
assertThat(sql.get(0)).contains("limit 10");
}
List<MetaTimedMetric> sqlMetrics = sqlMetrics();
assertThat(sqlMetrics).hasSize(1);
assertThat(sqlMetrics.get(0).getName()).isEqualTo("sql.query.findEach-Max10Rows");
}
@Test
@@ -5,7 +5,6 @@ import io.ebean.Ebean;
import io.ebean.Transaction;
import io.ebean.annotation.Transactional;
import io.ebean.annotation.TxType;
import io.ebean.meta.MetaInfoManager;
import io.ebean.meta.MetaTimedMetric;
import org.junit.Test;
import org.slf4j.Logger;
@@ -19,17 +18,16 @@ public class TestNestedMandatory extends BaseTestCase {
private static final Logger log = LoggerFactory.getLogger(TestNestedMandatory.class);
static Transaction outerTxn;
private static Transaction outerTxn;
@Test
public void test() {
MetaInfoManager metaInfoManager = Ebean.getDefaultServer().getMetaInfoManager();
metaInfoManager.collectTransactionStatistics(true);
resetAllMetrics();
new Outer().doOuter();
List<MetaTimedMetric> txnMetrics = metaInfoManager.collectTransactionStatistics(true);
List<MetaTimedMetric> txnMetrics = visitTimedMetrics();
for (MetaTimedMetric txnTimed : txnMetrics) {
System.out.println(txnTimed);
}
@@ -3,10 +3,13 @@ package org.tests.update;
import io.ebean.BaseTestCase;
import io.ebean.Ebean;
import io.ebean.SqlUpdate;
import io.ebean.meta.MetaTimedMetric;
import org.junit.Assert;
import org.junit.Test;
import org.tests.idkeys.db.AuditLog;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
public class TestSqlUpdateInTxn extends BaseTestCase {
@@ -40,11 +43,18 @@ public class TestSqlUpdateInTxn extends BaseTestCase {
String sql = " \nupdate audit_log \nset description = description \nwhere id = id";
SqlUpdate sqlUpdate = Ebean.createSqlUpdate(sql);
resetAllMetrics();
SqlUpdate sqlUpdate = Ebean.createSqlUpdate(sql).setLabel("auditLargeUpdate");
sqlUpdate.execute();
assertThat(sqlUpdate.getSql()).isEqualTo(sql.trim());
assertThat(sqlUpdate.getGeneratedSql()).isEqualTo(sql.trim());
List<MetaTimedMetric> sqlMetrics = sqlMetrics();
assertThat(sqlMetrics).hasSize(1);
assertThat(sqlMetrics.get(0).getName()).isEqualTo("sql.update.auditLargeUpdate");
assertThat(sqlMetrics.get(0).getCount()).isEqualTo(1);
}
@Test