metrics: create framework for metric event gathering

Here I introduce some scaffolding for recording metrics events. This
data is aggregated and plumbed back through the Build API interface's
response protobufs. Currently only InstallPackagesResponse is hooked up.

The plan is to begin exploring this data via Analysis service, then
pivot as necessary towards finding ways to analyze, monitor and alert on
it.

BUG=chromium:989179
TEST=manual testing with api/contrib/call_scripts/sysroot__install_packages

Change-Id: I69fcd43112ffb5c6ab34eb584ec28ccd655914ce
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/1727269
Tested-by: Will Bradley <wbbradley@chromium.org>
Reviewed-by: Alex Klein <saklein@chromium.org>
Commit-Queue: Will Bradley <wbbradley@chromium.org>
diff --git a/api/controller/sysroot.py b/api/controller/sysroot.py
index dd37b3f..87afbac 100644
--- a/api/controller/sysroot.py
+++ b/api/controller/sysroot.py
@@ -10,12 +10,14 @@
 from chromite.api import controller
 from chromite.api import validate
 from chromite.api.controller import controller_util
+from chromite.api.metrics import deserialize_metrics_log
 from chromite.lib import build_target_util
 from chromite.lib import cros_build_lib
 from chromite.lib import cros_logging as logging
 from chromite.lib import portage_util
 from chromite.lib import sysroot_lib
 from chromite.service import sysroot
+from chromite.utils import metrics
 
 _ACCEPTED_LICENSES = '@CHROMEOS'
 
@@ -74,6 +76,7 @@
 
 @validate.require('sysroot.path', 'sysroot.build_target.name')
 @validate.validation_complete
+@metrics.collect_metrics
 def InstallPackages(input_proto, output_proto, _config):
   """Install packages into a sysroot, building as necessary and permitted."""
   compile_source = input_proto.flags.compile_source
@@ -111,6 +114,9 @@
 
     return controller.RETURN_CODE_UNSUCCESSFUL_RESPONSE_AVAILABLE
 
+  # Read metric events log and pipe them into output_proto.events.
+  deserialize_metrics_log(output_proto.events, prefix=build_target_name)
+
 
 def _LogBinhost(board):
   """Log the portage binhost for the given board."""