This is an automated email from the ASF dual-hosted git repository. preetham02 pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/asterixdb.git
commit b19ee4869d195a829183d2772b7be277ab213f72 Author: Ian Maxon <ian@maxons.email> AuthorDate: Wed May 21 14:16:22 2025 -0700 [ASTERIXDB-3611][RT] Add more stats to query profile - user model changes: yes - storage format changes: no - interface changes: yes Details: Add frame counts and average tuples per frame to the query profile. Also add the raw size of all tuples forwarded from the operator. Additionally, improve the calculation of average tuple size to be a normal average rather than a running average. This should be fine, because the number of bytes flowing through and operator should be less than ~8 EB. Furthermore, pull up all of these stats, along with the tuple size stats, to the summarized profile in the query plan. The averages represented in the summarized plan are a weighted average of each operator's average, proportional to the cardinality of that instance versus the total across all partitions. Ext-ref: MB-66797 Change-Id: I524cbfb1685ad3c7ed269c2db48482e5aba1ce61 Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/19809 Integration-Tests: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Tested-by: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Reviewed-by: Ali Alsuliman <ali.al.solai...@gmail.com> --- .../profile/full-scan/full-scan.3.regexjson | 25 ++++- .../non-unary-subplan.3.regexjson | 85 +++++++++++++---- .../results/profile/plansleep/sleep.3.regexjson | 66 +++++++++++++- .../results/profile/sleep/sleep.3.regexjson | 22 ++++- .../results/profile/sleep/sleep.4.regexjson | 42 +++++++-- .../results/profile/sleep/sleep.5.regexjson | 55 ++++++++--- .../LogicalOperatorPrettyPrintVisitorJson.java | 101 ++++++++++++++++++++- .../hyracks/api/dataflow/ProfiledFrameWriter.java | 10 +- .../hyracks/api/job/profiling/IOperatorStats.java | 6 +- .../api/job/profiling/NoOpOperatorStats.java | 7 +- .../hyracks/api/job/profiling/OperatorStats.java | 40 +++++--- .../common/job/profiling/om/TaskProfile.java | 6 +- 12 files changed, 385 insertions(+), 80 deletions(-) diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/profile/full-scan/full-scan.3.regexjson b/asterixdb/asterix-app/src/test/resources/runtimets/results/profile/full-scan/full-scan.3.regexjson index 68c1311b32..106c58a8ab 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/results/profile/full-scan/full-scan.3.regexjson +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/profile/full-scan/full-scan.3.regexjson @@ -40,7 +40,10 @@ "cardinality-out": "R{[0-9.]+}", "avg-tuple-size": "R{[0-9.]+}", "min-tuple-size": "R{[0-9.]+}", - "max-tuple-size": "R{[0-9.]+}" + "max-tuple-size": "R{[0-9.]+}", + "tuple-bytes": "R{.+}", + "frames-processed": "R{[0-9.]+}", + "avg-tuples-per-frame": "R{[0-9.]+}" }, { "name": "R{.+}", @@ -51,7 +54,10 @@ "cardinality-out": "R{[0-9.]+}", "avg-tuple-size": "R{[0-9.]+}", "min-tuple-size": "R{[0-9.]+}", - "max-tuple-size": "R{[0-9.]+}" + "max-tuple-size": "R{[0-9.]+}", + "tuple-bytes": "R{.+}", + "frames-processed": "R{[0-9.]+}", + "avg-tuples-per-frame": "R{[0-9.]+}" }, { "name": "R{.+}", @@ -60,7 +66,10 @@ "cardinality-out": "R{[0-9.]+}", "avg-tuple-size": "R{[0-9.]+}", "min-tuple-size": "R{[0-9.]+}", - "max-tuple-size": "R{[0-9.]+}" + "max-tuple-size": "R{[0-9.]+}", + "tuple-bytes": "R{.+}", + "frames-processed": "R{[0-9.]+}", + "avg-tuples-per-frame": "R{[0-9.]+}" } ] }, @@ -77,7 +86,10 @@ "cardinality-out": "R{[0-9.]+}", "avg-tuple-size": "R{[0-9.]+}", "min-tuple-size": "R{[0-9.]+}", - "max-tuple-size": "R{[0-9.]+}" + "max-tuple-size": "R{[0-9.]+}", + "tuple-bytes": "R{.+}", + "frames-processed": "R{[0-9.]+}", + "avg-tuples-per-frame": "R{[0-9.]+}" }, { "name": "R{.+}", @@ -86,7 +98,10 @@ "cardinality-out": "R{[0-9.]+}", "avg-tuple-size": "R{[0-9.]+}", "min-tuple-size": "R{[0-9.]+}", - "max-tuple-size": "R{[0-9.]+}" + "max-tuple-size": "R{[0-9.]+}", + "tuple-bytes": "R{.+}", + "frames-processed": "R{[0-9.]+}", + "avg-tuples-per-frame": "R{[0-9.]+}" }, { "name": "R{.+}", diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/profile/non-unary-subplan/non-unary-subplan.3.regexjson b/asterixdb/asterix-app/src/test/resources/runtimets/results/profile/non-unary-subplan/non-unary-subplan.3.regexjson index 3217ebd506..946db29fc1 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/results/profile/non-unary-subplan/non-unary-subplan.3.regexjson +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/profile/non-unary-subplan/non-unary-subplan.3.regexjson @@ -36,7 +36,10 @@ "cardinality-out": "R{[0-9.]+}", "avg-tuple-size": "R{[0-9.]+}", "min-tuple-size": "R{[0-9.]+}", - "max-tuple-size": "R{[0-9.]+}" + "max-tuple-size": "R{[0-9.]+}", + "tuple-bytes": "R{[0-9.]+}", + "frames-processed": "R{[0-9.]+}", + "avg-tuples-per-frame": "R{[0-9.]+}" }, { "name": "R{(?s).*}", @@ -45,7 +48,10 @@ "cardinality-out": "R{[0-9.]+}", "avg-tuple-size": "R{[0-9.]+}", "min-tuple-size": "R{[0-9.]+}", - "max-tuple-size": "R{[0-9.]+}" + "max-tuple-size": "R{[0-9.]+}", + "tuple-bytes": "R{[0-9.]+}", + "frames-processed": "R{[0-9.]+}", + "avg-tuples-per-frame": "R{[0-9.]+}" }, { "name": "R{(?s).*}", @@ -54,7 +60,10 @@ "cardinality-out": "R{[0-9.]+}", "avg-tuple-size": "R{[0-9.]+}", "min-tuple-size": "R{[0-9.]+}", - "max-tuple-size": "R{[0-9.]+}" + "max-tuple-size": "R{[0-9.]+}", + "tuple-bytes": "R{[0-9.]+}", + "frames-processed": "R{[0-9.]+}", + "avg-tuples-per-frame": "R{[0-9.]+}" }, { "name": "R{(?s).*}", @@ -63,7 +72,10 @@ "cardinality-out": "R{[0-9.]+}", "avg-tuple-size": "R{[0-9.]+}", "min-tuple-size": "R{[0-9.]+}", - "max-tuple-size": "R{[0-9.]+}" + "max-tuple-size": "R{[0-9.]+}", + "tuple-bytes": "R{[0-9.]+}", + "frames-processed": "R{[0-9.]+}", + "avg-tuples-per-frame": "R{[0-9.]+}" }, { "name": "R{(?s).*}", @@ -72,7 +84,10 @@ "cardinality-out": "R{[0-9.]+}", "avg-tuple-size": "R{[0-9.]+}", "min-tuple-size": "R{[0-9.]+}", - "max-tuple-size": "R{[0-9.]+}" + "max-tuple-size": "R{[0-9.]+}", + "tuple-bytes": "R{[0-9.]+}", + "frames-processed": "R{[0-9.]+}", + "avg-tuples-per-frame": "R{[0-9.]+}" }, { "name": "R{(?s).*}", @@ -81,7 +96,10 @@ "cardinality-out": "R{[0-9.]+}", "avg-tuple-size": "R{[0-9.]+}", "min-tuple-size": "R{[0-9.]+}", - "max-tuple-size": "R{[0-9.]+}" + "max-tuple-size": "R{[0-9.]+}", + "tuple-bytes": "R{[0-9.]+}", + "frames-processed": "R{[0-9.]+}", + "avg-tuples-per-frame": "R{[0-9.]+}" }, { "name": "R{(?s).*}", @@ -90,7 +108,10 @@ "cardinality-out": "R{[0-9.]+}", "avg-tuple-size": "R{[0-9.]+}", "min-tuple-size": "R{[0-9.]+}", - "max-tuple-size": "R{[0-9.]+}" + "max-tuple-size": "R{[0-9.]+}", + "tuple-bytes": "R{[0-9.]+}", + "frames-processed": "R{[0-9.]+}", + "avg-tuples-per-frame": "R{[0-9.]+}" }, { "name": "R{(?s).*}", @@ -99,7 +120,10 @@ "cardinality-out": "R{[0-9.]+}", "avg-tuple-size": "R{[0-9.]+}", "min-tuple-size": "R{[0-9.]+}", - "max-tuple-size": "R{[0-9.]+}" + "max-tuple-size": "R{[0-9.]+}", + "tuple-bytes": "R{[0-9.]+}", + "frames-processed": "R{[0-9.]+}", + "avg-tuples-per-frame": "R{[0-9.]+}" }, { "name": "R{(?s).*}", @@ -108,7 +132,10 @@ "cardinality-out": "R{[0-9.]+}", "avg-tuple-size": "R{[0-9.]+}", "min-tuple-size": "R{[0-9.]+}", - "max-tuple-size": "R{[0-9.]+}" + "max-tuple-size": "R{[0-9.]+}", + "tuple-bytes": "R{[0-9.]+}", + "frames-processed": "R{[0-9.]+}", + "avg-tuples-per-frame": "R{[0-9.]+}" }, { "name": "R{(?s).*}", @@ -117,7 +144,10 @@ "cardinality-out": "R{[0-9.]+}", "avg-tuple-size": "R{[0-9.]+}", "min-tuple-size": "R{[0-9.]+}", - "max-tuple-size": "R{[0-9.]+}" + "max-tuple-size": "R{[0-9.]+}", + "tuple-bytes": "R{[0-9.]+}", + "frames-processed": "R{[0-9.]+}", + "avg-tuples-per-frame": "R{[0-9.]+}" }, { "name": "R{(?s).*}", @@ -126,7 +156,10 @@ "cardinality-out": "R{[0-9.]+}", "avg-tuple-size": "R{[0-9.]+}", "min-tuple-size": "R{[0-9.]+}", - "max-tuple-size": "R{[0-9.]+}" + "max-tuple-size": "R{[0-9.]+}", + "tuple-bytes": "R{[0-9.]+}", + "frames-processed": "R{[0-9.]+}", + "avg-tuples-per-frame": "R{[0-9.]+}" }, { "name": "R{(?s).*}", @@ -135,7 +168,10 @@ "cardinality-out": "R{[0-9.]+}", "avg-tuple-size": "R{[0-9.]+}", "min-tuple-size": "R{[0-9.]+}", - "max-tuple-size": "R{[0-9.]+}" + "max-tuple-size": "R{[0-9.]+}", + "tuple-bytes": "R{[0-9.]+}", + "frames-processed": "R{[0-9.]+}", + "avg-tuples-per-frame": "R{[0-9.]+}" }, { "name": "R{(?s).*}", @@ -144,7 +180,10 @@ "cardinality-out": "R{[0-9.]+}", "avg-tuple-size": "R{[0-9.]+}", "min-tuple-size": "R{[0-9.]+}", - "max-tuple-size": "R{[0-9.]+}" + "max-tuple-size": "R{[0-9.]+}", + "tuple-bytes": "R{[0-9.]+}", + "frames-processed": "R{[0-9.]+}", + "avg-tuples-per-frame": "R{[0-9.]+}" }, { "name": "R{(?s).*}", @@ -183,7 +222,10 @@ "cardinality-out": "R{[0-9.]+}", "avg-tuple-size": "R{[0-9.]+}", "min-tuple-size": "R{[0-9.]+}", - "max-tuple-size": "R{[0-9.]+}" + "max-tuple-size": "R{[0-9.]+}", + "tuple-bytes": "R{[0-9.]+}", + "frames-processed": "R{[0-9.]+}", + "avg-tuples-per-frame": "R{[0-9.]+}" }, { "name": "R{(?s).*}", @@ -192,7 +234,10 @@ "cardinality-out": "R{[0-9.]+}", "avg-tuple-size": "R{[0-9.]+}", "min-tuple-size": "R{[0-9.]+}", - "max-tuple-size": "R{[0-9.]+}" + "max-tuple-size": "R{[0-9.]+}", + "tuple-bytes": "R{[0-9.]+}", + "frames-processed": "R{[0-9.]+}", + "avg-tuples-per-frame": "R{[0-9.]+}" }, { "name": "R{(?s).*}", @@ -201,7 +246,10 @@ "cardinality-out": "R{[0-9.]+}", "avg-tuple-size": "R{[0-9.]+}", "min-tuple-size": "R{[0-9.]+}", - "max-tuple-size": "R{[0-9.]+}" + "max-tuple-size": "R{[0-9.]+}", + "tuple-bytes": "R{[0-9.]+}", + "frames-processed": "R{[0-9.]+}", + "avg-tuples-per-frame": "R{[0-9.]+}" }, { "name": "R{(?s).*}", @@ -210,7 +258,10 @@ "cardinality-out": "R{[0-9.]+}", "avg-tuple-size": "R{[0-9.]+}", "min-tuple-size": "R{[0-9.]+}", - "max-tuple-size": "R{[0-9.]+}" + "max-tuple-size": "R{[0-9.]+}", + "tuple-bytes": "R{[0-9.]+}", + "frames-processed": "R{[0-9.]+}", + "avg-tuples-per-frame": "R{[0-9.]+}" } ] } diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/profile/plansleep/sleep.3.regexjson b/asterixdb/asterix-app/src/test/resources/runtimets/results/profile/plansleep/sleep.3.regexjson index 2754d24af4..28562e7110 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/results/profile/plansleep/sleep.3.regexjson +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/profile/plansleep/sleep.3.regexjson @@ -42,6 +42,12 @@ "min-cardinality": 3, "max-cardinality": 3, "total-cardinality": 3, + "min-tuple-size": 39, + "max-tuple-size": 44, + "avg-tuple-size": 41.666666666666664, + "frame-count": 1, + "avg-tuples-per-frame": 3.0, + "tuple-bytes": "125 bytes", "physical-operator": "STREAM_PROJECT", "execution-mode": "PARTITIONED", "optimizer-estimates": { @@ -93,7 +99,13 @@ "max-time": "R{[0-9.]+}", "min-cardinality": 3, "max-cardinality": 3, - "total-cardinality": 3 + "total-cardinality": 3, + "min-tuple-size": 53, + "max-tuple-size": 63, + "avg-tuple-size": 58.333333333333336, + "frame-count": 1, + "avg-tuples-per-frame": 3.0, + "tuple-bytes": "175 bytes" } ], "physical-operator": "STABLE_SORT [$$49(ASC)]", @@ -137,6 +149,12 @@ "min-cardinality": 3, "max-cardinality": 3, "total-cardinality": 3, + "min-tuple-size": 53, + "max-tuple-size": 63, + "avg-tuple-size": 58.333333333333336, + "frame-count": 1, + "avg-tuples-per-frame": 3.0, + "tuple-bytes": "175 bytes", "physical-operator": "ASSIGN", "execution-mode": "PARTITIONED", "optimizer-estimates": { @@ -165,6 +183,12 @@ "min-cardinality": 3, "max-cardinality": 3, "total-cardinality": 3, + "min-tuple-size": 53, + "max-tuple-size": 63, + "avg-tuple-size": 58.333333333333336, + "frame-count": 1, + "avg-tuples-per-frame": 3.0, + "tuple-bytes": "175 bytes", "physical-operator": "ASSIGN", "execution-mode": "PARTITIONED", "optimizer-estimates": { @@ -233,7 +257,13 @@ "max-time": "R{[0-9.]+}", "min-cardinality": 3, "max-cardinality": 3, - "total-cardinality": 3 + "total-cardinality": 3, + "min-tuple-size": 27, + "max-tuple-size": 32, + "avg-tuple-size": 29.666666666666668, + "frame-count": 1, + "avg-tuples-per-frame": 3.0, + "tuple-bytes": "89 bytes" } ], "physical-operator": "SORT_GROUP_BY[$$56]", @@ -309,7 +339,13 @@ "max-time": "R{[0-9.]+}", "min-cardinality": 3, "max-cardinality": 3, - "total-cardinality": 3 + "total-cardinality": 3, + "min-tuple-size": 27, + "max-tuple-size": 32, + "avg-tuple-size": 29.666666666666668, + "frame-count": 1, + "avg-tuples-per-frame": 3.0, + "tuple-bytes": "89 bytes" } ], "physical-operator": "SORT_GROUP_BY[$$50]", @@ -352,6 +388,12 @@ "min-cardinality": "R{[0-9.]+}", "max-cardinality": "R{[0-9.]+}", "total-cardinality": "R{[0-9.]+}", + "min-tuple-size": "R{[0-9.]+}", + "max-tuple-size": "R{[0-9.]+}", + "avg-tuple-size": "R{[0-9.]+}", + "frame-count": "R{[0-9.]+}", + "avg-tuples-per-frame": "R{[0-9.]+}", + "tuple-bytes": "R{.+}", "physical-operator": "ASSIGN", "execution-mode": "PARTITIONED", "optimizer-estimates": { @@ -371,6 +413,12 @@ "min-cardinality": 5, "max-cardinality": 5, "total-cardinality": 5, + "min-tuple-size": 142, + "max-tuple-size": 151, + "avg-tuple-size": 145.6, + "frame-count": 1, + "avg-tuples-per-frame": 5.0, + "tuple-bytes": "728 bytes", "physical-operator": "STREAM_SELECT", "execution-mode": "PARTITIONED", "optimizer-estimates": { @@ -392,6 +440,12 @@ "min-cardinality": 10, "max-cardinality": 10, "total-cardinality": 10, + "min-tuple-size": 137, + "max-tuple-size": 151, + "avg-tuple-size": 143.1, + "frame-count": 1, + "avg-tuples-per-frame": 10.0, + "tuple-bytes": "1 KB", "physical-operator": "STREAM_PROJECT", "execution-mode": "PARTITIONED", "optimizer-estimates": { @@ -428,6 +482,12 @@ "min-cardinality": 10, "max-cardinality": 10, "total-cardinality": 10, + "min-tuple-size": 150, + "max-tuple-size": 164, + "avg-tuple-size": 156.1, + "frame-count": 1, + "avg-tuples-per-frame": 10.0, + "tuple-bytes": "1 KB", "physical-operator": "DATASOURCE_SCAN", "execution-mode": "PARTITIONED", "optimizer-estimates": { diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/profile/sleep/sleep.3.regexjson b/asterixdb/asterix-app/src/test/resources/runtimets/results/profile/sleep/sleep.3.regexjson index b83927aa01..d5ceca0aab 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/results/profile/sleep/sleep.3.regexjson +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/profile/sleep/sleep.3.regexjson @@ -23,7 +23,10 @@ "cardinality-out": "R{[0-9.]+}", "avg-tuple-size": "R{[0-9.]+}", "min-tuple-size": "R{[0-9.]+}", - "max-tuple-size": "R{[0-9.]+}" + "max-tuple-size": "R{[0-9.]+}", + "tuple-bytes": "R{.+}", + "frames-processed": "R{[0-9.]+}", + "avg-tuples-per-frame": "R{[0-9.]+}" }, { "name": "R{.+}", @@ -34,16 +37,22 @@ "cardinality-out": "R{[0-9.]+}", "avg-tuple-size": "R{[0-9.]+}", "min-tuple-size": "R{[0-9.]+}", - "max-tuple-size": "R{[0-9.]+}" + "max-tuple-size": "R{[0-9.]+}", + "tuple-bytes": "R{.+}", + "frames-processed": "R{[0-9.]+}", + "avg-tuples-per-frame": "R{[0-9.]+}" }, { "name": "R{.+}", "run-time": "R{5.+}", "runtime-id": "R{.+}", "cardinality-out": 10, - "avg-tuple-size": 25, + "avg-tuple-size": 25.0, "min-tuple-size": 25, - "max-tuple-size": 25 + "max-tuple-size": 25, + "tuple-bytes": 250, + "frames-processed": 1, + "avg-tuples-per-frame": 10.0 }, { "name": "R{.+}", @@ -52,7 +61,10 @@ "cardinality-out": "R{[0-9.]+}", "avg-tuple-size": "R{[0-9.]+}", "min-tuple-size": "R{[0-9.]+}", - "max-tuple-size": "R{[0-9.]+}" + "max-tuple-size": "R{[0-9.]+}", + "tuple-bytes": "R{.+}", + "frames-processed": "R{[0-9.]+}", + "avg-tuples-per-frame": "R{[0-9.]+}" }, { "name": "R{.+}", diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/profile/sleep/sleep.4.regexjson b/asterixdb/asterix-app/src/test/resources/runtimets/results/profile/sleep/sleep.4.regexjson index 87b6ab1eac..aafd14333f 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/results/profile/sleep/sleep.4.regexjson +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/profile/sleep/sleep.4.regexjson @@ -40,7 +40,10 @@ "cardinality-out": "R{[0-9.]+}", "avg-tuple-size": "R{[0-9.]+}", "min-tuple-size": "R{[0-9.]+}", - "max-tuple-size": "R{[0-9.]+}" + "max-tuple-size": "R{[0-9.]+}", + "tuple-bytes": "R{.+}", + "frames-processed": "R{[0-9.]+}", + "avg-tuples-per-frame": "R{[0-9.]+}" } ] }, @@ -70,7 +73,10 @@ "cardinality-out": "R{[0-9.]+}", "avg-tuple-size": "R{[0-9.]+}", "min-tuple-size": "R{[0-9.]+}", - "max-tuple-size": "R{[0-9.]+}" + "max-tuple-size": "R{[0-9.]+}", + "tuple-bytes": "R{.+}", + "frames-processed": "R{[0-9.]+}", + "avg-tuples-per-frame": "R{[0-9.]+}" }, { "name": "R{.+}", @@ -79,7 +85,10 @@ "cardinality-out": "R{[0-9.]+}", "avg-tuple-size": "R{[0-9.]+}", "min-tuple-size": "R{[0-9.]+}", - "max-tuple-size": "R{[0-9.]+}" + "max-tuple-size": "R{[0-9.]+}", + "tuple-bytes": "R{.+}", + "frames-processed": "R{[0-9.]+}", + "avg-tuples-per-frame": "R{[0-9.]+}" }, { "name": "R{.+}", @@ -99,9 +108,12 @@ "run-time": "R{[0-9.]+}", "runtime-id": "R{.+}", "cardinality-out": 10, - "avg-tuple-size": 140, + "avg-tuple-size": 143.1, "min-tuple-size": 137, - "max-tuple-size": 151 + "max-tuple-size": 151, + "tuple-bytes": 1431, + "frames-processed": 1, + "avg-tuples-per-frame": 10.0 }, { "name": "R{.+}", @@ -112,7 +124,10 @@ "cardinality-out": "R{[0-9.]+}", "avg-tuple-size": "R{[0-9.]+}", "min-tuple-size": "R{[0-9.]+}", - "max-tuple-size": "R{[0-9.]+}" + "max-tuple-size": "R{[0-9.]+}", + "tuple-bytes": "R{.+}", + "frames-processed": "R{[0-9.]+}", + "avg-tuples-per-frame": "R{[0-9.]+}" }, { "name": "R{.+}", @@ -121,7 +136,10 @@ "cardinality-out": "R{[0-9.]+}", "avg-tuple-size": "R{[0-9.]+}", "min-tuple-size": "R{[0-9.]+}", - "max-tuple-size": "R{[0-9.]+}" + "max-tuple-size": "R{[0-9.]+}", + "tuple-bytes": "R{.+}", + "frames-processed": "R{[0-9.]+}", + "avg-tuples-per-frame": "R{[0-9.]+}" }, { "name": "R{.+}", @@ -130,7 +148,10 @@ "cardinality-out": "R{[0-9.]+}", "avg-tuple-size": "R{[0-9.]+}", "min-tuple-size": "R{[0-9.]+}", - "max-tuple-size": "R{[0-9.]+}" + "max-tuple-size": "R{[0-9.]+}", + "tuple-bytes": "R{.+}", + "frames-processed": "R{[0-9.]+}", + "avg-tuples-per-frame": "R{[0-9.]+}" }, { "name": "R{.+}", @@ -139,7 +160,10 @@ "cardinality-out": "R{[0-9.]+}", "avg-tuple-size": "R{[0-9.]+}", "min-tuple-size": "R{[0-9.]+}", - "max-tuple-size": "R{[0-9.]+}" + "max-tuple-size": "R{[0-9.]+}", + "tuple-bytes": "R{.+}", + "frames-processed": "R{[0-9.]+}", + "avg-tuples-per-frame": "R{[0-9.]+}" }, { "name": "R{.+}", diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/profile/sleep/sleep.5.regexjson b/asterixdb/asterix-app/src/test/resources/runtimets/results/profile/sleep/sleep.5.regexjson index 187c3c17ef..a107d0a9b9 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/results/profile/sleep/sleep.5.regexjson +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/profile/sleep/sleep.5.regexjson @@ -40,7 +40,10 @@ "cardinality-out": "R{[0-9.]+}", "avg-tuple-size": "R{[0-9.]+}", "min-tuple-size": "R{[0-9.]+}", - "max-tuple-size": "R{[0-9.]+}" + "max-tuple-size": "R{[0-9.]+}", + "tuple-bytes": "R{.+}", + "frames-processed": "R{[0-9.]+}", + "avg-tuples-per-frame": "R{[0-9.]+}" } ] }, @@ -70,7 +73,10 @@ "cardinality-out": "R{[0-9.]+}", "avg-tuple-size": "R{[0-9.]+}", "min-tuple-size": "R{[0-9.]+}", - "max-tuple-size": "R{[0-9.]+}" + "max-tuple-size": "R{[0-9.]+}", + "tuple-bytes": "R{.+}", + "frames-processed": "R{[0-9.]+}", + "avg-tuples-per-frame": "R{[0-9.]+}" }, { "name": "R{.+}", @@ -79,7 +85,10 @@ "cardinality-out": "R{[0-9.]+}", "avg-tuple-size": "R{[0-9.]+}", "min-tuple-size": "R{[0-9.]+}", - "max-tuple-size": "R{[0-9.]+}" + "max-tuple-size": "R{[0-9.]+}", + "tuple-bytes": "R{.+}", + "frames-processed": "R{[0-9.]+}", + "avg-tuples-per-frame": "R{[0-9.]+}" }, { "name": "R{.+}", @@ -88,7 +97,10 @@ "cardinality-out": "R{[0-9.]+}", "avg-tuple-size": "R{[0-9.]+}", "min-tuple-size": "R{[0-9.]+}", - "max-tuple-size": "R{[0-9.]+}" + "max-tuple-size": "R{[0-9.]+}", + "tuple-bytes": "R{.+}", + "frames-processed": "R{[0-9.]+}", + "avg-tuples-per-frame": "R{[0-9.]+}" }, { "name": "R{.+}", @@ -127,7 +139,10 @@ "cardinality-out": "R{[0-9.]+}", "avg-tuple-size": "R{[0-9.]+}", "min-tuple-size": "R{[0-9.]+}", - "max-tuple-size": "R{[0-9.]+}" + "max-tuple-size": "R{[0-9.]+}", + "tuple-bytes": "R{.+}", + "frames-processed": "R{[0-9.]+}", + "avg-tuples-per-frame": "R{[0-9.]+}" } ] }, @@ -144,7 +159,10 @@ "cardinality-out": "R{[0-9.]+}", "avg-tuple-size": "R{[0-9.]+}", "min-tuple-size": "R{[0-9.]+}", - "max-tuple-size": "R{[0-9.]+}" + "max-tuple-size": "R{[0-9.]+}", + "tuple-bytes": "R{.+}", + "frames-processed": "R{[0-9.]+}", + "avg-tuples-per-frame": "R{[0-9.]+}" }, { "name": "R{.+}", @@ -155,7 +173,10 @@ "cardinality-out": "R{[0-9.]+}", "avg-tuple-size": "R{[0-9.]+}", "min-tuple-size": "R{[0-9.]+}", - "max-tuple-size": "R{[0-9.]+}" + "max-tuple-size": "R{[0-9.]+}", + "tuple-bytes": "R{.+}", + "frames-processed": "R{[0-9.]+}", + "avg-tuples-per-frame": "R{[0-9.]+}" }, { "name": "R{.+}", @@ -164,7 +185,10 @@ "cardinality-out": "R{[0-9.]+}", "avg-tuple-size": "R{[0-9.]+}", "min-tuple-size": "R{[0-9.]+}", - "max-tuple-size": "R{[0-9.]+}" + "max-tuple-size": "R{[0-9.]+}", + "tuple-bytes": "R{.+}", + "frames-processed": "R{[0-9.]+}", + "avg-tuples-per-frame": "R{[0-9.]+}" }, { "name": "R{.+}", @@ -173,7 +197,10 @@ "cardinality-out": "R{[0-9.]+}", "avg-tuple-size": "R{[0-9.]+}", "min-tuple-size": "R{[0-9.]+}", - "max-tuple-size": "R{[0-9.]+}" + "max-tuple-size": "R{[0-9.]+}", + "tuple-bytes": "R{.+}", + "frames-processed": "R{[0-9.]+}", + "avg-tuples-per-frame": "R{[0-9.]+}" }, { "name": "R{.+}", @@ -182,7 +209,10 @@ "cardinality-out": "R{[0-9.]+}", "avg-tuple-size": "R{[0-9.]+}", "min-tuple-size": "R{[0-9.]+}", - "max-tuple-size": "R{[0-9.]+}" + "max-tuple-size": "R{[0-9.]+}", + "tuple-bytes": "R{.+}", + "frames-processed": "R{[0-9.]+}", + "avg-tuples-per-frame": "R{[0-9.]+}" }, { "name": "R{.+}", @@ -204,7 +234,10 @@ "cardinality-out": "R{[0-9.]+}", "avg-tuple-size": "R{[0-9.]+}", "min-tuple-size": "R{[0-9.]+}", - "max-tuple-size": "R{[0-9.]+}" + "max-tuple-size": "R{[0-9.]+}", + "tuple-bytes": "R{.+}", + "frames-processed": "R{[0-9.]+}", + "avg-tuples-per-frame": "R{[0-9.]+}" }, { "name": "R{.+}", diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitorJson.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitorJson.java index 05d4365829..a9be120402 100644 --- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitorJson.java +++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitorJson.java @@ -28,6 +28,7 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; +import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.mutable.Mutable; import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException; import org.apache.hyracks.algebricks.common.exceptions.NotImplementedException; @@ -116,6 +117,18 @@ public class LogicalOperatorPrettyPrintVisitorJson extends AbstractLogicalOperat private static final String MAX_CARDINALITY = "max-cardinality"; private static final String TOTAL_CARDINALITY = "total-cardinality"; + + private static final String MIN_TUPLE_SIZE = "min-tuple-size"; + + private static final String MAX_TUPLE_SIZE = "max-tuple-size"; + + private static final String AVG_TUPLE_SIZE = "avg-tuple-size"; + + private static final String FRAME_COUNT = "frame-count"; + + private static final String TUPLE_BYTES = "tuple-bytes"; + + private static final String AVG_TUPLES_PER_FRAME = "avg-tuples-per-frame"; private static final String NAME = "name"; private static final String ID = "id"; private static final String RUNTIME_ID = "runtime-id"; @@ -266,18 +279,53 @@ public class LogicalOperatorPrettyPrintVisitorJson extends AbstractLogicalOperat } + private static class WeightedAvg { + private long totalCard = 0; + private double weightedSum = 0.0; + private double avg = 0.0; + + public void update(double val, long card) { + weightedSum += val * card; + totalCard += card; + avg = totalCard > 0 ? weightedSum / totalCard : 0.0; + } + + } + private class OperatorProfile { Map<String, String> activityNames; Map<String, MinMax<Double>> activityTimes; Map<String, MinMax<Long>> activityCards; Map<String, Long> activityCardTotal; + Map<String, MinMax<Long>> activityTupleSizes; + Map<String, WeightedAvg> activityAvgTupleSizes; + Map<String, Long> activityFrameCountTotal; + Map<String, WeightedAvg> activityAvgTuplesPerFrame; + Map<String, Long> activityTupleBytes; OperatorProfile() { activityNames = new HashMap<>(); activityTimes = new HashMap<>(); activityCards = new HashMap<>(); activityCardTotal = new HashMap<>(); + activityTupleSizes = new HashMap<>(); + activityAvgTupleSizes = new HashMap<>(); + activityFrameCountTotal = new HashMap<>(); + activityAvgTuplesPerFrame = new HashMap<>(); + activityTupleBytes = new HashMap<>(); + } + + void updateOperator(String extendedOpId, String name, double time, long cardinality, long minSize, long maxSize, + double avgSize, long frameCount, double avgTuples, long tupleBytes) { + updateOperator(extendedOpId, name, time, cardinality); + updateMinMax(minSize, extendedOpId, activityTupleSizes); + updateMinMax(maxSize, extendedOpId, activityTupleSizes); + updateAverage(avgSize, cardinality, extendedOpId, activityAvgTupleSizes); + activityFrameCountTotal.compute(extendedOpId, + (id, calls) -> calls == null ? frameCount : calls + frameCount); + updateAverage(avgTuples, cardinality, extendedOpId, activityAvgTuplesPerFrame); + activityTupleBytes.compute(extendedOpId, (id, bytes) -> bytes == null ? tupleBytes : bytes + tupleBytes); } void updateOperator(String extendedOpId, String name, double time, long cardinality) { @@ -295,6 +343,11 @@ public class LogicalOperatorPrettyPrintVisitorJson extends AbstractLogicalOperat MinMax<T> stat = opMap.computeIfAbsent(id, i -> new MinMax<>(comp)); stat.update(comp); } + + private void updateAverage(double avg, long card, String id, Map<String, WeightedAvg> opMap) { + WeightedAvg stat = opMap.computeIfAbsent(id, i -> new WeightedAvg()); + stat.update(avg, card); + } } private Pair<ExtendedActivityId, String> splitAcId(String name) { @@ -314,9 +367,18 @@ public class LogicalOperatorPrettyPrintVisitorJson extends AbstractLogicalOperat profiledOps.computeIfAbsent(counters.get(RUNTIME_ID).asText(), i -> new OperatorProfile()); Pair<ExtendedActivityId, String> identities = splitAcId(counters.get(NAME).asText()); JsonNode card = counters.get("cardinality-out"); - if (card != null) { + JsonNode minTupleSz = counters.get("min-tuple-size"); + JsonNode maxTupleSz = counters.get("max-tuple-size"); + JsonNode avgTupleSz = counters.get("avg-tuple-size"); + JsonNode tupleBytes = counters.get("tuple-bytes"); + JsonNode framesProcessedNode = counters.get("frames-processed"); + JsonNode avgTuplesPerFrameNode = counters.get("avg-tuples-per-frame"); + if (card != null && minTupleSz != null && maxTupleSz != null && avgTupleSz != null + && framesProcessedNode != null && avgTuplesPerFrameNode != null && tupleBytes != null) { info.updateOperator(identities.first.getActivityAndLocalId(), identities.second, - counters.get("run-time").asDouble(), card.asLong(0)); + counters.get("run-time").asDouble(), card.asLong(), minTupleSz.asLong(), + maxTupleSz.asLong(), avgTupleSz.asDouble(), framesProcessedNode.asLong(), + avgTuplesPerFrameNode.asDouble(), tupleBytes.asLong()); } else { info.updateOperator(identities.first.getActivityAndLocalId(), identities.second, counters.get("run-time").asDouble()); @@ -394,7 +456,9 @@ public class LogicalOperatorPrettyPrintVisitorJson extends AbstractLogicalOperat } private void printActivityStats(Optional<MinMax<Double>> time, Optional<MinMax<Long>> card, - Optional<Long> totalCard) throws IOException { + Optional<Long> totalCard, Optional<MinMax<Long>> tupleSize, Optional<WeightedAvg> avgTupleSize, + Optional<Long> frameCount, Optional<WeightedAvg> avgTuplesPerFrame, Optional<Long> tupleBytes) + throws IOException { if (time.isPresent()) { jsonGenerator.writeNumberField(MIN_TIME, time.get().min); jsonGenerator.writeNumberField(MAX_TIME, time.get().max); @@ -406,6 +470,22 @@ public class LogicalOperatorPrettyPrintVisitorJson extends AbstractLogicalOperat if (totalCard.isPresent()) { jsonGenerator.writeNumberField(TOTAL_CARDINALITY, totalCard.get()); } + if (tupleSize.isPresent()) { + jsonGenerator.writeNumberField(MIN_TUPLE_SIZE, tupleSize.get().min); + jsonGenerator.writeNumberField(MAX_TUPLE_SIZE, tupleSize.get().max); + } + if (avgTupleSize.isPresent()) { + jsonGenerator.writeNumberField(AVG_TUPLE_SIZE, avgTupleSize.get().avg); + } + if (frameCount.isPresent()) { + jsonGenerator.writeNumberField(FRAME_COUNT, frameCount.get()); + } + if (avgTuplesPerFrame.isPresent()) { + jsonGenerator.writeNumberField(AVG_TUPLES_PER_FRAME, avgTuplesPerFrame.get().avg); + } + if (tupleBytes.isPresent()) { + jsonGenerator.writeStringField(TUPLE_BYTES, FileUtils.byteCountToDisplaySize(tupleBytes.get())); + } } private void printOperatorStats(OperatorProfile info) throws IOException { @@ -413,7 +493,13 @@ public class LogicalOperatorPrettyPrintVisitorJson extends AbstractLogicalOperat Optional<MinMax<Double>> times = info.activityTimes.values().stream().findFirst(); Optional<MinMax<Long>> cards = info.activityCards.values().stream().findFirst(); Optional<Long> total = info.activityCardTotal.values().stream().findFirst(); - printActivityStats(times, cards, total); + Optional<MinMax<Long>> tupleSizes = info.activityTupleSizes.values().stream().findFirst(); + Optional<WeightedAvg> avgTupleSize = info.activityAvgTupleSizes.values().stream().findFirst(); + Optional<Long> frameCount = info.activityFrameCountTotal.values().stream().findFirst(); + Optional<WeightedAvg> avgTuplesPerFrame = info.activityAvgTuplesPerFrame.values().stream().findFirst(); + Optional<Long> tupleBytes = info.activityTupleBytes.values().stream().findFirst(); + printActivityStats(times, cards, total, tupleSizes, avgTupleSize, frameCount, avgTuplesPerFrame, + tupleBytes); } else if (info.activityTimes.size() > 1) { jsonGenerator.writeArrayFieldStart("activity-stats"); for (String acId : info.activityTimes.keySet()) { @@ -425,7 +511,12 @@ public class LogicalOperatorPrettyPrintVisitorJson extends AbstractLogicalOperat jsonGenerator.writeStringField("id", acId); printActivityStats(Optional.ofNullable(info.activityTimes.get(acId)), Optional.ofNullable(info.activityCards.get(acId)), - Optional.ofNullable(info.activityCardTotal.get(acId))); + Optional.ofNullable(info.activityCardTotal.get(acId)), + Optional.ofNullable(info.activityTupleSizes.get(acId)), + Optional.ofNullable(info.activityAvgTupleSizes.get(acId)), + Optional.ofNullable(info.activityFrameCountTotal.get(acId)), + Optional.ofNullable(info.activityAvgTuplesPerFrame.get(acId)), + Optional.ofNullable(info.activityTupleBytes.get(acId))); jsonGenerator.writeEndObject(); } jsonGenerator.writeEndArray(); diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataflow/ProfiledFrameWriter.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataflow/ProfiledFrameWriter.java index fb4ed3ce1d..53de340a74 100644 --- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataflow/ProfiledFrameWriter.java +++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataflow/ProfiledFrameWriter.java @@ -44,7 +44,6 @@ public class ProfiledFrameWriter implements ITimedWriter { protected IOperatorStats inputStats = NoOpOperatorStats.INSTANCE; private int minSz = Integer.MAX_VALUE; private int maxSz = -1; - private long avgSz; private final ICounter totalTime; @@ -87,23 +86,22 @@ public class ProfiledFrameWriter implements ITimedWriter { int tupleCountOffset = FrameHelper.getTupleCountOffset(buffer.limit()); int tupleCount = IntSerDeUtils.getInt(buffer.array(), tupleCountOffset); ICounter tupleCounter = inputStats.getTupleCounter(); - long prevCount = tupleCounter.get(); + long tupleSizes = 0; for (int i = 0; i < tupleCount; i++) { int tupleLen = getTupleLength(i, tupleCountOffset, buffer); + tupleSizes += tupleLen; if (maxSz < tupleLen) { maxSz = tupleLen; } if (minSz > tupleLen) { minSz = tupleLen; } - long prev = avgSz * prevCount; - avgSz = (prev + tupleLen) / (prevCount + 1); - prevCount++; } inputStats.getMaxTupleSz().set(maxSz); inputStats.getMinTupleSz().set(minSz); - inputStats.getAverageTupleSz().set(avgSz); + inputStats.getTupleBytes().update(tupleSizes); tupleCounter.update(tupleCount); + inputStats.getTotalFrameCount().update(1); } @Override diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/profiling/IOperatorStats.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/profiling/IOperatorStats.java index 2dd7b4198e..6b6f64a31f 100644 --- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/profiling/IOperatorStats.java +++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/profiling/IOperatorStats.java @@ -72,10 +72,10 @@ public interface IOperatorStats extends IWritable, Serializable { ICounter cloudPersistPageCounter(); /** - * @return A counter used to set the average tuple size outputted by an operator + * @return A counter used to set the total number of tuple bytes outputted by an operator */ - ICounter getAverageTupleSz(); + ICounter getTupleBytes(); /** * @return A counter used to set the max tuple size outputted by an operator @@ -94,6 +94,8 @@ public interface IOperatorStats extends IWritable, Serializable { * like index searches or other scan types */ + ICounter getTotalFrameCount(); + ICounter getInputTupleCounter(); ICounter getLevel(); diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/profiling/NoOpOperatorStats.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/profiling/NoOpOperatorStats.java index 8219d2ff8e..57dd54672d 100644 --- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/profiling/NoOpOperatorStats.java +++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/profiling/NoOpOperatorStats.java @@ -110,7 +110,7 @@ public class NoOpOperatorStats implements IOperatorStats { } @Override - public ICounter getAverageTupleSz() { + public ICounter getTupleBytes() { return NOOP_COUNTER; } @@ -124,6 +124,11 @@ public class NoOpOperatorStats implements IOperatorStats { return NOOP_COUNTER; } + @Override + public ICounter getTotalFrameCount() { + return NOOP_COUNTER; + } + @Override public ICounter getInputTupleCounter() { return NOOP_COUNTER; diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/profiling/OperatorStats.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/profiling/OperatorStats.java index 9dbac3d8f4..93ee0cd1ac 100644 --- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/profiling/OperatorStats.java +++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/profiling/OperatorStats.java @@ -28,7 +28,7 @@ import org.apache.hyracks.api.com.job.profiling.counters.Counter; import org.apache.hyracks.api.job.profiling.counters.ICounter; public class OperatorStats implements IOperatorStats { - private static final long serialVersionUID = 6401830963361567126L; + private static final long serialVersionUID = 6401830963361567128L; public final String operatorName; public final String operatorId; @@ -39,10 +39,11 @@ public class OperatorStats implements IOperatorStats { public final ICounter cloudReadRequestCounter; public final ICounter cloudReadPageCounter; public final ICounter cloudPersistPageCounter; - public final ICounter avgTupleSz; + public final ICounter tupleBytes; public final ICounter minTupleSz; public final ICounter maxTupleSz; public final ICounter inputTupleCounter; + public final ICounter frameCounter; public final ICounter level; public final ICounter bytesRead; public final ICounter bytesWritten; @@ -63,10 +64,11 @@ public class OperatorStats implements IOperatorStats { cloudReadRequestCounter = new Counter("cloudReadRequestCounter"); cloudReadPageCounter = new Counter("cloudReadPageCounter"); cloudPersistPageCounter = new Counter("cloudPersistPageCounter"); - avgTupleSz = new Counter("avgTupleSz"); + tupleBytes = new Counter("tupleBytes"); minTupleSz = new Counter("minTupleSz"); maxTupleSz = new Counter("maxTupleSz"); inputTupleCounter = new Counter("inputTupleCounter"); + frameCounter = new Counter("frameCounter"); level = new Counter("level"); bytesRead = new Counter("bytesRead"); bytesWritten = new Counter("bytesWritten"); @@ -114,11 +116,6 @@ public class OperatorStats implements IOperatorStats { return cloudPersistPageCounter; } - @Override - public ICounter getAverageTupleSz() { - return avgTupleSz; - } - @Override public ICounter getMaxTupleSz() { return maxTupleSz; @@ -129,6 +126,11 @@ public class OperatorStats implements IOperatorStats { return minTupleSz; } + @Override + public ICounter getTupleBytes() { + return tupleBytes; + } + @Override public ICounter getInputTupleCounter() { return inputTupleCounter; @@ -149,6 +151,11 @@ public class OperatorStats implements IOperatorStats { return bytesWritten; } + @Override + public ICounter getTotalFrameCount() { + return frameCounter; + } + @Override public String getOperatorId() { return operatorId; @@ -195,10 +202,11 @@ public class OperatorStats implements IOperatorStats { output.writeLong(cloudReadRequestCounter.get()); output.writeLong(cloudReadPageCounter.get()); output.writeLong(cloudPersistPageCounter.get()); - output.writeLong(avgTupleSz.get()); + output.writeLong(tupleBytes.get()); output.writeLong(minTupleSz.get()); output.writeLong(maxTupleSz.get()); output.writeLong(inputTupleCounter.get()); + output.writeLong(frameCounter.get()); output.writeLong(level.get()); output.writeLong(bytesRead.get()); output.writeLong(bytesWritten.get()); @@ -214,10 +222,11 @@ public class OperatorStats implements IOperatorStats { cloudReadRequestCounter.set(input.readLong()); cloudReadPageCounter.set(input.readLong()); cloudPersistPageCounter.set(input.readLong()); - avgTupleSz.set(input.readLong()); + tupleBytes.set(input.readLong()); minTupleSz.set(input.readLong()); maxTupleSz.set(input.readLong()); inputTupleCounter.set(input.readLong()); + frameCounter.set(input.readLong()); level.set(input.readLong()); bytesRead.set(input.readLong()); bytesWritten.set(input.readLong()); @@ -249,10 +258,11 @@ public class OperatorStats implements IOperatorStats { + cloudReadRequestCounter.getName() + "\": " + cloudReadRequestCounter.get() + ", \"" + cloudReadPageCounter.getName() + "\": " + cloudReadPageCounter.get() + ", \"" + cloudPersistPageCounter.getName() + "\": " + cloudPersistPageCounter.get() + ", \"" - + avgTupleSz.getName() + "\": " + avgTupleSz.get() + ", \"" + minTupleSz.getName() + "\": " - + minTupleSz.get() + ", \"" + minTupleSz.getName() + "\": " + timeCounter.get() + ", \"" - + inputTupleCounter.getName() + "\": " + bytesRead.get() + ", \"" + bytesRead.getName() + "\": " - + bytesWritten.get() + ", \"" + bytesWritten.getName() + "\": " + inputTupleCounter.get() + ", \"" - + level.getName() + "\": " + level.get() + ", \"indexStats\": \"" + indexesStats + "\" }"; + + tupleBytes.getName() + "\": " + tupleBytes.get() + ", \"" + minTupleSz.getName() + "\": " + + minTupleSz.get() + ", \"" + maxTupleSz.getName() + "\": " + maxTupleSz.get() + ", \"" + + inputTupleCounter.getName() + "\": " + inputTupleCounter.get() + ", \"" + frameCounter.getName() + + "\": " + frameCounter.get() + ", \"" + bytesRead.getName() + "\": " + bytesRead.get() + ", \"" + + bytesWritten.getName() + "\": " + bytesWritten.get() + ", \"" + level.getName() + "\": " + level.get() + + ", \"indexStats\": \"" + indexesStats + "\" }"; } } diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/job/profiling/om/TaskProfile.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/job/profiling/om/TaskProfile.java index b66be1e8d4..e361e420f0 100644 --- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/job/profiling/om/TaskProfile.java +++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/job/profiling/om/TaskProfile.java @@ -142,9 +142,13 @@ public class TaskProfile extends AbstractProfile { } if (value.getTupleCounter().get() > 0) { jpe.put("cardinality-out", value.getTupleCounter().get()); - jpe.put("avg-tuple-size", value.getAverageTupleSz().get()); + jpe.put("avg-tuple-size", (double) value.getTupleBytes().get() / value.getTupleCounter().get()); jpe.put("min-tuple-size", value.getMinTupleSz().get()); jpe.put("max-tuple-size", value.getMaxTupleSz().get()); + jpe.put("tuple-bytes", value.getTupleBytes().get()); + jpe.put("frames-processed", value.getTotalFrameCount().get()); + jpe.put("avg-tuples-per-frame", + (double) value.getTupleCounter().get() / value.getTotalFrameCount().get()); } if (value.getLevel().get() > -1) { jpe.put("level", value.getLevel().get());