trace_processor: add memory events

This CL adds the parsing and storing of the following events into
the counters table:
rss_stat
ion_heap_grow
ion_heap_shrink

It also
- fixes the inconsistent naming in the refType enum
- renames sched tracker to better reflect it's purpose
- remove pre-computed deltas because they can be ambiguous

Bug:117642698
Change-Id: Ie843298b2b54bc8f3997e1afe297e12e1e98215d
diff --git a/src/trace_processor/BUILD.gn b/src/trace_processor/BUILD.gn
index 2b468af..852a706 100644
--- a/src/trace_processor/BUILD.gn
+++ b/src/trace_processor/BUILD.gn
@@ -46,6 +46,8 @@
     "chunked_trace_reader.h",
     "counters_table.cc",
     "counters_table.h",
+    "event_tracker.cc",
+    "event_tracker.h",
     "process_table.cc",
     "process_table.h",
     "process_tracker.cc",
@@ -58,8 +60,6 @@
     "query_constraints.h",
     "sched_slice_table.cc",
     "sched_slice_table.h",
-    "sched_tracker.cc",
-    "sched_tracker.h",
     "scoped_db.h",
     "slice_table.cc",
     "slice_table.h",
@@ -140,12 +140,12 @@
   testonly = true
   sources = [
     "counters_table_unittest.cc",
+    "event_tracker_unittest.cc",
     "process_table_unittest.cc",
     "process_tracker_unittest.cc",
     "proto_trace_parser_unittest.cc",
     "query_constraints_unittest.cc",
     "sched_slice_table_unittest.cc",
-    "sched_tracker_unittest.cc",
     "slice_tracker_unittest.cc",
     "span_operator_table_unittest.cc",
     "thread_table_unittest.cc",
diff --git a/src/trace_processor/counters_table.cc b/src/trace_processor/counters_table.cc
index 000891f..b38df90 100644
--- a/src/trace_processor/counters_table.cc
+++ b/src/trace_processor/counters_table.cc
@@ -44,8 +44,6 @@
       return CompareValues(co.refs(), f_idx, s_idx, ob.desc);
     case CountersTable::Column::kDuration:
       return CompareValues(co.durations(), f_idx, s_idx, ob.desc);
-    case CountersTable::Column::kValueDelta:
-      return CompareValues(co.value_deltas(), f_idx, s_idx, ob.desc);
     case CountersTable::Column::kRefType:
       return CompareValues(co.types(), f_idx, s_idx, ob.desc);
     default:
@@ -82,7 +80,6 @@
           Table::Column(Column::kName, "name", ColumnType::kString),
           Table::Column(Column::kValue, "value", ColumnType::kUlong),
           Table::Column(Column::kDuration, "dur", ColumnType::kUlong),
-          Table::Column(Column::kValueDelta, "value_delta", ColumnType::kUlong),
           Table::Column(Column::kRef, "ref", ColumnType::kUint),
           Table::Column(Column::kRefType, "ref_type", ColumnType::kString),
       },
@@ -130,9 +127,6 @@
       case CountersTable::Column::kDuration:
         FilterColumn(counters.durations(), 0, cs, v, &filter);
         break;
-      case CountersTable::Column::kValueDelta:
-        FilterColumn(counters.value_deltas(), 0, cs, v, &filter);
-        break;
       case CountersTable::Column::kRefType: {
         // TODO(lalitm): add support for filtering here.
       }
@@ -173,11 +167,11 @@
     }
     case Column::kRefType: {
       switch (storage_->counters().types()[row]) {
-        case RefType::kCPU_ID: {
+        case RefType::kCpuId: {
           sqlite3_result_text(context, "cpu", -1, nullptr);
           break;
         }
-        case RefType::kUTID: {
+        case RefType::kUtid: {
           sqlite3_result_text(context, "utid", -1, nullptr);
           break;
         }
@@ -201,12 +195,6 @@
           context, static_cast<int64_t>(storage_->counters().durations()[row]));
       break;
     }
-    case Column::kValueDelta: {
-      sqlite3_result_int64(
-          context,
-          static_cast<int64_t>(storage_->counters().value_deltas()[row]));
-      break;
-    }
     default:
       PERFETTO_FATAL("Unknown column %d", N);
       break;
diff --git a/src/trace_processor/counters_table.h b/src/trace_processor/counters_table.h
index c35b887..425056b 100644
--- a/src/trace_processor/counters_table.h
+++ b/src/trace_processor/counters_table.h
@@ -33,9 +33,8 @@
     kName = 1,
     kValue = 2,
     kDuration = 3,
-    kValueDelta = 4,
-    kRef = 5,
-    kRefType = 6,
+    kRef = 4,
+    kRefType = 5,
   };
 
   static void RegisterTable(sqlite3* db, const TraceStorage* storage);
diff --git a/src/trace_processor/counters_table_unittest.cc b/src/trace_processor/counters_table_unittest.cc
index dc2ff0a..77af0d2 100644
--- a/src/trace_processor/counters_table_unittest.cc
+++ b/src/trace_processor/counters_table_unittest.cc
@@ -15,7 +15,7 @@
  */
 
 #include "src/trace_processor/counters_table.h"
-#include "src/trace_processor/sched_tracker.h"
+#include "src/trace_processor/event_tracker.h"
 #include "src/trace_processor/scoped_db.h"
 #include "src/trace_processor/trace_processor_context.h"
 
@@ -34,7 +34,7 @@
     db_.reset(db);
 
     context_.storage.reset(new TraceStorage());
-    context_.sched_tracker.reset(new SchedTracker(&context_));
+    context_.event_tracker.reset(new EventTracker(&context_));
 
     CountersTable::RegisterTable(db_.get(), context_.storage.get());
   }
@@ -64,14 +64,11 @@
   uint32_t freq = 3000;
 
   context_.storage->mutable_counters()->AddCounter(
-      timestamp, 0 /* dur */, 1, freq, 0 /* value delta */, 1 /* cpu */,
-      RefType::kCPU_ID);
+      timestamp, 0 /* dur */, 1, freq, 1 /* cpu */, RefType::kCpuId);
   context_.storage->mutable_counters()->AddCounter(
-      timestamp + 1, 1 /* dur */, 1, freq + 1000, 1000 /* value delta */,
-      1 /* cpu */, RefType::kCPU_ID);
+      timestamp + 1, 1 /* dur */, 1, freq + 1000, 1 /* cpu */, RefType::kCpuId);
   context_.storage->mutable_counters()->AddCounter(
-      timestamp + 2, 1 /* dur */, 1, freq + 2000, 1000 /* value delta */,
-      2 /* cpu */, RefType::kCPU_ID);
+      timestamp + 2, 1 /* dur */, 1, freq + 2000, 2 /* cpu */, RefType::kCpuId);
 
   PrepareValidStatement("SELECT ts, dur, value FROM counters where ref = 1");
 
@@ -94,14 +91,12 @@
   uint32_t name_id = 1;
 
   context_.storage->mutable_counters()->AddCounter(
-      timestamp, 1 /* dur */, name_id, freq, 0 /* value delta */, 1 /* cpu */,
-      RefType::kCPU_ID);
+      timestamp, 1 /* dur */, name_id, freq, 1 /* cpu */, RefType::kCpuId);
   context_.storage->mutable_counters()->AddCounter(
-      timestamp + 1, 2 /* dur */, name_id, freq + 1000, 1000 /* value delta */,
-      1 /* cpu */, RefType::kCPU_ID);
+      timestamp + 1, 2 /* dur */, name_id, freq + 1000, 1 /* cpu */,
+      RefType::kCpuId);
   context_.storage->mutable_counters()->AddCounter(
-      timestamp + 3, 0 /* dur */, name_id, freq, -1000 /* value delta */,
-      1 /* cpu */, RefType::kCPU_ID);
+      timestamp + 3, 0 /* dur */, name_id, freq, 1 /* cpu */, RefType::kCpuId);
 
   PrepareValidStatement(
       "SELECT value, sum(dur) as dur_sum FROM counters where value > 0 group "
diff --git a/src/trace_processor/sched_tracker.cc b/src/trace_processor/event_tracker.cc
similarity index 84%
rename from src/trace_processor/sched_tracker.cc
rename to src/trace_processor/event_tracker.cc
index 67071a0..fdf1d4e 100644
--- a/src/trace_processor/sched_tracker.cc
+++ b/src/trace_processor/event_tracker.cc
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "src/trace_processor/sched_tracker.h"
+#include "src/trace_processor/event_tracker.h"
 #include "perfetto/base/utils.h"
 #include "src/trace_processor/process_tracker.h"
 #include "src/trace_processor/trace_processor_context.h"
@@ -24,17 +24,17 @@
 namespace perfetto {
 namespace trace_processor {
 
-SchedTracker::SchedTracker(TraceProcessorContext* context)
+EventTracker::EventTracker(TraceProcessorContext* context)
     : idle_string_id_(context->storage->InternString("idle")),
       context_(context) {}
 
-SchedTracker::~SchedTracker() = default;
+EventTracker::~EventTracker() = default;
 
-StringId SchedTracker::GetThreadNameId(uint32_t tid, base::StringView comm) {
+StringId EventTracker::GetThreadNameId(uint32_t tid, base::StringView comm) {
   return tid == 0 ? idle_string_id_ : context_->storage->InternString(comm);
 }
 
-void SchedTracker::PushSchedSwitch(uint32_t cpu,
+void EventTracker::PushSchedSwitch(uint32_t cpu,
                                    uint64_t timestamp,
                                    uint32_t prev_pid,
                                    uint32_t,
@@ -72,7 +72,7 @@
   pending_slice->pid = next_pid;
 }
 
-void SchedTracker::PushCounter(uint64_t timestamp,
+void EventTracker::PushCounter(uint64_t timestamp,
                                double value,
                                StringId name_id,
                                uint64_t ref,
@@ -89,16 +89,15 @@
   auto counter_it = pending_counters_per_key_.find(key);
   if (counter_it != pending_counters_per_key_.end()) {
     size_t idx = counter_it->second;
-
     uint64_t duration = timestamp - counters->timestamps()[idx];
-    double value_delta = value - counters->values()[idx];
+    // Update duration of previously stored event.
     counters->set_duration(idx, duration);
-    counters->set_value_delta(idx, value_delta);
   }
 
-  pending_counters_per_key_[key] = counters->AddCounter(
-      timestamp, 0 /* duration */, name_id, value, 0 /* value_delta */,
-      static_cast<int64_t>(ref), ref_type);
+  // At this point we don't know the duration so just store 0.
+  pending_counters_per_key_[key] =
+      counters->AddCounter(timestamp, 0 /* duration */, name_id, value,
+                           static_cast<int64_t>(ref), ref_type);
 }
 
 }  // namespace trace_processor
diff --git a/src/trace_processor/sched_tracker.h b/src/trace_processor/event_tracker.h
similarity index 89%
rename from src/trace_processor/sched_tracker.h
rename to src/trace_processor/event_tracker.h
index 3679240..29ceee5 100644
--- a/src/trace_processor/sched_tracker.h
+++ b/src/trace_processor/event_tracker.h
@@ -14,8 +14,8 @@
  * limitations under the License.
  */
 
-#ifndef SRC_TRACE_PROCESSOR_SCHED_TRACKER_H_
-#define SRC_TRACE_PROCESSOR_SCHED_TRACKER_H_
+#ifndef SRC_TRACE_PROCESSOR_EVENT_TRACKER_H_
+#define SRC_TRACE_PROCESSOR_EVENT_TRACKER_H_
 
 #include <array>
 #include <limits>
@@ -31,12 +31,12 @@
 
 // This class takes sched events from the trace and processes them to store
 // as sched slices.
-class SchedTracker {
+class EventTracker {
  public:
-  explicit SchedTracker(TraceProcessorContext*);
-  SchedTracker(const SchedTracker&) = delete;
-  SchedTracker& operator=(const SchedTracker&) = delete;
-  virtual ~SchedTracker();
+  explicit EventTracker(TraceProcessorContext*);
+  EventTracker(const EventTracker&) = delete;
+  EventTracker& operator=(const EventTracker&) = delete;
+  virtual ~EventTracker();
 
   StringId GetThreadNameId(uint32_t tid, base::StringView comm);
 
@@ -100,4 +100,4 @@
 }  // namespace trace_processor
 }  // namespace perfetto
 
-#endif  // SRC_TRACE_PROCESSOR_SCHED_TRACKER_H_
+#endif  // SRC_TRACE_PROCESSOR_EVENT_TRACKER_H_
diff --git a/src/trace_processor/sched_tracker_unittest.cc b/src/trace_processor/event_tracker_unittest.cc
similarity index 61%
rename from src/trace_processor/sched_tracker_unittest.cc
rename to src/trace_processor/event_tracker_unittest.cc
index 863052e..ab308d1 100644
--- a/src/trace_processor/sched_tracker_unittest.cc
+++ b/src/trace_processor/event_tracker_unittest.cc
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "src/trace_processor/sched_tracker.h"
+#include "src/trace_processor/event_tracker.h"
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
 #include "src/trace_processor/process_tracker.h"
@@ -28,19 +28,19 @@
 using ::testing::InSequence;
 using ::testing::Invoke;
 
-class SchedTrackerTest : public ::testing::Test {
+class EventTrackerTest : public ::testing::Test {
  public:
-  SchedTrackerTest() {
+  EventTrackerTest() {
     context.storage.reset(new TraceStorage());
     context.process_tracker.reset(new ProcessTracker(&context));
-    context.sched_tracker.reset(new SchedTracker(&context));
+    context.event_tracker.reset(new EventTracker(&context));
   }
 
  protected:
   TraceProcessorContext context;
 };
 
-TEST_F(SchedTrackerTest, InsertSecondSched) {
+TEST_F(EventTrackerTest, InsertSecondSched) {
   uint32_t cpu = 3;
   uint64_t timestamp = 100;
   uint32_t pid_1 = 2;
@@ -50,11 +50,11 @@
   uint32_t pid_2 = 4;
 
   const auto& timestamps = context.storage->slices().start_ns();
-  context.sched_tracker->PushSchedSwitch(cpu, timestamp, pid_1, prev_state,
+  context.event_tracker->PushSchedSwitch(cpu, timestamp, pid_1, prev_state,
                                          pid_2, kCommProc1);
   ASSERT_EQ(timestamps.size(), 1);
 
-  context.sched_tracker->PushSchedSwitch(cpu, timestamp + 1, pid_2, prev_state,
+  context.event_tracker->PushSchedSwitch(cpu, timestamp + 1, pid_2, prev_state,
                                          pid_1, kCommProc2);
 
   ASSERT_EQ(timestamps.size(), 2ul);
@@ -66,7 +66,7 @@
   ASSERT_EQ(context.storage->slices().utids().front(), 1);
 }
 
-TEST_F(SchedTrackerTest, InsertThirdSched_SameThread) {
+TEST_F(EventTrackerTest, InsertThirdSched_SameThread) {
   uint32_t cpu = 3;
   uint64_t timestamp = 100;
   uint32_t prev_state = 32;
@@ -74,17 +74,17 @@
   static const char kCommProc2[] = "process2";
 
   const auto& timestamps = context.storage->slices().start_ns();
-  context.sched_tracker->PushSchedSwitch(cpu, timestamp, /*tid=*/4, prev_state,
+  context.event_tracker->PushSchedSwitch(cpu, timestamp, /*tid=*/4, prev_state,
                                          /*tid=*/2, kCommProc1);
   ASSERT_EQ(timestamps.size(), 1);
 
-  context.sched_tracker->PushSchedSwitch(cpu, timestamp + 1, /*tid=*/2,
+  context.event_tracker->PushSchedSwitch(cpu, timestamp + 1, /*tid=*/2,
                                          prev_state,
                                          /*tid=*/4, kCommProc1);
-  context.sched_tracker->PushSchedSwitch(cpu, timestamp + 11, /*tid=*/4,
+  context.event_tracker->PushSchedSwitch(cpu, timestamp + 11, /*tid=*/4,
                                          prev_state,
                                          /*tid=*/2, kCommProc2);
-  context.sched_tracker->PushSchedSwitch(cpu, timestamp + 31, /*tid=*/4,
+  context.event_tracker->PushSchedSwitch(cpu, timestamp + 31, /*tid=*/4,
                                          prev_state,
                                          /*tid=*/2, kCommProc1);
 
@@ -98,18 +98,18 @@
             context.storage->slices().utids().at(2));
 }
 
-TEST_F(SchedTrackerTest, CounterDuration) {
+TEST_F(EventTrackerTest, CounterDuration) {
   uint32_t cpu = 3;
   uint64_t timestamp = 100;
   StringId name_id = 0;
-  context.sched_tracker->PushCounter(timestamp, 1000, name_id, cpu,
-                                     RefType::kCPU_ID);
-  context.sched_tracker->PushCounter(timestamp + 1, 4000, name_id, cpu,
-                                     RefType::kCPU_ID);
-  context.sched_tracker->PushCounter(timestamp + 3, 5000, name_id, cpu,
-                                     RefType::kCPU_ID);
-  context.sched_tracker->PushCounter(timestamp + 9, 1000, name_id, cpu,
-                                     RefType::kCPU_ID);
+  context.event_tracker->PushCounter(timestamp, 1000, name_id, cpu,
+                                     RefType::kCpuId);
+  context.event_tracker->PushCounter(timestamp + 1, 4000, name_id, cpu,
+                                     RefType::kCpuId);
+  context.event_tracker->PushCounter(timestamp + 3, 5000, name_id, cpu,
+                                     RefType::kCpuId);
+  context.event_tracker->PushCounter(timestamp + 9, 1000, name_id, cpu,
+                                     RefType::kCpuId);
 
   ASSERT_EQ(context.storage->counters().counter_count(), 4ul);
   ASSERT_EQ(context.storage->counters().timestamps().at(0), timestamp);
@@ -125,33 +125,6 @@
   ASSERT_EQ(context.storage->counters().values().at(2), 5000);
 }
 
-TEST_F(SchedTrackerTest, MixedEventsValueDelta) {
-  uint32_t cpu = 3;
-  uint64_t timestamp = 100;
-  StringId name_id_cpu = 0;
-  StringId name_id_upid = 0;
-  UniquePid upid = 12;
-  context.sched_tracker->PushCounter(timestamp, 1000, name_id_cpu, cpu,
-                                     RefType::kCPU_ID);
-  context.sched_tracker->PushCounter(timestamp + 1, 0, name_id_upid, upid,
-                                     RefType::kUTID);
-  context.sched_tracker->PushCounter(timestamp + 3, 5000, name_id_cpu, cpu,
-                                     RefType::kCPU_ID);
-  context.sched_tracker->PushCounter(timestamp + 9, 1, name_id_upid, upid,
-                                     RefType::kUTID);
-
-  ASSERT_EQ(context.storage->counters().counter_count(), 4ul);
-  ASSERT_EQ(context.storage->counters().timestamps().at(0), timestamp);
-  ASSERT_EQ(context.storage->counters().durations().at(0), 3);
-  ASSERT_EQ(context.storage->counters().values().at(0), 1000);
-  ASSERT_EQ(context.storage->counters().value_deltas().at(0), 4000);
-
-  ASSERT_EQ(context.storage->counters().timestamps().at(1), timestamp + 1);
-  ASSERT_EQ(context.storage->counters().durations().at(1), 8);
-  ASSERT_EQ(context.storage->counters().values().at(1), 0);
-  ASSERT_EQ(context.storage->counters().value_deltas().at(1), 1);
-}
-
 }  // namespace
 }  // namespace trace_processor
 }  // namespace perfetto
diff --git a/src/trace_processor/process_table_unittest.cc b/src/trace_processor/process_table_unittest.cc
index 34fed84..7012f87 100644
--- a/src/trace_processor/process_table_unittest.cc
+++ b/src/trace_processor/process_table_unittest.cc
@@ -15,8 +15,8 @@
  */
 
 #include "src/trace_processor/process_table.h"
+#include "src/trace_processor/event_tracker.h"
 #include "src/trace_processor/process_tracker.h"
-#include "src/trace_processor/sched_tracker.h"
 #include "src/trace_processor/scoped_db.h"
 #include "src/trace_processor/trace_processor_context.h"
 
diff --git a/src/trace_processor/process_tracker_unittest.cc b/src/trace_processor/process_tracker_unittest.cc
index eac2bab..7c2ac3e 100644
--- a/src/trace_processor/process_tracker_unittest.cc
+++ b/src/trace_processor/process_tracker_unittest.cc
@@ -17,7 +17,7 @@
 #include "src/trace_processor/process_tracker.h"
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
-#include "src/trace_processor/sched_tracker.h"
+#include "src/trace_processor/event_tracker.h"
 #include "src/trace_processor/trace_processor.h"
 
 namespace perfetto {
@@ -33,7 +33,7 @@
   ProcessTrackerTest() {
     context.storage.reset(new TraceStorage());
     context.process_tracker.reset(new ProcessTracker(&context));
-    context.sched_tracker.reset(new SchedTracker(&context));
+    context.event_tracker.reset(new EventTracker(&context));
   }
 
  protected:
@@ -77,9 +77,9 @@
   static const char kCommProc1[] = "process1";
   static const char kCommProc2[] = "process2";
 
-  context.sched_tracker->PushSchedSwitch(cpu, timestamp, /*tid=*/1, prev_state,
+  context.event_tracker->PushSchedSwitch(cpu, timestamp, /*tid=*/1, prev_state,
                                          /*tid=*/4, kCommProc1);
-  context.sched_tracker->PushSchedSwitch(cpu, timestamp + 1, /*tid=*/4,
+  context.event_tracker->PushSchedSwitch(cpu, timestamp + 1, /*tid=*/4,
                                          prev_state, /*tid=*/1, kCommProc2);
 
   context.process_tracker->UpdateProcess(2, "test");
diff --git a/src/trace_processor/proto_trace_parser.cc b/src/trace_processor/proto_trace_parser.cc
index 1cb2086..3ce91f1 100644
--- a/src/trace_processor/proto_trace_parser.cc
+++ b/src/trace_processor/proto_trace_parser.cc
@@ -25,8 +25,8 @@
 #include "perfetto/base/utils.h"
 #include "perfetto/protozero/proto_decoder.h"
 #include "perfetto/traced/sys_stats_counters.h"
+#include "src/trace_processor/event_tracker.h"
 #include "src/trace_processor/process_tracker.h"
-#include "src/trace_processor/sched_tracker.h"
 #include "src/trace_processor/slice_tracker.h"
 #include "src/trace_processor/trace_processor_context.h"
 
@@ -122,13 +122,23 @@
           context->storage->InternString("cpu.times.io_wait_ns")),
       cpu_times_irq_ns_id_(context->storage->InternString("cpu.times.irq_ns")),
       cpu_times_softirq_ns_id_(
-          context->storage->InternString("cpu.times.softirq_ns")) {
+          context->storage->InternString("cpu.times.softirq_ns")),
+      ion_heap_grow_id_(context->storage->InternString("ion_heap_grow")),
+      ion_heap_shrink_id_(context->storage->InternString("ion_heap_shrink")) {
   for (const auto& name : BuildMeminfoCounterNames()) {
     meminfo_strs_id_.emplace_back(context->storage->InternString(name));
   }
   for (const auto& name : BuildVmstatCounterNames()) {
     vmstat_strs_id_.emplace_back(context->storage->InternString(name));
   }
+  rss_members_.emplace_back(
+      context->storage->InternString("rss_stat.mm_filepages"));
+  rss_members_.emplace_back(
+      context->storage->InternString("rss_stat.mm_anonpages"));
+  rss_members_.emplace_back(
+      context->storage->InternString("rss_stat.mm_swapents"));
+  rss_members_.emplace_back(
+      context->storage->InternString("rss_stat.nr_mm_counters"));
 }
 
 ProtoTraceParser::~ProtoTraceParser() = default;
@@ -187,17 +197,17 @@
         break;
       }
       case protos::SysStats::kNumForksFieldNumber: {
-        context_->sched_tracker->PushCounter(
+        context_->event_tracker->PushCounter(
             ts, fld.as_uint32(), num_forks_name_id_, 0, RefType::kNoRef);
         break;
       }
       case protos::SysStats::kNumIrqTotalFieldNumber: {
-        context_->sched_tracker->PushCounter(
+        context_->event_tracker->PushCounter(
             ts, fld.as_uint32(), num_irq_total_name_id_, 0, RefType::kNoRef);
         break;
       }
       case protos::SysStats::kNumSoftirqTotalFieldNumber: {
-        context_->sched_tracker->PushCounter(ts, fld.as_uint32(),
+        context_->event_tracker->PushCounter(ts, fld.as_uint32(),
                                              num_softirq_total_name_id_, 0,
                                              RefType::kNoRef);
         break;
@@ -225,7 +235,7 @@
   }
   RefType ref_type = is_soft ? RefType::kIrq : RefType::kSoftIrq;
   StringId name_id = is_soft ? num_irq_name_id_ : num_softirq_name_id_;
-  context_->sched_tracker->PushCounter(ts, value, name_id, key, ref_type);
+  context_->event_tracker->PushCounter(ts, value, name_id, key, ref_type);
 }
 
 void ProtoTraceParser::ParseMemInfo(uint64_t ts, TraceBlobView mem) {
@@ -246,7 +256,7 @@
     PERFETTO_ELOG("MemInfo key %d is not recognized.", key);
     return;
   }
-  context_->sched_tracker->PushCounter(ts, value, meminfo_strs_id_[key], 0,
+  context_->event_tracker->PushCounter(ts, value, meminfo_strs_id_[key], 0,
                                        RefType::kNoRef);
 }
 
@@ -268,7 +278,7 @@
     PERFETTO_ELOG("VmStat key %d is not recognized.", key);
     return;
   }
-  context_->sched_tracker->PushCounter(ts, value, vmstat_strs_id_[key], 0,
+  context_->event_tracker->PushCounter(ts, value, vmstat_strs_id_[key], 0,
                                        RefType::kNoRef);
 }
 
@@ -295,44 +305,44 @@
     switch (fld.id) {
       case protos::SysStats::CpuTimes::kUserNsFieldNumber: {
         value = fld.as_uint32();
-        context_->sched_tracker->PushCounter(ts, value, cpu_times_user_ns_id_,
-                                             cpu, RefType::kCPU_ID);
+        context_->event_tracker->PushCounter(ts, value, cpu_times_user_ns_id_,
+                                             cpu, RefType::kCpuId);
         break;
       }
       case protos::SysStats::CpuTimes::kUserIceNsFieldNumber: {
         value = fld.as_uint32();
-        context_->sched_tracker->PushCounter(
-            ts, value, cpu_times_user_ice_ns_id_, cpu, RefType::kCPU_ID);
+        context_->event_tracker->PushCounter(
+            ts, value, cpu_times_user_ice_ns_id_, cpu, RefType::kCpuId);
         break;
       }
       case protos::SysStats::CpuTimes::kSystemModeNsFieldNumber: {
         value = fld.as_uint32();
-        context_->sched_tracker->PushCounter(
-            ts, value, cpu_times_system_mode_ns_id_, cpu, RefType::kCPU_ID);
+        context_->event_tracker->PushCounter(
+            ts, value, cpu_times_system_mode_ns_id_, cpu, RefType::kCpuId);
         break;
       }
       case protos::SysStats::CpuTimes::kIdleNsFieldNumber: {
         value = fld.as_uint32();
-        context_->sched_tracker->PushCounter(ts, value, cpu_times_idle_ns_id_,
-                                             cpu, RefType::kCPU_ID);
+        context_->event_tracker->PushCounter(ts, value, cpu_times_idle_ns_id_,
+                                             cpu, RefType::kCpuId);
         break;
       }
       case protos::SysStats::CpuTimes::kIoWaitNsFieldNumber: {
         value = fld.as_uint32();
-        context_->sched_tracker->PushCounter(
-            ts, value, cpu_times_io_wait_ns_id_, cpu, RefType::kCPU_ID);
+        context_->event_tracker->PushCounter(
+            ts, value, cpu_times_io_wait_ns_id_, cpu, RefType::kCpuId);
         break;
       }
       case protos::SysStats::CpuTimes::kIrqNsFieldNumber: {
         value = fld.as_uint32();
-        context_->sched_tracker->PushCounter(ts, value, cpu_times_irq_ns_id_,
-                                             cpu, RefType::kCPU_ID);
+        context_->event_tracker->PushCounter(ts, value, cpu_times_irq_ns_id_,
+                                             cpu, RefType::kCpuId);
         break;
       }
       case protos::SysStats::CpuTimes::kSoftirqNsFieldNumber: {
         value = fld.as_uint32();
-        context_->sched_tracker->PushCounter(
-            ts, value, cpu_times_softirq_ns_id_, cpu, RefType::kCPU_ID);
+        context_->event_tracker->PushCounter(
+            ts, value, cpu_times_softirq_ns_id_, cpu, RefType::kCpuId);
         break;
       }
       default:
@@ -410,8 +420,13 @@
                                          uint64_t timestamp,
                                          TraceBlobView ftrace) {
   ProtoDecoder decoder(ftrace.data(), ftrace.length());
+  uint32_t pid = 0;
   for (auto fld = decoder.ReadField(); fld.id != 0; fld = decoder.ReadField()) {
     switch (fld.id) {
+      case protos::FtraceEvent::kPidFieldNumber: {
+        pid = fld.as_uint32();
+        break;
+      }
       case protos::FtraceEvent::kSchedSwitchFieldNumber: {
         PERFETTO_DCHECK(timestamp > 0);
         const size_t fld_off = ftrace.offset_of(fld.data());
@@ -430,6 +445,25 @@
         ParsePrint(cpu, timestamp, ftrace.slice(fld_off, fld.size()));
         break;
       }
+      case protos::FtraceEvent::kRssStatFieldNumber: {
+        PERFETTO_DCHECK(timestamp > 0);
+        const size_t fld_off = ftrace.offset_of(fld.data());
+        ParseRssStat(timestamp, pid, ftrace.slice(fld_off, fld.size()));
+        break;
+      }
+      case protos::FtraceEvent::kIonHeapGrow: {
+        PERFETTO_DCHECK(timestamp > 0);
+        const size_t fld_off = ftrace.offset_of(fld.data());
+        ParseIonHeapGrow(timestamp, pid, ftrace.slice(fld_off, fld.size()));
+        break;
+      }
+      case protos::FtraceEvent::kIonHeapShrink: {
+        PERFETTO_DCHECK(timestamp > 0);
+        const size_t fld_off = ftrace.offset_of(fld.data());
+        ParseIonHeapShrink(timestamp, pid, ftrace.slice(fld_off, fld.size()));
+        break;
+      }
+
       default:
         break;
     }
@@ -437,6 +471,68 @@
   PERFETTO_DCHECK(decoder.IsEndOfBuffer());
 }
 
+void ProtoTraceParser::ParseRssStat(uint64_t timestamp,
+                                    uint32_t pid,
+                                    TraceBlobView view) {
+  ProtoDecoder decoder(view.data(), view.length());
+  uint32_t member = 0;
+  uint32_t size = 0;
+  for (auto fld = decoder.ReadField(); fld.id != 0; fld = decoder.ReadField()) {
+    switch (fld.id) {
+      case protos::RssStatFtraceEvent::kMemberFieldNumber:
+        member = fld.as_uint32();
+        break;
+      case protos::RssStatFtraceEvent::kSizeFieldNumber:
+        size = fld.as_uint32();
+        break;
+    }
+  }
+  UniqueTid utid = context_->process_tracker->UpdateThread(timestamp, pid, 0);
+  context_->event_tracker->PushCounter(timestamp, size, rss_members_[member],
+                                       utid, RefType::kUtid);
+  PERFETTO_DCHECK(decoder.IsEndOfBuffer());
+}
+
+void ProtoTraceParser::ParseIonHeapGrow(uint64_t timestamp,
+                                        uint32_t pid,
+                                        TraceBlobView view) {
+  ProtoDecoder decoder(view.data(), view.length());
+  uint32_t value = 0;
+  // TODO(b/118300811): The heap name pointer cannot be read. Read once it
+  // has been fixed.
+  for (auto fld = decoder.ReadField(); fld.id != 0; fld = decoder.ReadField()) {
+    switch (fld.id) {
+      case protos::IonHeapGrowFtraceEvent::kTotalAllocatedFieldNumber:
+        value = fld.as_uint32();
+        break;
+    }
+  }
+  UniqueTid utid = context_->process_tracker->UpdateThread(timestamp, pid, 0);
+  context_->event_tracker->PushCounter(timestamp, value, ion_heap_grow_id_,
+                                       utid, RefType::kUtid);
+  PERFETTO_DCHECK(decoder.IsEndOfBuffer());
+}
+
+void ProtoTraceParser::ParseIonHeapShrink(uint64_t timestamp,
+                                          uint32_t pid,
+                                          TraceBlobView view) {
+  ProtoDecoder decoder(view.data(), view.length());
+  uint32_t value = 0;
+  // TODO(b/118300811): The heap name pointer cannot be read. Read once it
+  // has been fixed.
+  for (auto fld = decoder.ReadField(); fld.id != 0; fld = decoder.ReadField()) {
+    switch (fld.id) {
+      case protos::IonHeapShrinkFtraceEvent::kTotalAllocatedFieldNumber:
+        value = fld.as_uint32();
+        break;
+    }
+  }
+  UniqueTid utid = context_->process_tracker->UpdateThread(timestamp, pid, 0);
+  context_->event_tracker->PushCounter(timestamp, value, ion_heap_shrink_id_,
+                                       utid, RefType::kUtid);
+  PERFETTO_DCHECK(decoder.IsEndOfBuffer());
+}
+
 void ProtoTraceParser::ParseCpuFreq(uint64_t timestamp, TraceBlobView view) {
   ProtoDecoder decoder(view.data(), view.length());
 
@@ -452,9 +548,8 @@
         break;
     }
   }
-  context_->sched_tracker->PushCounter(timestamp, new_freq, cpu_freq_name_id_,
-                                       cpu_affected, RefType::kCPU_ID);
-
+  context_->event_tracker->PushCounter(timestamp, new_freq, cpu_freq_name_id_,
+                                       cpu_affected, RefType::kCpuId);
   PERFETTO_DCHECK(decoder.IsEndOfBuffer());
 }
 
@@ -485,7 +580,7 @@
         break;
     }
   }
-  context_->sched_tracker->PushSchedSwitch(cpu, timestamp, prev_pid, prev_state,
+  context_->event_tracker->PushSchedSwitch(cpu, timestamp, prev_pid, prev_state,
                                            next_pid, next_comm);
   PERFETTO_DCHECK(decoder.IsEndOfBuffer());
 }
@@ -524,8 +619,8 @@
 
     case 'C': {
       StringId name_id = context_->storage->InternString(point.name);
-      context_->sched_tracker->PushCounter(timestamp, point.value, name_id,
-                                           utid, RefType::kUTID);
+      context_->event_tracker->PushCounter(timestamp, point.value, name_id,
+                                           utid, RefType::kUtid);
     }
   }
   PERFETTO_DCHECK(decoder.IsEndOfBuffer());
diff --git a/src/trace_processor/proto_trace_parser.h b/src/trace_processor/proto_trace_parser.h
index 73b3682..cc4ffa5 100644
--- a/src/trace_processor/proto_trace_parser.h
+++ b/src/trace_processor/proto_trace_parser.h
@@ -69,6 +69,9 @@
   void ParseVmStat(uint64_t ts, TraceBlobView);
   void ParseCpuTimes(uint64_t ts, TraceBlobView);
   void ParseIrqCount(uint64_t ts, TraceBlobView, bool is_soft);
+  void ParseRssStat(uint64_t ts, uint32_t pid, TraceBlobView);
+  void ParseIonHeapGrow(uint64_t ts, uint32_t pid, TraceBlobView);
+  void ParseIonHeapShrink(uint64_t ts, uint32_t pid, TraceBlobView);
 
  private:
   TraceProcessorContext* context_;
@@ -85,8 +88,11 @@
   const StringId cpu_times_io_wait_ns_id_;
   const StringId cpu_times_irq_ns_id_;
   const StringId cpu_times_softirq_ns_id_;
+  const StringId ion_heap_grow_id_;
+  const StringId ion_heap_shrink_id_;
   std::vector<StringId> meminfo_strs_id_;
   std::vector<StringId> vmstat_strs_id_;
+  std::vector<StringId> rss_members_;
 };
 
 }  // namespace trace_processor
diff --git a/src/trace_processor/proto_trace_parser_unittest.cc b/src/trace_processor/proto_trace_parser_unittest.cc
index 1e6c9b6..d24fa01 100644
--- a/src/trace_processor/proto_trace_parser_unittest.cc
+++ b/src/trace_processor/proto_trace_parser_unittest.cc
@@ -19,9 +19,9 @@
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
 #include "perfetto/base/string_view.h"
+#include "src/trace_processor/event_tracker.h"
 #include "src/trace_processor/process_tracker.h"
 #include "src/trace_processor/proto_trace_parser.h"
-#include "src/trace_processor/sched_tracker.h"
 #include "src/trace_processor/trace_sorter.h"
 
 #include "perfetto/trace/trace.pb.h"
@@ -38,10 +38,10 @@
 using ::testing::Pointwise;
 using ::testing::NiceMock;
 
-class MockSchedTracker : public SchedTracker {
+class MockEventTracker : public EventTracker {
  public:
-  MockSchedTracker(TraceProcessorContext* context) : SchedTracker(context) {}
-  virtual ~MockSchedTracker() = default;
+  MockEventTracker(TraceProcessorContext* context) : EventTracker(context) {}
+  virtual ~MockEventTracker() = default;
 
   MOCK_METHOD6(PushSchedSwitch,
                void(uint32_t cpu,
@@ -82,8 +82,8 @@
   ProtoTraceParserTest() {
     storage_ = new NiceMock<MockTraceStorage>();
     context_.storage.reset(storage_);
-    sched_ = new MockSchedTracker(&context_);
-    context_.sched_tracker.reset(sched_);
+    event_ = new MockEventTracker(&context_);
+    context_.event_tracker.reset(event_);
     process_ = new MockProcessTracker(&context_);
     context_.process_tracker.reset(process_);
     const auto optim = OptimizationMode::kMinLatency;
@@ -101,7 +101,7 @@
 
  protected:
   TraceProcessorContext context_;
-  MockSchedTracker* sched_;
+  MockEventTracker* event_;
   MockProcessTracker* process_;
   NiceMock<MockTraceStorage>* storage_;
 };
@@ -122,7 +122,7 @@
   sched_switch->set_next_comm(kProcName);
   sched_switch->set_next_pid(100);
 
-  EXPECT_CALL(*sched_, PushSchedSwitch(10, 1000, 10, 32, 100,
+  EXPECT_CALL(*event_, PushSchedSwitch(10, 1000, 10, 32, 100,
                                        base::StringView(kProcName)));
   Tokenize(trace);
 }
@@ -153,10 +153,10 @@
   sched_switch->set_next_comm(kProcName2);
   sched_switch->set_next_pid(10);
 
-  EXPECT_CALL(*sched_, PushSchedSwitch(10, 1000, 10, 32, 100,
+  EXPECT_CALL(*event_, PushSchedSwitch(10, 1000, 10, 32, 100,
                                        base::StringView(kProcName1)));
 
-  EXPECT_CALL(*sched_, PushSchedSwitch(10, 1001, 100, 32, 10,
+  EXPECT_CALL(*event_, PushSchedSwitch(10, 1001, 100, 32, 10,
                                        base::StringView(kProcName2)));
 
   Tokenize(trace);
@@ -191,10 +191,10 @@
   sched_switch->set_next_comm(kProcName2);
   sched_switch->set_next_pid(10);
 
-  EXPECT_CALL(*sched_, PushSchedSwitch(10, 1000, 10, 32, 100,
+  EXPECT_CALL(*event_, PushSchedSwitch(10, 1000, 10, 32, 100,
                                        base::StringView(kProcName1)));
 
-  EXPECT_CALL(*sched_, PushSchedSwitch(10, 1001, 100, 32, 10,
+  EXPECT_CALL(*event_, PushSchedSwitch(10, 1001, 100, 32, 10,
                                        base::StringView(kProcName2)));
   Tokenize(trace);
 }
@@ -224,11 +224,11 @@
   sched_switch->set_next_comm(kProcName2);
   sched_switch->set_next_pid(10);
 
-  EXPECT_CALL(*sched_, PushSchedSwitch(10, 1000, 10, 32, 100,
+  EXPECT_CALL(*event_, PushSchedSwitch(10, 1000, 10, 32, 100,
                                        base::StringView(kProcName1)));
   Tokenize(trace_1);
 
-  EXPECT_CALL(*sched_, PushSchedSwitch(10, 1001, 100, 32, 10,
+  EXPECT_CALL(*event_, PushSchedSwitch(10, 1001, 100, 32, 10,
                                        base::StringView(kProcName2)));
   Tokenize(trace_2);
 }
@@ -244,7 +244,7 @@
   uint32_t value = 10;
   meminfo->set_value(value);
 
-  EXPECT_CALL(*sched_, PushCounter(ts, value, 0, 0, RefType::kNoRef));
+  EXPECT_CALL(*event_, PushCounter(ts, value, 0, 0, RefType::kNoRef));
   Tokenize(trace_1);
 }
 
@@ -259,7 +259,7 @@
   uint32_t value = 10;
   meminfo->set_value(value);
 
-  EXPECT_CALL(*sched_, PushCounter(ts, value, 0, 0, RefType::kNoRef));
+  EXPECT_CALL(*event_, PushCounter(ts, value, 0, 0, RefType::kNoRef));
   Tokenize(trace_1);
 }
 
@@ -273,7 +273,7 @@
   cpu_freq->set_cpu_id(10);
   cpu_freq->set_state(2000);
 
-  EXPECT_CALL(*sched_, PushCounter(1000, 2000, 0, 10, RefType::kCPU_ID));
+  EXPECT_CALL(*event_, PushCounter(1000, 2000, 0, 10, RefType::kCpuId));
   Tokenize(trace_1);
 }
 
diff --git a/src/trace_processor/proto_trace_tokenizer.cc b/src/trace_processor/proto_trace_tokenizer.cc
index f3284c9..732a088 100644
--- a/src/trace_processor/proto_trace_tokenizer.cc
+++ b/src/trace_processor/proto_trace_tokenizer.cc
@@ -22,8 +22,8 @@
 #include "perfetto/base/utils.h"
 #include "perfetto/protozero/proto_decoder.h"
 #include "perfetto/protozero/proto_utils.h"
+#include "src/trace_processor/event_tracker.h"
 #include "src/trace_processor/process_tracker.h"
-#include "src/trace_processor/sched_tracker.h"
 #include "src/trace_processor/trace_blob_view.h"
 #include "src/trace_processor/trace_sorter.h"
 
diff --git a/src/trace_processor/sched_slice_table_unittest.cc b/src/trace_processor/sched_slice_table_unittest.cc
index 57b0a95..7a48eff 100644
--- a/src/trace_processor/sched_slice_table_unittest.cc
+++ b/src/trace_processor/sched_slice_table_unittest.cc
@@ -15,8 +15,8 @@
  */
 
 #include "src/trace_processor/sched_slice_table.h"
+#include "src/trace_processor/event_tracker.h"
 #include "src/trace_processor/process_tracker.h"
-#include "src/trace_processor/sched_tracker.h"
 #include "src/trace_processor/trace_processor_context.h"
 
 #include "gmock/gmock.h"
@@ -40,7 +40,7 @@
 
     context_.storage.reset(new TraceStorage());
     context_.process_tracker.reset(new ProcessTracker(&context_));
-    context_.sched_tracker.reset(new SchedTracker(&context_));
+    context_.event_tracker.reset(new EventTracker(&context_));
 
     SchedSliceTable::RegisterTable(db_.get(), context_.storage.get());
   }
@@ -69,13 +69,13 @@
   static const char kCommProc1[] = "process1";
   static const char kCommProc2[] = "process2";
   uint32_t pid_2 = 4;
-  context_.sched_tracker->PushSchedSwitch(cpu, timestamp, pid_1, prev_state,
+  context_.event_tracker->PushSchedSwitch(cpu, timestamp, pid_1, prev_state,
                                           pid_2, kCommProc1);
-  context_.sched_tracker->PushSchedSwitch(cpu, timestamp + 3, pid_2, prev_state,
+  context_.event_tracker->PushSchedSwitch(cpu, timestamp + 3, pid_2, prev_state,
                                           pid_1, kCommProc2);
-  context_.sched_tracker->PushSchedSwitch(cpu, timestamp + 4, pid_1, prev_state,
+  context_.event_tracker->PushSchedSwitch(cpu, timestamp + 4, pid_1, prev_state,
                                           pid_2, kCommProc1);
-  context_.sched_tracker->PushSchedSwitch(cpu, timestamp + 10, pid_2,
+  context_.event_tracker->PushSchedSwitch(cpu, timestamp + 10, pid_2,
                                           prev_state, pid_1, kCommProc2);
 
   PrepareValidStatement(
@@ -109,17 +109,17 @@
   static const char kCommProc1[] = "process1";
   static const char kCommProc2[] = "process2";
   uint32_t pid_2 = 4;
-  context_.sched_tracker->PushSchedSwitch(cpu_3, timestamp - 2, pid_1,
+  context_.event_tracker->PushSchedSwitch(cpu_3, timestamp - 2, pid_1,
                                           prev_state, pid_2, kCommProc1);
-  context_.sched_tracker->PushSchedSwitch(cpu_3, timestamp - 1, pid_2,
+  context_.event_tracker->PushSchedSwitch(cpu_3, timestamp - 1, pid_2,
                                           prev_state, pid_1, kCommProc2);
-  context_.sched_tracker->PushSchedSwitch(cpu_1, timestamp, pid_1, prev_state,
+  context_.event_tracker->PushSchedSwitch(cpu_1, timestamp, pid_1, prev_state,
                                           pid_2, kCommProc1);
-  context_.sched_tracker->PushSchedSwitch(cpu_2, timestamp + 3, pid_2,
+  context_.event_tracker->PushSchedSwitch(cpu_2, timestamp + 3, pid_2,
                                           prev_state, pid_1, kCommProc2);
-  context_.sched_tracker->PushSchedSwitch(cpu_1, timestamp + 4, pid_1,
+  context_.event_tracker->PushSchedSwitch(cpu_1, timestamp + 4, pid_1,
                                           prev_state, pid_2, kCommProc1);
-  context_.sched_tracker->PushSchedSwitch(cpu_2, timestamp + 10, pid_2,
+  context_.event_tracker->PushSchedSwitch(cpu_2, timestamp + 10, pid_2,
                                           prev_state, pid_1, kCommProc2);
 
   PrepareValidStatement(
@@ -152,13 +152,13 @@
   static const char kCommProc1[] = "process1";
   static const char kCommProc2[] = "process2";
   uint32_t pid_2 = 4;
-  context_.sched_tracker->PushSchedSwitch(cpu_1, timestamp, pid_1, prev_state,
+  context_.event_tracker->PushSchedSwitch(cpu_1, timestamp, pid_1, prev_state,
                                           pid_2, kCommProc1);
-  context_.sched_tracker->PushSchedSwitch(cpu_2, timestamp + 3, pid_2,
+  context_.event_tracker->PushSchedSwitch(cpu_2, timestamp + 3, pid_2,
                                           prev_state, pid_1, kCommProc2);
-  context_.sched_tracker->PushSchedSwitch(cpu_1, timestamp + 4, pid_1,
+  context_.event_tracker->PushSchedSwitch(cpu_1, timestamp + 4, pid_1,
                                           prev_state, pid_2, kCommProc1);
-  context_.sched_tracker->PushSchedSwitch(cpu_2, timestamp + 10, pid_2,
+  context_.event_tracker->PushSchedSwitch(cpu_2, timestamp + 10, pid_2,
                                           prev_state, pid_1, kCommProc2);
 
   PrepareValidStatement(
@@ -180,13 +180,13 @@
   static const char kCommProc1[] = "process1";
   static const char kCommProc2[] = "process2";
   uint32_t pid_2 = 4;
-  context_.sched_tracker->PushSchedSwitch(cpu, timestamp, pid_1, prev_state,
+  context_.event_tracker->PushSchedSwitch(cpu, timestamp, pid_1, prev_state,
                                           pid_2, kCommProc1);
-  context_.sched_tracker->PushSchedSwitch(cpu, timestamp + 3, pid_2, prev_state,
+  context_.event_tracker->PushSchedSwitch(cpu, timestamp + 3, pid_2, prev_state,
                                           pid_1, kCommProc2);
-  context_.sched_tracker->PushSchedSwitch(cpu, timestamp + 4, pid_1, prev_state,
+  context_.event_tracker->PushSchedSwitch(cpu, timestamp + 4, pid_1, prev_state,
                                           pid_2, kCommProc1);
-  context_.sched_tracker->PushSchedSwitch(cpu, timestamp + 10, pid_2,
+  context_.event_tracker->PushSchedSwitch(cpu, timestamp + 10, pid_2,
                                           prev_state, pid_1, kCommProc2);
 
   PrepareValidStatement("SELECT utid FROM sched where dur != 0 ORDER BY utid");
@@ -213,11 +213,11 @@
   // Fill |cpu_5| and |cpu_7) with one sched switch per time unit starting,
   // respectively, @ T=50 and T=70.
   for (uint64_t i = 0; i <= 11; i++) {
-    context_.sched_tracker->PushSchedSwitch(cpu_5, 50 + i, pid_1, prev_state,
+    context_.event_tracker->PushSchedSwitch(cpu_5, 50 + i, pid_1, prev_state,
                                             pid_1, "pid_1");
   }
   for (uint64_t i = 0; i <= 11; i++) {
-    context_.sched_tracker->PushSchedSwitch(cpu_7, 70 + i, pid_2, prev_state,
+    context_.event_tracker->PushSchedSwitch(cpu_7, 70 + i, pid_2, prev_state,
                                             pid_2, "pid_2");
   }
 
diff --git a/src/trace_processor/thread_table_unittest.cc b/src/trace_processor/thread_table_unittest.cc
index 10e1622..fbb4775 100644
--- a/src/trace_processor/thread_table_unittest.cc
+++ b/src/trace_processor/thread_table_unittest.cc
@@ -15,9 +15,9 @@
  */
 
 #include "src/trace_processor/thread_table.h"
+#include "src/trace_processor/event_tracker.h"
 #include "src/trace_processor/process_table.h"
 #include "src/trace_processor/process_tracker.h"
-#include "src/trace_processor/sched_tracker.h"
 #include "src/trace_processor/scoped_db.h"
 #include "src/trace_processor/trace_processor_context.h"
 
@@ -37,7 +37,7 @@
 
     context_.storage.reset(new TraceStorage());
     context_.process_tracker.reset(new ProcessTracker(&context_));
-    context_.sched_tracker.reset(new SchedTracker(&context_));
+    context_.event_tracker.reset(new EventTracker(&context_));
 
     ThreadTable::RegisterTable(db_.get(), context_.storage.get());
     ProcessTable::RegisterTable(db_.get(), context_.storage.get());
@@ -70,9 +70,9 @@
   static const char kThreadName1[] = "thread1";
   static const char kThreadName2[] = "thread2";
 
-  context_.sched_tracker->PushSchedSwitch(cpu, timestamp, /*tid=*/1, prev_state,
+  context_.event_tracker->PushSchedSwitch(cpu, timestamp, /*tid=*/1, prev_state,
                                           /*tid=*/4, kThreadName1);
-  context_.sched_tracker->PushSchedSwitch(cpu, timestamp + 1, /*tid=*/4,
+  context_.event_tracker->PushSchedSwitch(cpu, timestamp + 1, /*tid=*/4,
                                           prev_state, /*tid=*/1, kThreadName2);
 
   context_.process_tracker->UpdateProcess(2, "test");
@@ -95,12 +95,12 @@
   static const char kThreadName1[] = "thread1";
   static const char kThreadName2[] = "thread2";
 
-  context_.sched_tracker->PushSchedSwitch(cpu, timestamp, /*tid=*/1, prev_state,
+  context_.event_tracker->PushSchedSwitch(cpu, timestamp, /*tid=*/1, prev_state,
                                           /*tid=*/4, kThreadName1);
-  context_.sched_tracker->PushSchedSwitch(cpu, timestamp + 1, /*tid=*/4,
+  context_.event_tracker->PushSchedSwitch(cpu, timestamp + 1, /*tid=*/4,
                                           prev_state,
                                           /*tid=*/1, kThreadName2);
-  context_.sched_tracker->PushSchedSwitch(cpu, timestamp + 2, /*tid=*/1,
+  context_.event_tracker->PushSchedSwitch(cpu, timestamp + 2, /*tid=*/1,
                                           prev_state, /*tid=*/4, kThreadName1);
 
   context_.process_tracker->UpdateProcess(2, "test");
@@ -125,9 +125,9 @@
   static const char kThreadName1[] = "thread1";
   static const char kThreadName2[] = "thread2";
 
-  context_.sched_tracker->PushSchedSwitch(cpu, timestamp, /*tid=*/1, prev_state,
+  context_.event_tracker->PushSchedSwitch(cpu, timestamp, /*tid=*/1, prev_state,
                                           /*tid=*/4, kThreadName1);
-  context_.sched_tracker->PushSchedSwitch(cpu, timestamp + 1, /*tid=*/4,
+  context_.event_tracker->PushSchedSwitch(cpu, timestamp + 1, /*tid=*/4,
                                           prev_state,
                                           /*tid=*/1, kThreadName2);
 
diff --git a/src/trace_processor/trace_processor.cc b/src/trace_processor/trace_processor.cc
index 5e07842..21b8be3 100644
--- a/src/trace_processor/trace_processor.cc
+++ b/src/trace_processor/trace_processor.cc
@@ -21,13 +21,13 @@
 
 #include "perfetto/base/time.h"
 #include "src/trace_processor/counters_table.h"
+#include "src/trace_processor/event_tracker.h"
 #include "src/trace_processor/json_trace_parser.h"
 #include "src/trace_processor/process_table.h"
 #include "src/trace_processor/process_tracker.h"
 #include "src/trace_processor/proto_trace_parser.h"
 #include "src/trace_processor/proto_trace_tokenizer.h"
 #include "src/trace_processor/sched_slice_table.h"
-#include "src/trace_processor/sched_tracker.h"
 #include "src/trace_processor/slice_table.h"
 #include "src/trace_processor/slice_tracker.h"
 #include "src/trace_processor/span_operator_table.h"
@@ -49,7 +49,7 @@
 
   context_.storage.reset(new TraceStorage());
   context_.slice_tracker.reset(new SliceTracker(&context_));
-  context_.sched_tracker.reset(new SchedTracker(&context_));
+  context_.event_tracker.reset(new EventTracker(&context_));
   context_.proto_parser.reset(new ProtoTraceParser(&context_));
   context_.process_tracker.reset(new ProcessTracker(&context_));
   context_.sorter.reset(
diff --git a/src/trace_processor/trace_processor_context.cc b/src/trace_processor/trace_processor_context.cc
index 477ec09..7fbc07c 100644
--- a/src/trace_processor/trace_processor_context.cc
+++ b/src/trace_processor/trace_processor_context.cc
@@ -16,10 +16,10 @@
 
 #include "src/trace_processor/trace_processor_context.h"
 #include "src/trace_processor/chunked_trace_reader.h"
+#include "src/trace_processor/event_tracker.h"
 #include "src/trace_processor/json_trace_parser.h"
 #include "src/trace_processor/process_tracker.h"
 #include "src/trace_processor/proto_trace_parser.h"
-#include "src/trace_processor/sched_tracker.h"
 #include "src/trace_processor/slice_tracker.h"
 #include "src/trace_processor/trace_sorter.h"
 
diff --git a/src/trace_processor/trace_processor_context.h b/src/trace_processor/trace_processor_context.h
index f8432c6..ee9f2ba 100644
--- a/src/trace_processor/trace_processor_context.h
+++ b/src/trace_processor/trace_processor_context.h
@@ -25,7 +25,7 @@
 class SliceTracker;
 class ProcessTracker;
 class TraceStorage;
-class SchedTracker;
+class EventTracker;
 class TraceParser;
 class TraceSorter;
 class ProtoTraceParser;
@@ -38,7 +38,7 @@
 
   std::unique_ptr<SliceTracker> slice_tracker;
   std::unique_ptr<ProcessTracker> process_tracker;
-  std::unique_ptr<SchedTracker> sched_tracker;
+  std::unique_ptr<EventTracker> event_tracker;
   std::unique_ptr<TraceStorage> storage;
   std::unique_ptr<ProtoTraceParser> proto_parser;
   std::unique_ptr<TraceSorter> sorter;
diff --git a/src/trace_processor/trace_storage.h b/src/trace_processor/trace_storage.h
index eef8094..62d8ce4 100644
--- a/src/trace_processor/trace_storage.h
+++ b/src/trace_processor/trace_storage.h
@@ -43,7 +43,13 @@
 // StringId is an offset into |string_pool_|.
 using StringId = size_t;
 
-enum RefType { kNoRef = 0, kUTID = 1, kCPU_ID = 2, kIrq = 3, kSoftIrq = 4 };
+enum RefType {
+  kNoRef = 0,
+  kUtid = 1,
+  kCpuId = 2,
+  kIrq = 3,
+  kSoftIrq = 4,
+};
 
 // Stores a data inside a trace file in a columnar form. This makes it efficient
 // to read or search across a single field of the trace (e.g. all the thread
@@ -163,14 +169,12 @@
                              uint64_t duration,
                              StringId name_id,
                              double value,
-                             double value_delta,
                              int64_t ref,
                              RefType type) {
       timestamps_.emplace_back(timestamp);
       durations_.emplace_back(duration);
       name_ids_.emplace_back(name_id);
       values_.emplace_back(value);
-      value_deltas_.emplace_back(value_delta);
       refs_.emplace_back(ref);
       types_.emplace_back(type);
       return counter_count() - 1;
@@ -180,10 +184,6 @@
       durations_[index] = duration;
     }
 
-    void set_value_delta(size_t index, double value_delta) {
-      value_deltas_[index] = value_delta;
-    }
-
     size_t counter_count() const { return timestamps_.size(); }
 
     const std::deque<uint64_t>& timestamps() const { return timestamps_; }
@@ -194,8 +194,6 @@
 
     const std::deque<double>& values() const { return values_; }
 
-    const std::deque<double>& value_deltas() const { return value_deltas_; }
-
     const std::deque<int64_t>& refs() const { return refs_; }
 
     const std::deque<RefType>& types() const { return types_; }
@@ -205,7 +203,6 @@
     std::deque<uint64_t> durations_;
     std::deque<StringId> name_ids_;
     std::deque<double> values_;
-    std::deque<double> value_deltas_;
     std::deque<int64_t> refs_;
     std::deque<RefType> types_;
   };
diff --git a/src/traced/probes/ftrace/test/data/synthetic/events/kmem/rss_stat/format b/src/traced/probes/ftrace/test/data/synthetic/events/kmem/rss_stat/format
index 69d1c9c..c4713fe 100644
--- a/src/traced/probes/ftrace/test/data/synthetic/events/kmem/rss_stat/format
+++ b/src/traced/probes/ftrace/test/data/synthetic/events/kmem/rss_stat/format
@@ -9,4 +9,4 @@
 	field:int member;	offset:8;	size:4;	signed:1;
 	field:long size;	offset:16;	size:8;	signed:1;
 
-print fmt: "member=%d size=%ldKB", REC->member, REC->size
+print fmt: "member=%d size=%ldB", REC->member, REC->size