pkg_size: create a simple CLI tool to dump a system size report

pkg_size dumps the sizes of the packages contained within a built root.
It will also push gauge data (package size) per package and per
invocation (total root size) to the build api metrics append-only queue
via append_metrics_log. This data is to be used for build metrics trend
reporting.

BUG=chromium:1000449
TEST=cros_sdk -- '$HOME/trunk/chromite/run_tests'

Cq-Depend: chromium:1834120
Change-Id: I735057f9bcfe4de367a8df888e76a09836e371d1
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/1801037
Tested-by: Will Bradley <wbbradley@chromium.org>
Commit-Queue: Will Bradley <wbbradley@chromium.org>
Reviewed-by: Mike Frysinger <vapier@chromium.org>
Reviewed-by: Alex Klein <saklein@chromium.org>
diff --git a/api/metrics.py b/api/metrics.py
index cdf438e..1dba763 100644
--- a/api/metrics.py
+++ b/api/metrics.py
@@ -38,14 +38,14 @@
   # Reduce over the input events to append output_events.
   for input_event in metrics.read_metrics_events():
     if input_event.op == metrics.OP_START_TIMER:
-      timers[input_event.key] = (input_event.name,
+      timers[input_event.arg] = (input_event.name,
                                  input_event.timestamp_epoch_millis)
     elif input_event.op == metrics.OP_STOP_TIMER:
       # TODO(wbbradley): Drop the None fallback https://crbug.com/1001909.
-      timer = timers.pop(input_event.key, None)
+      timer = timers.pop(input_event.arg, None)
       if timer is None:
         logging.error('%s: stop timer recorded, but missing start timer!?',
-                      input_event.key)
+                      input_event.arg)
       if timer:
         assert input_event.name == timer[0]
         output_event = output_events.add()
@@ -57,6 +57,11 @@
       output_event = output_events.add()
       output_event.name = make_name(input_event.name)
       output_event.timestamp_milliseconds = input_event.timestamp_epoch_millis
+    elif input_event.op == metrics.OP_GAUGE:
+      output_event = output_events.add()
+      output_event.name = make_name(input_event.name)
+      output_event.timestamp_milliseconds = input_event.timestamp_epoch_millis
+      output_event.gauge = input_event.arg
     else:
       raise ValueError('unexpected op "%s" found in metric event: %s' % (
           input_event.op, input_event))