mirror of
https://github.com/ebean-orm/ebean.git
synced 2026-10-23 19:00:38 +00:00
#1872 - Reporting ORM metrics defaults to suppressing sql and location after initial collection
This commit is contained in:
@@ -25,4 +25,12 @@ public interface MetaQueryMetric extends MetaTimedMetric {
|
||||
*/
|
||||
String getHash();
|
||||
|
||||
/**
|
||||
* Return true if this is the first metrics collection for this query.
|
||||
* <p>
|
||||
* This can be used to suppress including the SQL and location from metrics
|
||||
* content.
|
||||
* </p>
|
||||
*/
|
||||
boolean initialCollection();
|
||||
}
|
||||
|
||||
@@ -21,10 +21,18 @@ class DumpMetricsJson implements ServerMetricsAsJson {
|
||||
|
||||
private Appendable writer;
|
||||
|
||||
/**
|
||||
* By default include SQL for the initial collection only.
|
||||
*/
|
||||
private int includeSqlMode = 1;
|
||||
|
||||
/**
|
||||
* By default include with the initial SQL collection only.
|
||||
*/
|
||||
private int includeLocation = 1;
|
||||
|
||||
private boolean withHeader = true;
|
||||
private boolean withHash = true;
|
||||
private boolean withSql = true;
|
||||
private boolean withLocation = true;
|
||||
private String newLine = "\n";
|
||||
|
||||
private Comparator<MetaTimedMetric> sortBy = SortMetric.NAME;
|
||||
@@ -44,13 +52,13 @@ class DumpMetricsJson implements ServerMetricsAsJson {
|
||||
|
||||
@Override
|
||||
public ServerMetricsAsJson withLocation(boolean withLocation) {
|
||||
this.withLocation = withLocation;
|
||||
this.includeLocation = withLocation ? 2 : 0;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ServerMetricsAsJson withSql(boolean withSql) {
|
||||
this.withSql = withSql;
|
||||
this.includeSqlMode = withSql ? 2 : 0;
|
||||
return this;
|
||||
}
|
||||
|
||||
@@ -118,7 +126,7 @@ class DumpMetricsJson implements ServerMetricsAsJson {
|
||||
dtoQueryMetrics.sort(sortBy);
|
||||
}
|
||||
for (MetaQueryMetric metric : dtoQueryMetrics) {
|
||||
logDtoQuery(metric);
|
||||
logQuery(metric);
|
||||
}
|
||||
}
|
||||
end();
|
||||
@@ -196,7 +204,7 @@ class DumpMetricsJson implements ServerMetricsAsJson {
|
||||
private void log(MetaTimedMetric metric) throws IOException {
|
||||
metricStart(metric);
|
||||
appendCounters(metric);
|
||||
if (withLocation) {
|
||||
if (includeLocation != 0) {
|
||||
appendLocation(metric.getLocation());
|
||||
}
|
||||
metricEnd();
|
||||
@@ -209,7 +217,7 @@ class DumpMetricsJson implements ServerMetricsAsJson {
|
||||
metricEnd();
|
||||
}
|
||||
|
||||
private void logQuery(MetaOrmQueryMetric metric) throws IOException {
|
||||
private void logQuery(MetaQueryMetric metric) throws IOException {
|
||||
metricStart(metric);
|
||||
appendCounters(metric);
|
||||
if (withHash) {
|
||||
@@ -220,23 +228,23 @@ class DumpMetricsJson implements ServerMetricsAsJson {
|
||||
metricEnd();
|
||||
}
|
||||
|
||||
private void logDtoQuery(MetaQueryMetric metric) throws IOException {
|
||||
metricStart(metric);
|
||||
appendCounters(metric);
|
||||
appendLocationAndSql(metric);
|
||||
metricEnd();
|
||||
}
|
||||
|
||||
private void appendLocationAndSql(MetaQueryMetric metric) throws IOException {
|
||||
if (withLocation) {
|
||||
if (includeLocation == 2) {
|
||||
appendLocation(metric.getLocation());
|
||||
}
|
||||
if (withSql) {
|
||||
if (isIncludeSql(metric)) {
|
||||
if (includeLocation == 1) {
|
||||
appendLocation(metric.getLocation());
|
||||
}
|
||||
key("sql");
|
||||
val(metric.getSql());
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isIncludeSql(MetaQueryMetric metric) {
|
||||
return includeSqlMode == 2 || includeSqlMode == 1 && metric.initialCollection();
|
||||
}
|
||||
|
||||
private void appendLocation(String location) throws IOException {
|
||||
if (location != null) {
|
||||
key("loc");
|
||||
|
||||
@@ -11,6 +11,7 @@ class DQueryPlanMetric implements QueryPlanMetric {
|
||||
|
||||
private final DQueryPlanMeta meta;
|
||||
private final DTimedMetric metric;
|
||||
private boolean collected;
|
||||
|
||||
DQueryPlanMetric(DQueryPlanMeta meta, DTimedMetric metric) {
|
||||
this.meta = meta;
|
||||
@@ -21,7 +22,8 @@ class DQueryPlanMetric implements QueryPlanMetric {
|
||||
public void visit(MetricVisitor visitor) {
|
||||
TimedMetricStats stats = metric.collect(visitor.isReset());
|
||||
if (stats != null) {
|
||||
visitor.visitQuery(new Stats(meta, stats));
|
||||
visitor.visitQuery(new Stats(meta, stats, collected));
|
||||
collected = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,10 +36,12 @@ class DQueryPlanMetric implements QueryPlanMetric {
|
||||
|
||||
private final DQueryPlanMeta meta;
|
||||
private final TimedMetricStats stats;
|
||||
private final boolean collected;
|
||||
|
||||
private Stats(DQueryPlanMeta meta, TimedMetricStats stats) {
|
||||
private Stats(DQueryPlanMeta meta, TimedMetricStats stats, boolean collected) {
|
||||
this.meta = meta;
|
||||
this.stats = stats;
|
||||
this.collected = collected;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -55,6 +59,11 @@ class DQueryPlanMetric implements QueryPlanMetric {
|
||||
return meta.getType();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean initialCollection() {
|
||||
return !collected;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHash() {
|
||||
return meta.getHash();
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package io.ebeaninternal.server.query;
|
||||
|
||||
import io.ebean.ProfileLocation;
|
||||
import io.ebean.bean.ObjectGraphNode;
|
||||
import io.ebean.meta.MetaOrmQueryMetric;
|
||||
import io.ebean.meta.MetaOrmQueryOrigin;
|
||||
@@ -24,6 +23,8 @@ public final class CQueryPlanStats {
|
||||
|
||||
private final TimedMetric timedMetric;
|
||||
|
||||
private boolean collected;
|
||||
|
||||
private long lastQueryTime;
|
||||
|
||||
private final ConcurrentHashMap<ObjectGraphNode, LongAdder> origins;
|
||||
@@ -94,7 +95,9 @@ public final class CQueryPlanStats {
|
||||
|
||||
TimedMetricStats collect = timedMetric.collect(reset);
|
||||
List<MetaOrmQueryOrigin> origins = getOrigins(reset);
|
||||
return new Snapshot(queryPlan, collect, lastQueryTime, origins);
|
||||
Snapshot snapshot = new Snapshot(collected, queryPlan, collect, lastQueryTime, origins);
|
||||
collected = true;
|
||||
return snapshot;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -150,12 +153,14 @@ public final class CQueryPlanStats {
|
||||
*/
|
||||
static class Snapshot implements MetaOrmQueryMetric {
|
||||
|
||||
private final boolean collected;
|
||||
private final CQueryPlan queryPlan;
|
||||
private final TimedMetricStats metrics;
|
||||
private final long lastQueryTime;
|
||||
private final List<MetaOrmQueryOrigin> origins;
|
||||
|
||||
Snapshot(CQueryPlan queryPlan, TimedMetricStats metrics, long lastQueryTime, List<MetaOrmQueryOrigin> origins) {
|
||||
Snapshot(boolean collected, CQueryPlan queryPlan, TimedMetricStats metrics, long lastQueryTime, List<MetaOrmQueryOrigin> origins) {
|
||||
this.collected = collected;
|
||||
this.queryPlan = queryPlan;
|
||||
this.metrics = metrics;
|
||||
this.lastQueryTime = lastQueryTime;
|
||||
@@ -242,6 +247,11 @@ public final class CQueryPlanStats {
|
||||
return queryPlan.getSql();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean initialCollection() {
|
||||
return !collected;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<MetaOrmQueryOrigin> getOrigins() {
|
||||
return origins;
|
||||
|
||||
@@ -245,6 +245,41 @@ public class TestCustomerFinder extends BaseTestCase {
|
||||
assertThat(metricsJson).contains("\"name\":\"Customer.findList\"");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void test_metricsAsJson_sqlInInitialCollectionOnly() {
|
||||
|
||||
ResetBasicData.reset();
|
||||
|
||||
runQueries();
|
||||
|
||||
StringBuilder buffer0 = new StringBuilder();
|
||||
server().getMetaInfoManager()
|
||||
.collectMetricsAsJson()
|
||||
.withHeader(false)
|
||||
.write(buffer0);
|
||||
|
||||
String json0 = buffer0.toString();
|
||||
System.out.println(json0);
|
||||
assertThat(json0).contains("\"name\":\"txn.main\"");
|
||||
assertThat(json0).contains("\"name\":\"Customer.findList\"");
|
||||
assertThat(json0).contains("\"sql\":\"select t0.id, t0.status, t0.name");
|
||||
|
||||
runQueries();
|
||||
|
||||
StringBuilder buffer1 = new StringBuilder();
|
||||
server().getMetaInfoManager()
|
||||
.collectMetricsAsJson()
|
||||
.withHeader(false)
|
||||
.write(buffer1);
|
||||
|
||||
String json1 = buffer1.toString();
|
||||
System.out.println(json1);
|
||||
assertThat(json1).contains("\"name\":\"txn.main\"");
|
||||
assertThat(json1).contains("\"name\":\"Customer.findList\"");
|
||||
assertThat(json1).doesNotContain("\"sql\":\"select t0.id, t0.status, t0.name");
|
||||
|
||||
}
|
||||
|
||||
private void runQueries() {
|
||||
resetAllMetrics();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user