Skip to content

Commit c6c77cf

Browse files
committed
Add query execution metrics to JDBC QueryStats
Adds planningTimeMillis, analysisTimeMillis, finishingTimeMillis, physicalInputBytes, physicalWrittenBytes and internalNetworkInputBytes to allow JDBC clients to get some important metrics about query execution
1 parent 3257342 commit c6c77cf

File tree

12 files changed

+204
-2
lines changed

12 files changed

+204
-2
lines changed

client/trino-client/src/main/java/io/trino/client/StatementStats.java

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,18 @@ public class StatementStats
3636
private final int queuedSplits;
3737
private final int runningSplits;
3838
private final int completedSplits;
39+
private final long planningTimeMillis;
40+
private final long analysisTimeMillis;
3941
private final long cpuTimeMillis;
4042
private final long wallTimeMillis;
4143
private final long queuedTimeMillis;
4244
private final long elapsedTimeMillis;
45+
private final long finishingTimeMillis;
4346
private final long processedRows;
4447
private final long processedBytes;
4548
private final long physicalInputBytes;
4649
private final long physicalWrittenBytes;
50+
private final long internalNetworkInputBytes;
4751
private final long peakMemoryBytes;
4852
private final long spilledBytes;
4953
private final StageStats rootStage;
@@ -60,14 +64,18 @@ public StatementStats(
6064
@JsonProperty("queuedSplits") int queuedSplits,
6165
@JsonProperty("runningSplits") int runningSplits,
6266
@JsonProperty("completedSplits") int completedSplits,
67+
@JsonProperty("planningTimeMillis") long planningTimeMillis,
68+
@JsonProperty("analysisTimeMillis") long analysisTimeMillis,
6369
@JsonProperty("cpuTimeMillis") long cpuTimeMillis,
6470
@JsonProperty("wallTimeMillis") long wallTimeMillis,
6571
@JsonProperty("queuedTimeMillis") long queuedTimeMillis,
6672
@JsonProperty("elapsedTimeMillis") long elapsedTimeMillis,
73+
@JsonProperty("finishingTimeMillis") long finishingTimeMillis,
6774
@JsonProperty("processedRows") long processedRows,
6875
@JsonProperty("processedBytes") long processedBytes,
6976
@JsonProperty("physicalInputBytes") long physicalInputBytes,
7077
@JsonProperty("physicalWrittenBytes") long physicalWrittenBytes,
78+
@JsonProperty("internalNetworkInputBytes") long internalNetworkInputBytes,
7179
@JsonProperty("peakMemoryBytes") long peakMemoryBytes,
7280
@JsonProperty("spilledBytes") long spilledBytes,
7381
@JsonProperty("rootStage") StageStats rootStage)
@@ -82,14 +90,18 @@ public StatementStats(
8290
this.queuedSplits = queuedSplits;
8391
this.runningSplits = runningSplits;
8492
this.completedSplits = completedSplits;
93+
this.planningTimeMillis = planningTimeMillis;
94+
this.analysisTimeMillis = analysisTimeMillis;
8595
this.cpuTimeMillis = cpuTimeMillis;
8696
this.wallTimeMillis = wallTimeMillis;
8797
this.queuedTimeMillis = queuedTimeMillis;
8898
this.elapsedTimeMillis = elapsedTimeMillis;
99+
this.finishingTimeMillis = finishingTimeMillis;
89100
this.processedRows = processedRows;
90101
this.processedBytes = processedBytes;
91102
this.physicalInputBytes = physicalInputBytes;
92103
this.physicalWrittenBytes = physicalWrittenBytes;
104+
this.internalNetworkInputBytes = internalNetworkInputBytes;
93105
this.peakMemoryBytes = peakMemoryBytes;
94106
this.spilledBytes = spilledBytes;
95107
this.rootStage = rootStage;
@@ -155,6 +167,18 @@ public int getCompletedSplits()
155167
return completedSplits;
156168
}
157169

170+
@JsonProperty
171+
public long getPlanningTimeMillis()
172+
{
173+
return planningTimeMillis;
174+
}
175+
176+
@JsonProperty
177+
public long getAnalysisTimeMillis()
178+
{
179+
return analysisTimeMillis;
180+
}
181+
158182
@JsonProperty
159183
public long getCpuTimeMillis()
160184
{
@@ -179,6 +203,12 @@ public long getElapsedTimeMillis()
179203
return elapsedTimeMillis;
180204
}
181205

206+
@JsonProperty
207+
public long getFinishingTimeMillis()
208+
{
209+
return finishingTimeMillis;
210+
}
211+
182212
@JsonProperty
183213
public long getProcessedRows()
184214
{
@@ -203,6 +233,12 @@ public long getPhysicalWrittenBytes()
203233
return physicalWrittenBytes;
204234
}
205235

236+
@JsonProperty
237+
public long getInternalNetworkInputBytes()
238+
{
239+
return internalNetworkInputBytes;
240+
}
241+
206242
@JsonProperty
207243
public long getPeakMemoryBytes()
208244
{
@@ -236,14 +272,18 @@ public String toString()
236272
.add("queuedSplits", queuedSplits)
237273
.add("runningSplits", runningSplits)
238274
.add("completedSplits", completedSplits)
275+
.add("planningTimeMillis", planningTimeMillis)
276+
.add("analysisTimeMillis", analysisTimeMillis)
239277
.add("cpuTimeMillis", cpuTimeMillis)
240278
.add("wallTimeMillis", wallTimeMillis)
241279
.add("queuedTimeMillis", queuedTimeMillis)
242280
.add("elapsedTimeMillis", elapsedTimeMillis)
281+
.add("finishingTimeMillis", finishingTimeMillis)
243282
.add("processedRows", processedRows)
244283
.add("processedBytes", processedBytes)
245284
.add("physicalInputBytes", physicalInputBytes)
246285
.add("physicalWrittenBytes", physicalWrittenBytes)
286+
.add("internalNetworkInputBytes", internalNetworkInputBytes)
247287
.add("peakMemoryBytes", peakMemoryBytes)
248288
.add("spilledBytes", spilledBytes)
249289
.add("rootStage", rootStage)
@@ -267,14 +307,18 @@ public static class Builder
267307
private int queuedSplits;
268308
private int runningSplits;
269309
private int completedSplits;
310+
private long planningTimeMillis;
311+
private long analysisTimeMillis;
270312
private long cpuTimeMillis;
271313
private long wallTimeMillis;
272314
private long queuedTimeMillis;
273315
private long elapsedTimeMillis;
316+
private long finishingTimeMillis;
274317
private long processedRows;
275318
private long processedBytes;
276319
private long physicalInputBytes;
277320
private long physicalWrittenBytes;
321+
private long internalNetworkInputBytes;
278322
private long peakMemoryBytes;
279323
private long spilledBytes;
280324
private StageStats rootStage;
@@ -341,6 +385,18 @@ public Builder setCompletedSplits(int completedSplits)
341385
return this;
342386
}
343387

388+
public Builder setPlanningTimeMillis(long planningTimeMillis)
389+
{
390+
this.planningTimeMillis = planningTimeMillis;
391+
return this;
392+
}
393+
394+
public Builder setAnalysisTimeMillis(long analysisTimeMillis)
395+
{
396+
this.analysisTimeMillis = analysisTimeMillis;
397+
return this;
398+
}
399+
344400
public Builder setCpuTimeMillis(long cpuTimeMillis)
345401
{
346402
this.cpuTimeMillis = cpuTimeMillis;
@@ -365,6 +421,12 @@ public Builder setElapsedTimeMillis(long elapsedTimeMillis)
365421
return this;
366422
}
367423

424+
public Builder setFinishingTimeMillis(long finishingTimeMillis)
425+
{
426+
this.finishingTimeMillis = finishingTimeMillis;
427+
return this;
428+
}
429+
368430
public Builder setProcessedRows(long processedRows)
369431
{
370432
this.processedRows = processedRows;
@@ -389,6 +451,12 @@ public Builder setPhysicalWrittenBytes(long physicalWrittenBytes)
389451
return this;
390452
}
391453

454+
public Builder setInternalNetworkInputBytes(long internalNetworkInputBytes)
455+
{
456+
this.internalNetworkInputBytes = internalNetworkInputBytes;
457+
return this;
458+
}
459+
392460
public Builder setPeakMemoryBytes(long peakMemoryBytes)
393461
{
394462
this.peakMemoryBytes = peakMemoryBytes;
@@ -420,14 +488,18 @@ public StatementStats build()
420488
queuedSplits,
421489
runningSplits,
422490
completedSplits,
491+
planningTimeMillis,
492+
analysisTimeMillis,
423493
cpuTimeMillis,
424494
wallTimeMillis,
425495
queuedTimeMillis,
426496
elapsedTimeMillis,
497+
finishingTimeMillis,
427498
processedRows,
428499
processedBytes,
429500
physicalInputBytes,
430501
physicalWrittenBytes,
502+
internalNetworkInputBytes,
431503
peakMemoryBytes,
432504
spilledBytes,
433505
rootStage);

client/trino-client/src/test/java/io/trino/client/TestRetry.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ private String newQueryResults(String state)
143143
TypedQueryData.of(IntStream.range(0, numRecords)
144144
.mapToObj(index -> Stream.of((Object) index, "a").collect(toList()))
145145
.collect(toList())),
146-
new StatementStats(state, state.equals("QUEUED"), true, OptionalDouble.of(0), OptionalDouble.of(0), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null),
146+
new StatementStats(state, state.equals("QUEUED"), true, OptionalDouble.of(0), OptionalDouble.of(0), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null),
147147
null,
148148
ImmutableList.of(),
149149
null,

client/trino-jdbc/src/main/java/io/trino/jdbc/QueryStats.java

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,19 @@ public final class QueryStats
3232
private final int queuedSplits;
3333
private final int runningSplits;
3434
private final int completedSplits;
35+
private final long planningTimeMillis;
36+
private final long analysisTimeMillis;
3537
private final long cpuTimeMillis;
3638
private final long wallTimeMillis;
3739
private final long queuedTimeMillis;
3840
private final long elapsedTimeMillis;
41+
private final long finishingTimeMillis;
3942
private final long processedRows;
4043
private final long processedBytes;
4144
private final long peakMemoryBytes;
45+
private final long physicalInputBytes;
46+
private final long physicalWrittenBytes;
47+
private final long internalNetworkInputBytes;
4248
private final Optional<StageStats> rootStage;
4349

4450
public QueryStats(
@@ -52,13 +58,19 @@ public QueryStats(
5258
int queuedSplits,
5359
int runningSplits,
5460
int completedSplits,
61+
long planningTimeMillis,
62+
long analysisTimeMillis,
5563
long cpuTimeMillis,
5664
long wallTimeMillis,
5765
long queuedTimeMillis,
5866
long elapsedTimeMillis,
67+
long finishingTimeMillis,
5968
long processedRows,
6069
long processedBytes,
6170
long peakMemoryBytes,
71+
long physicalInputBytes,
72+
long physicalWrittenBytes,
73+
long internalNetworkInputBytes,
6274
Optional<StageStats> rootStage)
6375
{
6476
this.queryId = requireNonNull(queryId, "queryId is null");
@@ -71,13 +83,19 @@ public QueryStats(
7183
this.queuedSplits = queuedSplits;
7284
this.runningSplits = runningSplits;
7385
this.completedSplits = completedSplits;
86+
this.planningTimeMillis = planningTimeMillis;
87+
this.analysisTimeMillis = analysisTimeMillis;
7488
this.cpuTimeMillis = cpuTimeMillis;
7589
this.wallTimeMillis = wallTimeMillis;
7690
this.queuedTimeMillis = queuedTimeMillis;
7791
this.elapsedTimeMillis = elapsedTimeMillis;
92+
this.finishingTimeMillis = finishingTimeMillis;
7893
this.processedRows = processedRows;
7994
this.processedBytes = processedBytes;
8095
this.peakMemoryBytes = peakMemoryBytes;
96+
this.physicalInputBytes = physicalInputBytes;
97+
this.physicalWrittenBytes = physicalWrittenBytes;
98+
this.internalNetworkInputBytes = internalNetworkInputBytes;
8199
this.rootStage = requireNonNull(rootStage, "rootStage is null");
82100
}
83101

@@ -94,13 +112,19 @@ static QueryStats create(String queryId, StatementStats stats)
94112
stats.getQueuedSplits(),
95113
stats.getRunningSplits(),
96114
stats.getCompletedSplits(),
115+
stats.getPlanningTimeMillis(),
116+
stats.getAnalysisTimeMillis(),
97117
stats.getCpuTimeMillis(),
98118
stats.getWallTimeMillis(),
99119
stats.getQueuedTimeMillis(),
100120
stats.getElapsedTimeMillis(),
121+
stats.getFinishingTimeMillis(),
101122
stats.getProcessedRows(),
102123
stats.getProcessedBytes(),
103124
stats.getPeakMemoryBytes(),
125+
stats.getPhysicalInputBytes(),
126+
stats.getPhysicalWrittenBytes(),
127+
stats.getInternalNetworkInputBytes(),
104128
Optional.ofNullable(stats.getRootStage()).map(StageStats::create));
105129
}
106130

@@ -154,6 +178,16 @@ public int getCompletedSplits()
154178
return completedSplits;
155179
}
156180

181+
public long getPlanningTimeMillis()
182+
{
183+
return planningTimeMillis;
184+
}
185+
186+
public long getAnalysisTimeMillis()
187+
{
188+
return analysisTimeMillis;
189+
}
190+
157191
public long getCpuTimeMillis()
158192
{
159193
return cpuTimeMillis;
@@ -174,6 +208,11 @@ public long getElapsedTimeMillis()
174208
return elapsedTimeMillis;
175209
}
176210

211+
public long getFinishingTimeMillis()
212+
{
213+
return finishingTimeMillis;
214+
}
215+
177216
public long getProcessedRows()
178217
{
179218
return processedRows;
@@ -189,6 +228,21 @@ public long getPeakMemoryBytes()
189228
return peakMemoryBytes;
190229
}
191230

231+
public long getPhysicalInputBytes()
232+
{
233+
return physicalInputBytes;
234+
}
235+
236+
public long getPhysicalWrittenBytes()
237+
{
238+
return physicalWrittenBytes;
239+
}
240+
241+
public long getInternalNetworkInputBytes()
242+
{
243+
return internalNetworkInputBytes;
244+
}
245+
192246
public Optional<StageStats> getRootStage()
193247
{
194248
return rootStage;

client/trino-jdbc/src/test/java/io/trino/jdbc/TestAsyncResultIterator.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,10 @@ public StatementStats getStats()
333333
100,
334334
100,
335335
100,
336+
100,
337+
100,
338+
100,
339+
100,
336340
StageStats.builder()
337341
.setStageId("id")
338342
.setDone(false)

client/trino-jdbc/src/test/java/io/trino/jdbc/TestProgressMonitor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ private String newQueryResults(Integer partialCancelId, Integer nextUriId, List<
9999
nextUriId == null ? null : server.url(format("/v1/statement/%s/%s", queryId, nextUriId)).uri(),
100100
responseColumns,
101101
TypedQueryData.of(data),
102-
new StatementStats(state, state.equals("QUEUED"), true, OptionalDouble.of(0), OptionalDouble.of(0), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null),
102+
new StatementStats(state, state.equals("QUEUED"), true, OptionalDouble.of(0), OptionalDouble.of(0), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null),
103103
null,
104104
ImmutableList.of(),
105105
null,

core/trino-main/src/main/java/io/trino/execution/QueryStateMachine.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -547,6 +547,7 @@ private BasicQueryStats createBasicQueryStats(BasicStageStats stageStats)
547547
stageStats.getSpilledDataSize(),
548548
stageStats.getPhysicalInputDataSize(),
549549
stageStats.getPhysicalWrittenDataSize(),
550+
stageStats.getInternalNetworkInputDataSize(),
550551

551552
stageStats.getCumulativeUserMemory(),
552553
stageStats.getFailedCumulativeUserMemory(),
@@ -555,10 +556,13 @@ private BasicQueryStats createBasicQueryStats(BasicStageStats stageStats)
555556
succinctBytes(getPeakUserMemoryInBytes()),
556557
succinctBytes(getPeakTotalMemoryInBytes()),
557558

559+
queryStateTimer.getPlanningTime(),
560+
queryStateTimer.getAnalysisTime(),
558561
stageStats.getTotalCpuTime(),
559562
stageStats.getFailedCpuTime(),
560563
stageStats.getTotalScheduledTime(),
561564
stageStats.getFailedScheduledTime(),
565+
queryStateTimer.getFinishingTime(),
562566

563567
stageStats.isFullyBlocked(),
564568
stageStats.getBlockedReasons(),

0 commit comments

Comments
 (0)