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());

Reply via email to