[Tracing] Support CounterEvent in tracing.go

PT-168 #Support CounterEvent in tracing.go

TEST=
fx set <product>.<board>  --release --with-base
//garnet/packages/tests:cobalt_client,//garnet/packages/tests:go_benchmarking_tests
fx build && fx update
fx run-test go_benchmarking_tests

Change-Id: I26e6f6582061c1f919b8c869e40b497ccd3758c6
diff --git a/garnet/go/src/benchmarking/tracing.go b/garnet/go/src/benchmarking/tracing.go
index fa819a2..8a3704d4 100644
--- a/garnet/go/src/benchmarking/tracing.go
+++ b/garnet/go/src/benchmarking/tracing.go
@@ -102,6 +102,7 @@
 	AsyncEvent    EventType = 1
 	InstantEvent  EventType = 2
 	FlowEvent     EventType = 3
+	CounterEvent  EventType = 4
 )
 
 // A struct that represents an Event in the model.
@@ -413,6 +414,12 @@
 				top.Children = append(top.Children, thread.Events[len(thread.Events)-1])
 			}
 			delete(liveFlowEvents, flowId)
+		case "C":
+			// Counter event.
+			counterEvent := Event{CounterEvent, traceEvent.Cat, traceEvent.Name, traceEvent.Pid,
+				traceEvent.Tid, traceEvent.Ts, 0, traceEvent.ID(), traceEvent.Args, nil, make([]*Event, 0)}
+			thread := m.getOrCreateThreadById(traceEvent.Pid, traceEvent.Tid)
+			thread.Events = append(thread.Events, &counterEvent)
 		}
 	}
 }
diff --git a/garnet/go/src/benchmarking/tracing_test.go b/garnet/go/src/benchmarking/tracing_test.go
index 594bf17..6b04eba 100644
--- a/garnet/go/src/benchmarking/tracing_test.go
+++ b/garnet/go/src/benchmarking/tracing_test.go
@@ -88,8 +88,7 @@
 			  "pid": 7009,
 			  "tid": 7022,
 			  "ph": "e"
-			},
-			{
+			}, {
 			  "name": "log",
 			  "ph": "i",
 			  "ts": 7055567057.312,
@@ -99,8 +98,16 @@
 			  "args": {
 				"message": "[INFO:trace_manager.cc(66)] Stopping trace"
 			  }
+			}, {
+			  "cat": "system_metrics",
+			  "name": "cpu_usage",
+			  "ts": 35241122.375,
+			  "pid": 9234,
+			  "tid": 5678,
+				"ph": "C",
+				"args": {"average_cpu_percentage": 0.89349317793, "max_cpu_usage": 0.1234}
 			}
-		  ],
+			],
 		  "systemTraceEvents": {
 			"type": "fuchsia",
 			"events": [{
@@ -181,8 +188,7 @@
 			  "pid": 7009,
 			  "tid": 7022,
 			  "ph": "e"
-			},
-			{
+			}, {
 			  "name": "log",
 			  "ph": "i",
 			  "ts": 7055567057.312,
@@ -192,8 +198,16 @@
 			  "args": {
 				"message": "[INFO:trace_manager.cc(66)] Stopping trace"
 			  }
+			}, {
+			  "cat": "system_metrics",
+			  "name": "cpu_usage",
+			  "ts": 35241122.375,
+			  "pid": 9234,
+			  "tid": 5678,
+				"ph": "C",
+				"args": {"average_cpu_percentage": 0.89349317793, "max_cpu_usage": 0.1234}
 			}
-		  ],
+			],
 		  "systemTraceEvents": {
 			"type": "fuchsia",
 			"events": [{
@@ -214,6 +228,11 @@
 func TestReadTrace(t *testing.T) {
 	expectedModel := Model{
 		Processes: []Process{
+			Process{Name: "", Pid: 9234, Threads: []Thread{
+				Thread{Name: "", Tid: 5678, Events: []*Event{
+					&Event{Type: 4, Cat: "system_metrics", Name: "cpu_usage", Pid: 9234, Tid: 5678, Start: 3.5241122375e+07, Dur: 0, Id: 0, Args: map[string]interface{}{"average_cpu_percentage":0.89349317793, "max_cpu_usage":0.1234}, Parent: nil, Children: make([]*Event, 0)},
+				}},
+			}},
 			Process{Name: "root_presenter", Pid: 7009, Threads: []Thread{
 				Thread{Name: "initial-thread", Tid: 7022, Events: []*Event{
 					&Event{Type: 1, Cat: "async", Name: "ReadWrite", Pid: 7009, Tid: 7022, Start: 6.87503138e+08, Dur: 0, Id: 43, Args: map[string]interface{}(nil), Parent: nil, Children: make([]*Event, 0)},
@@ -222,16 +241,22 @@
 				}},
 				Thread{Name: "", Tid: 7021, Events: []*Event{
 					&Event{Type: 0, Cat: "input", Name: "Read", Pid: 7009, Tid: 7021, Start: 6.975031389531089e+08, Dur: 322.78645980358124, Id: 0, Args: map[string]interface{}(nil), Parent: nil, Children: make([]*Event, 0)},
-					&Event{Type: 3, Cat: "input", Name: "ReadWriteFlow", Pid: 7009, Tid: 7021, Start: 6.975031399531089e+08, Dur: 0.0, Id: 0, Args: map[string]interface{}(nil), Parent: nil, Children: make([]*Event, 0)}}},
+					&Event{Type: 3, Cat: "input", Name: "ReadWriteFlow", Pid: 7009, Tid: 7021, Start: 6.975031399531089e+08, Dur: 0.0, Id: 0, Args: map[string]interface{}(nil), Parent: nil, Children: make([]*Event, 0)},
+				}},
 			}},
 			Process{Name: "", Pid: 7010, Threads: []Thread{
 				Thread{Name: "", Tid: 7023, Events: []*Event{
-					&Event{Type: 0, Cat: "io", Name: "Read", Pid: 7010, Tid: 7023, Start: 6.978681853588456e+08, Dur: 386.2429618835449, Id: 0, Args: map[string]interface{}(nil), Parent: nil, Children: make([]*Event, 0)}}}}},
+					&Event{Type: 0, Cat: "io", Name: "Read", Pid: 7010, Tid: 7023, Start: 6.978681853588456e+08, Dur: 386.2429618835449, Id: 0, Args: map[string]interface{}(nil), Parent: nil, Children: make([]*Event, 0)},
+				}},
+			}},
 			Process{Name: "", Pid: 5945, Threads: []Thread{
 				Thread{Name: "", Tid: 5962, Events: []*Event{
-					&Event{Type: 2, Cat: "", Name: "log", Pid: 5945, Tid: 5962, Start: 7.055567057312e+09, Dur: 0, Id: 0, Args: map[string]interface{}{"message": "[INFO:trace_manager.cc(66)] Stopping trace"}, Parent: nil, Children: make([]*Event, 0)}}}}}}}
+					&Event{Type: 2, Cat: "", Name: "log", Pid: 5945, Tid: 5962, Start: 7.055567057312e+09, Dur: 0, Id: 0, Args: map[string]interface{}{"message": "[INFO:trace_manager.cc(66)] Stopping trace"}, Parent: nil, Children: make([]*Event, 0)},
+				}},
+			}},
+		}}
 
-	p7009 := expectedModel.Processes[0]
+	p7009 := expectedModel.Processes[1]
 	t7022 := p7009.Threads[0]
 	t7021 := p7009.Threads[1]
 
@@ -252,7 +277,6 @@
 	if err != nil {
 		t.Fatalf("Processing the trace produced an error: %#v\n", err)
 	}
-
 	if !reflect.DeepEqual(expectedModel, model) {
 		t.Error("Generated model and expected model are different\n")
 	}
@@ -309,6 +333,13 @@
 		&Event{Type: 0, Cat: "io", Name: "Read", Pid: 7010, Tid: 7023, Start: 6.978681853588456e+08, Dur: 386.2429618835449, Id: 0, Args: map[string]interface{}(nil), Parent: nil, Children: make([]*Event, 0)}}
 	events = model.FindEvents(EventsFilter{Name: &name, Cat: &cat})
 	compareEvents(t, "Find events by Name and Category", expectedEvents, events)
+
+	cat = "system_metrics"
+	name = "cpu_usage"
+	expectedEvents = []*Event{
+		&Event{Type: 4, Cat: "system_metrics", Name: "cpu_usage", Pid: 9234, Tid: 5678, Start: 3.5241122375e+07, Dur: 0, Id: 0, Args: map[string]interface{}{"average_cpu_percentage":0.89349317793, "max_cpu_usage":0.1234}, Parent: nil, Children: make([]*Event, 0)}}
+	events = model.FindEvents(EventsFilter{Name: &name, Cat: &cat})
+	compareEvents(t, "Find events by Name and Category", expectedEvents, events)
 }
 
 func compareAvgDurations(t *testing.T, listSize int, expected float64, actual float64) {