diff --git a/src/main/java/io/ebean/meta/MetaQueryMetric.java b/src/main/java/io/ebean/meta/MetaQueryMetric.java
index 514b700dc..7723824fb 100644
--- a/src/main/java/io/ebean/meta/MetaQueryMetric.java
+++ b/src/main/java/io/ebean/meta/MetaQueryMetric.java
@@ -25,4 +25,12 @@ public interface MetaQueryMetric extends MetaTimedMetric {
*/
String getHash();
+ /**
+ * Return true if this is the first metrics collection for this query.
+ *
+ * This can be used to suppress including the SQL and location from metrics
+ * content.
+ *
+ */
+ boolean initialCollection();
}
diff --git a/src/main/java/io/ebeaninternal/server/core/DumpMetricsJson.java b/src/main/java/io/ebeaninternal/server/core/DumpMetricsJson.java
index fba6559ff..cfb0d9de1 100644
--- a/src/main/java/io/ebeaninternal/server/core/DumpMetricsJson.java
+++ b/src/main/java/io/ebeaninternal/server/core/DumpMetricsJson.java
@@ -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 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");
diff --git a/src/main/java/io/ebeaninternal/server/profile/DQueryPlanMetric.java b/src/main/java/io/ebeaninternal/server/profile/DQueryPlanMetric.java
index 7ba93fe33..b6ebcc12a 100644
--- a/src/main/java/io/ebeaninternal/server/profile/DQueryPlanMetric.java
+++ b/src/main/java/io/ebeaninternal/server/profile/DQueryPlanMetric.java
@@ -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();
diff --git a/src/main/java/io/ebeaninternal/server/query/CQueryPlanStats.java b/src/main/java/io/ebeaninternal/server/query/CQueryPlanStats.java
index 8528b8612..a45d04718 100644
--- a/src/main/java/io/ebeaninternal/server/query/CQueryPlanStats.java
+++ b/src/main/java/io/ebeaninternal/server/query/CQueryPlanStats.java
@@ -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 origins;
@@ -94,7 +95,9 @@ public final class CQueryPlanStats {
TimedMetricStats collect = timedMetric.collect(reset);
List 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 origins;
- Snapshot(CQueryPlan queryPlan, TimedMetricStats metrics, long lastQueryTime, List origins) {
+ Snapshot(boolean collected, CQueryPlan queryPlan, TimedMetricStats metrics, long lastQueryTime, List 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 getOrigins() {
return origins;
diff --git a/src/test/java/org/tests/query/finder/TestCustomerFinder.java b/src/test/java/org/tests/query/finder/TestCustomerFinder.java
index 50a9c48d8..66ac18633 100644
--- a/src/test/java/org/tests/query/finder/TestCustomerFinder.java
+++ b/src/test/java/org/tests/query/finder/TestCustomerFinder.java
@@ -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();