metrics: Add counter support

Add support for a counter, where a metric key can be incremented or
decremented, optionally by a given value (default 1).

BUG=b:229737154
TEST=run_tests

Change-Id: I65408bd187d5de2ee7ede3e6172694d499deb452
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/3593895
Tested-by: Alex Klein <saklein@chromium.org>
Reviewed-by: Lizzy Presland <zland@google.com>
Commit-Queue: Alex Klein <saklein@chromium.org>
diff --git a/api/metrics_unittest.py b/api/metrics_unittest.py
index 35f2758..7d9b72e 100644
--- a/api/metrics_unittest.py
+++ b/api/metrics_unittest.py
@@ -64,3 +64,25 @@
       self.assertEqual(response.events[0].name, 'a.gauge')
       self.assertEqual(response.events[0].timestamp_milliseconds, 1000)
       self.assertEqual(response.events[0].gauge, 17)
+
+  def testDeserializeCounter(self):
+    """Test deserialization of a counter."""
+    response = build_api_test_pb2.TestResultMessage()
+    mock_events = [
+        metrics.MetricEvent(
+            1000, 'a.counter', metrics.OP_INCREMENT_COUNTER, arg=1),
+        metrics.MetricEvent(
+            1001, 'a.counter', metrics.OP_INCREMENT_COUNTER, arg=2),
+        metrics.MetricEvent(
+            1002, 'a.counter', metrics.OP_INCREMENT_COUNTER, arg=3),
+        metrics.MetricEvent(
+            1003, 'a.counter', metrics.OP_DECREMENT_COUNTER, arg=4),
+    ]
+    with mock.patch(
+        'chromite.api.metrics.metrics.read_metrics_events',
+        return_value=mock_events):
+      api_metrics.deserialize_metrics_log(response.events)
+      self.assertEqual(len(response.events), 1)
+      self.assertEqual(response.events[0].name, 'a.counter')
+      self.assertEqual(response.events[0].timestamp_milliseconds, 1003)
+      self.assertEqual(response.events[0].gauge, 2)