[ASTERIXDB-3278][API] Add buffercache hit ratio to metrics
- user model changes: yes
- storage format changes: no
- interface changes: no
Details:
Move the buffercache hit ratio information to the metrics and
always collect it, not just when profiling
Change-Id: I568a2df4594bdde19932ba72362c9c61a96a9182
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17858
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Ian Maxon <imaxon@uci.edu>
Reviewed-by: Wail Alkowaileet <wael.y.k@gmail.com>
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/IStatementExecutor.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/IStatementExecutor.java
index e10046e..93f59908 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/IStatementExecutor.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/IStatementExecutor.java
@@ -106,7 +106,7 @@
}
class Stats implements Serializable {
- private static final long serialVersionUID = 5885273238208454611L;
+ private static final long serialVersionUID = 5885273238208454612L;
public enum ProfileType {
COUNTS("counts"),
@@ -138,6 +138,7 @@
private ProfileType profileType;
private long totalWarningsCount;
private long compileTime;
+ private double bufferCacheHitRatio;
public long getCount() {
return count;
@@ -204,6 +205,14 @@
public long getCompileTime() {
return compileTime;
}
+
+ public void setBufferCacheHitRatio(double bufferCacheHitRatio) {
+ this.bufferCacheHitRatio = bufferCacheHitRatio;
+ }
+
+ public double getBufferCacheHitRatio() {
+ return bufferCacheHitRatio;
+ }
}
class Profile implements Serializable {
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/ResultMetadata.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/ResultMetadata.java
index 60f4939..f47fce1 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/ResultMetadata.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/ResultMetadata.java
@@ -27,13 +27,14 @@
import com.fasterxml.jackson.databind.node.ObjectNode;
public class ResultMetadata implements IResultMetadata {
- private static final long serialVersionUID = 1905367559307369034L;
+ private static final long serialVersionUID = 1905367559307369035L;
private final SessionConfig.OutputFormat format;
private long jobDuration;
private long processedObjects;
- private ObjectNode profile;
private long diskIoCount;
+ private double bufferCacheHitRatio;
+ private ObjectNode profile;
private Set<Warning> warnings;
private long totalWarningsCount;
private transient List<Object> outputTypes;
@@ -59,6 +60,14 @@
this.jobDuration = jobDuration;
}
+ public void setBufferCacheHitRatio(double bufferCacheHitRatio) {
+ this.bufferCacheHitRatio = bufferCacheHitRatio;
+ }
+
+ public double getBufferCacheHitRatio() {
+ return bufferCacheHitRatio;
+ }
+
public void setWarnings(Set<Warning> warnings) {
this.warnings = warnings;
}
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NCQueryServiceServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NCQueryServiceServlet.java
index cb5a3a5..a5e13c1 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NCQueryServiceServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NCQueryServiceServlet.java
@@ -207,6 +207,7 @@
stats.updateTotalWarningsCount(responseStats.getTotalWarningsCount());
stats.setCompileTime(responseStats.getCompileTime());
stats.setQueueWaitTime(responseStats.getQueueWaitTime());
+ stats.setBufferCacheHitRatio(responseStats.getBufferCacheHitRatio());
}
private static void updatePropertiesFromCC(IStatementExecutor.StatementProperties statementProperties,
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryResultApiServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryResultApiServlet.java
index 680feeb..ad2a5b5 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryResultApiServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryResultApiServlet.java
@@ -102,7 +102,8 @@
printer.printResults();
ResponseMetrics metrics = ResponseMetrics.of(System.nanoTime() - elapsedStart,
metadata.getJobDuration(), stats.getCount(), stats.getSize(), metadata.getProcessedObjects(), 0,
- metadata.getTotalWarningsCount(), stats.getCompileTime(), stats.getQueueWaitTime());
+ metadata.getTotalWarningsCount(), stats.getCompileTime(), stats.getQueueWaitTime(),
+ stats.getBufferCacheHitRatio());
printer.addFooterPrinter(new MetricsPrinter(metrics, HttpUtil.getPreferredCharset(request)));
if (metadata.getJobProfile() != null) {
printer.addFooterPrinter(new ProfilePrinter(metadata.getJobProfile()));
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java
index 6678c52..f28579d 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java
@@ -357,9 +357,10 @@
// in case of ASYNC delivery, the status is printed by query translator
responsePrinter.addFooterPrinter(new StatusPrinter(executionState.getResultStatus()));
}
- final ResponseMetrics metrics = ResponseMetrics.of(System.nanoTime() - elapsedStart, executionState.duration(),
- stats.getCount(), stats.getSize(), stats.getProcessedObjects(), errorCount,
- stats.getTotalWarningsCount(), stats.getCompileTime(), stats.getQueueWaitTime());
+ final ResponseMetrics metrics =
+ ResponseMetrics.of(System.nanoTime() - elapsedStart, executionState.duration(), stats.getCount(),
+ stats.getSize(), stats.getProcessedObjects(), errorCount, stats.getTotalWarningsCount(),
+ stats.getCompileTime(), stats.getQueueWaitTime(), stats.getBufferCacheHitRatio());
responsePrinter.addFooterPrinter(new MetricsPrinter(metrics, resultCharset));
if (isPrintingProfile(stats)) {
responsePrinter.addFooterPrinter(new ProfilePrinter(stats.getJobProfile()));
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/result/JobResultCallback.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/result/JobResultCallback.java
index ebf169f..d1a1008 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/result/JobResultCallback.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/result/JobResultCallback.java
@@ -71,6 +71,8 @@
private void aggregateJobStats(JobId jobId, ResultMetadata metadata) {
long processedObjects = 0;
long aggregateTotalWarningsCount = 0;
+ long pagesRead = 0;
+ long nonPagedReads = 0;
Set<Warning> AggregateWarnings = new HashSet<>();
IJobManager jobManager =
((ClusterControllerService) appCtx.getServiceContext().getControllerService()).getJobManager();
@@ -83,6 +85,8 @@
final Collection<TaskProfile> jobletTasksProfile = jp.getTaskProfiles().values();
for (TaskProfile tp : jobletTasksProfile) {
processedObjects += tp.getStatsCollector().getAggregatedStats().getInputTupleCounter().get();
+ pagesRead += tp.getStatsCollector().getAggregatedStats().getPageReads().get();
+ nonPagedReads += tp.getStatsCollector().getAggregatedStats().coldReadCounter().get();
aggregateTotalWarningsCount += tp.getTotalWarningsCount();
Set<Warning> taskWarnings = tp.getWarnings();
if (AggregateWarnings.size() < maxWarnings && !taskWarnings.isEmpty()) {
@@ -96,6 +100,7 @@
metadata.setQueueWaitTimeInNanos(run.getJobProfile().getQueueWaitTimeInNanos());
}
metadata.setProcessedObjects(processedObjects);
+ metadata.setBufferCacheHitRatio(pagesRead > 0 ? (pagesRead - nonPagedReads) / pagesRead : Double.NaN);
metadata.setWarnings(AggregateWarnings);
metadata.setTotalWarningsCount(aggregateTotalWarningsCount);
if (run != null && run.getFlags() != null && run.getFlags().contains(JobFlag.PROFILE_RUNTIME)) {
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/result/ResponseMetrics.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/result/ResponseMetrics.java
index 08e7702..5f70937 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/result/ResponseMetrics.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/result/ResponseMetrics.java
@@ -30,12 +30,14 @@
private long diskIoCount;
private long compileTime;
private long queueWaitTime;
+ private double bufferCacheHitRatio;
private ResponseMetrics() {
}
public static ResponseMetrics of(long elapsedTime, long executionTime, long resultCount, long resultSize,
- long processedObjects, long errorCount, long warnCount, long compileTime, long queueWaitTime) {
+ long processedObjects, long errorCount, long warnCount, long compileTime, long queueWaitTime,
+ double bufferCacheHitRatio) {
ResponseMetrics metrics = new ResponseMetrics();
metrics.elapsedTime = elapsedTime;
metrics.executionTime = executionTime;
@@ -46,6 +48,7 @@
metrics.warnCount = warnCount;
metrics.compileTime = compileTime;
metrics.queueWaitTime = queueWaitTime;
+ metrics.bufferCacheHitRatio = bufferCacheHitRatio;
return metrics;
}
@@ -84,4 +87,8 @@
public long getQueueWaitTime() {
return queueWaitTime;
}
+
+ public double getBufferCacheHitRatio() {
+ return bufferCacheHitRatio;
+ }
}
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/result/fields/MetricsPrinter.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/result/fields/MetricsPrinter.java
index e001d29..93fb6d4 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/result/fields/MetricsPrinter.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/result/fields/MetricsPrinter.java
@@ -38,7 +38,8 @@
RESULT_SIZE("resultSize"),
ERROR_COUNT("errorCount"),
PROCESSED_OBJECTS_COUNT("processedObjects"),
- WARNING_COUNT("warningCount");
+ WARNING_COUNT("warningCount"),
+ BUFFERCACHE_HIT_RATIO("bufferCacheHitRatio");
private final String str;
@@ -84,9 +85,16 @@
pw.print("\n\t");
final boolean hasErrors = metrics.getErrorCount() > 0;
final boolean hasWarnings = metrics.getWarnCount() > 0;
+ final boolean usedCache = !(Double.isNaN(metrics.getBufferCacheHitRatio()));
ResultUtil.printField(pw, Metrics.PROCESSED_OBJECTS_COUNT.str(), metrics.getProcessedObjects(),
- hasWarnings || hasErrors);
+ usedCache || hasWarnings || hasErrors);
pw.print("\n");
+ if (usedCache) {
+ pw.print("\t");
+ String pctValue = String.format("%.2f%%", metrics.getBufferCacheHitRatio() * 100);
+ ResultUtil.printField(pw, Metrics.BUFFERCACHE_HIT_RATIO.str(), pctValue, hasWarnings || hasErrors);
+ pw.print("\n");
+ }
if (hasWarnings) {
pw.print("\t");
ResultUtil.printField(pw, Metrics.WARNING_COUNT.str(), metrics.getWarnCount(), hasErrors);
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
index d8b5d84..8b635a2 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
@@ -4779,6 +4779,7 @@
.getResultMetadata(jobId, rsId);
stats.setProcessedObjects(resultMetadata.getProcessedObjects());
stats.setQueueWaitTime(resultMetadata.getQueueWaitTimeInNanos());
+ stats.setBufferCacheHitRatio(resultMetadata.getBufferCacheHitRatio());
if (jobFlags.contains(JobFlag.PROFILE_RUNTIME)) {
stats.setJobProfile(resultMetadata.getJobProfile());
apiFramework.generateOptimizedLogicalPlanWithProfile(resultMetadata.getJobProfile());
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/api/cache-residency/cache-residency.001.post.http b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/api/cache-residency/cache-residency.001.post.http
new file mode 100644
index 0000000..0edc12a
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/api/cache-residency/cache-residency.001.post.http
@@ -0,0 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/query/service
+--body={"statement": "from [1, 2] as v select v;"}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/api/cache-residency/cache-residency.002.post.http b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/api/cache-residency/cache-residency.002.post.http
new file mode 100644
index 0000000..9bf0936
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/api/cache-residency/cache-residency.002.post.http
@@ -0,0 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/query/service
+--body={"statement": "SELECT COUNT(*) FROM Metadata.`Dataset`"}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cache-residency/cache-residency.001.regexjson b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cache-residency/cache-residency.001.regexjson
new file mode 100644
index 0000000..173a9a5
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cache-residency/cache-residency.001.regexjson
@@ -0,0 +1,19 @@
+{
+ "requestID": "R{.*}",
+ "signature": {
+ "*": "*"
+ },
+ "type": "application/x-adm",
+ "results": [ "{ \"v\": 1 }\n", "{ \"v\": 2 }\n" ],
+ "plans": "R{.*}",
+ "status": "success",
+ "metrics": {
+ "elapsedTime": "R{.*}",
+ "executionTime": "R{.*}",
+ "compileTime": "R{.*}",
+ "queueWaitTime": "R{.*}",
+ "resultCount": 2,
+ "resultSize": 32,
+ "processedObjects": 0
+ }
+}
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cache-residency/cache-residency.002.regexjson b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cache-residency/cache-residency.002.regexjson
new file mode 100644
index 0000000..8f5cf76
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cache-residency/cache-residency.002.regexjson
@@ -0,0 +1,20 @@
+{
+ "requestID": "R{.*}",
+ "signature": {
+ "*": "*"
+ },
+ "type": "application/x-adm",
+ "results": [ "{ \"$1\": 17 }\n" ],
+ "plans": "R{.*}",
+ "status": "success",
+ "metrics": {
+ "elapsedTime": "R{.*}",
+ "executionTime": "R{.*}",
+ "compileTime": "R{.*}",
+ "queueWaitTime": "R{.*}",
+ "resultCount": 1,
+ "resultSize": 18,
+ "processedObjects": 17,
+ "bufferCacheHitRatio": "100.00%"
+ }
+}
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/api/request-param-validation-400-BAD/request-param-validation-400-BAD.01.regexjson b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/request-param-validation-400-BAD/request-param-validation-400-BAD.01.regexjson
index bd58b52..823515b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/api/request-param-validation-400-BAD/request-param-validation-400-BAD.01.regexjson
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/request-param-validation-400-BAD/request-param-validation-400-BAD.01.regexjson
@@ -11,6 +11,7 @@
"resultCount": 0,
"resultSize": 0,
"processedObjects": 0,
+ "bufferCacheHitRatio": "0.00%",
"errorCount": 1
}
}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/warnings/warnings-limit/warnings-limit.06.regexadm b/asterixdb/asterix-app/src/test/resources/runtimets/results/warnings/warnings-limit/warnings-limit.06.regexadm
index 7b689f6..39fdb09 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/warnings/warnings-limit/warnings-limit.06.regexadm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/warnings/warnings-limit/warnings-limit.06.regexadm
@@ -17,6 +17,7 @@
\s*\Q"resultCount": \E[0-9]+\Q,\E
\s*\Q"resultSize": \E[0-9]+\Q,\E
\s*\Q"processedObjects": \E[0-9]+\Q,\E
+\s*\Q"bufferCacheHitRatio": "\E[^"]+\Q",\E
\s*\Q"warningCount": 2\E
\s*\Q}\E
\s*\Q}\E\s*
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
index 81f40c7..4bc82f4 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
@@ -101,6 +101,11 @@
</compilation-unit>
</test-case>
<test-case FilePath="api">
+ <compilation-unit name="cache-residency">
+ <output-dir compare="Text">cache-residency</output-dir>
+ </compilation-unit>
+ </test-case>
+ <test-case FilePath="api">
<compilation-unit name="request-param">
<output-dir compare="Text">request-param</output-dir>
</compilation-unit>
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/job/profiling/StatsCollector.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/job/profiling/StatsCollector.java
index 76c8017..26c664a 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/job/profiling/StatsCollector.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/job/profiling/StatsCollector.java
@@ -31,7 +31,7 @@
import org.apache.hyracks.api.job.profiling.OperatorStats;
public class StatsCollector implements IStatsCollector {
- private static final long serialVersionUID = 6858817639895434573L;
+ private static final long serialVersionUID = 6858817639895434574L;
private final Map<String, IOperatorStats> operatorStatsMap = new LinkedHashMap<>();
@@ -66,6 +66,7 @@
aggregatedStats.getInputTupleCounter().update(stats.getInputTupleCounter().get());
aggregatedStats.getTimeCounter().update(stats.getTimeCounter().get());
aggregatedStats.getPageReads().update(stats.getPageReads().get());
+ aggregatedStats.coldReadCounter().update(stats.coldReadCounter().get());
}
return aggregatedStats;
}
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/Task.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/Task.java
index 900ac7e..0c5c233 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/Task.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/Task.java
@@ -515,9 +515,6 @@
@Override
public synchronized void subscribeThreadToStats(IThreadStatsCollector threadStatsCollector) {
- if (!isRuntimeProfilingEnabled()) {
- return;
- }
synchronized (threadStatsCollectors) {
threadStatsCollectors.add(threadStatsCollector);
final long threadId = Thread.currentThread().getId();
@@ -528,9 +525,6 @@
@Override
public synchronized void unsubscribeThreadFromStats() {
- if (!isRuntimeProfilingEnabled()) {
- return;
- }
synchronized (threadStatsCollectors) {
threadStatsCollectors.forEach(IThreadStatsCollector::unsubscribe);
}
@@ -572,8 +566,4 @@
return "{ \"class\" : \"" + getClass().getSimpleName() + "\", \"node\" : \"" + ncs.getId() + "\" \"jobId\" : \""
+ joblet.getJobId() + "\", \"taskId\" : \"" + taskAttemptId + "\" }";
}
-
- private boolean isRuntimeProfilingEnabled() {
- return getJobFlags().contains(JobFlag.PROFILE_RUNTIME);
- }
}