Reviewer feedback
diff --git a/CMakeLists.txt b/CMakeLists.txt
index c80744d..93d3b12 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -283,7 +283,6 @@
 add_dependencies(buildtests_c grpc_channel_args_test)
 add_dependencies(buildtests_c grpc_channel_stack_builder_test)
 add_dependencies(buildtests_c grpc_channel_stack_test)
-add_dependencies(buildtests_c grpc_channel_tracer_test)
 add_dependencies(buildtests_c grpc_completion_queue_test)
 add_dependencies(buildtests_c grpc_completion_queue_threading_test)
 add_dependencies(buildtests_c grpc_credentials_test)
@@ -518,6 +517,7 @@
 endif()
 add_dependencies(buildtests_cxx channel_arguments_test)
 add_dependencies(buildtests_cxx channel_filter_test)
+add_dependencies(buildtests_cxx channel_tracer_test)
 add_dependencies(buildtests_cxx chttp2_settings_timeout_test)
 add_dependencies(buildtests_cxx cli_call_test)
 add_dependencies(buildtests_cxx client_channel_stress_test)
@@ -6559,33 +6559,6 @@
 endif (gRPC_BUILD_TESTS)
 if (gRPC_BUILD_TESTS)
 
-add_executable(grpc_channel_tracer_test
-  test/core/channel/channel_tracer_test.cc
-)
-
-
-target_include_directories(grpc_channel_tracer_test
-  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
-  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
-  PRIVATE ${_gRPC_SSL_INCLUDE_DIR}
-  PRIVATE ${_gRPC_PROTOBUF_INCLUDE_DIR}
-  PRIVATE ${_gRPC_ZLIB_INCLUDE_DIR}
-  PRIVATE ${_gRPC_BENCHMARK_INCLUDE_DIR}
-  PRIVATE ${_gRPC_CARES_INCLUDE_DIR}
-  PRIVATE ${_gRPC_GFLAGS_INCLUDE_DIR}
-)
-
-target_link_libraries(grpc_channel_tracer_test
-  ${_gRPC_ALLTARGETS_LIBRARIES}
-  grpc_test_util
-  grpc
-  gpr_test_util
-  gpr
-)
-
-endif (gRPC_BUILD_TESTS)
-if (gRPC_BUILD_TESTS)
-
 add_executable(grpc_completion_queue_test
   test/core/surface/completion_queue_test.cc
 )
@@ -9512,6 +9485,43 @@
 endif (gRPC_BUILD_TESTS)
 if (gRPC_BUILD_TESTS)
 
+add_executable(channel_tracer_test
+  test/core/channel/channel_tracer_test.cc
+  third_party/googletest/googletest/src/gtest-all.cc
+  third_party/googletest/googlemock/src/gmock-all.cc
+)
+
+
+target_include_directories(channel_tracer_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${_gRPC_SSL_INCLUDE_DIR}
+  PRIVATE ${_gRPC_PROTOBUF_INCLUDE_DIR}
+  PRIVATE ${_gRPC_ZLIB_INCLUDE_DIR}
+  PRIVATE ${_gRPC_BENCHMARK_INCLUDE_DIR}
+  PRIVATE ${_gRPC_CARES_INCLUDE_DIR}
+  PRIVATE ${_gRPC_GFLAGS_INCLUDE_DIR}
+  PRIVATE third_party/googletest/googletest/include
+  PRIVATE third_party/googletest/googletest
+  PRIVATE third_party/googletest/googlemock/include
+  PRIVATE third_party/googletest/googlemock
+  PRIVATE ${_gRPC_PROTO_GENS_DIR}
+)
+
+target_link_libraries(channel_tracer_test
+  ${_gRPC_PROTOBUF_LIBRARIES}
+  ${_gRPC_ALLTARGETS_LIBRARIES}
+  grpc_test_util
+  grpc++
+  grpc
+  gpr_test_util
+  gpr
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
 add_executable(chttp2_settings_timeout_test
   test/core/transport/chttp2/settings_timeout_test.cc
   third_party/googletest/googletest/src/gtest-all.cc
diff --git a/Makefile b/Makefile
index 02a7291..d5777d0 100644
--- a/Makefile
+++ b/Makefile
@@ -1006,7 +1006,6 @@
 grpc_channel_args_test: $(BINDIR)/$(CONFIG)/grpc_channel_args_test
 grpc_channel_stack_builder_test: $(BINDIR)/$(CONFIG)/grpc_channel_stack_builder_test
 grpc_channel_stack_test: $(BINDIR)/$(CONFIG)/grpc_channel_stack_test
-grpc_channel_tracer_test: $(BINDIR)/$(CONFIG)/grpc_channel_tracer_test
 grpc_completion_queue_test: $(BINDIR)/$(CONFIG)/grpc_completion_queue_test
 grpc_completion_queue_threading_test: $(BINDIR)/$(CONFIG)/grpc_completion_queue_threading_test
 grpc_create_jwt: $(BINDIR)/$(CONFIG)/grpc_create_jwt
@@ -1115,6 +1114,7 @@
 bm_pollset: $(BINDIR)/$(CONFIG)/bm_pollset
 channel_arguments_test: $(BINDIR)/$(CONFIG)/channel_arguments_test
 channel_filter_test: $(BINDIR)/$(CONFIG)/channel_filter_test
+channel_tracer_test: $(BINDIR)/$(CONFIG)/channel_tracer_test
 chttp2_settings_timeout_test: $(BINDIR)/$(CONFIG)/chttp2_settings_timeout_test
 cli_call_test: $(BINDIR)/$(CONFIG)/cli_call_test
 client_channel_stress_test: $(BINDIR)/$(CONFIG)/client_channel_stress_test
@@ -1425,7 +1425,6 @@
   $(BINDIR)/$(CONFIG)/grpc_channel_args_test \
   $(BINDIR)/$(CONFIG)/grpc_channel_stack_builder_test \
   $(BINDIR)/$(CONFIG)/grpc_channel_stack_test \
-  $(BINDIR)/$(CONFIG)/grpc_channel_tracer_test \
   $(BINDIR)/$(CONFIG)/grpc_completion_queue_test \
   $(BINDIR)/$(CONFIG)/grpc_completion_queue_threading_test \
   $(BINDIR)/$(CONFIG)/grpc_credentials_test \
@@ -1584,6 +1583,7 @@
   $(BINDIR)/$(CONFIG)/bm_pollset \
   $(BINDIR)/$(CONFIG)/channel_arguments_test \
   $(BINDIR)/$(CONFIG)/channel_filter_test \
+  $(BINDIR)/$(CONFIG)/channel_tracer_test \
   $(BINDIR)/$(CONFIG)/chttp2_settings_timeout_test \
   $(BINDIR)/$(CONFIG)/cli_call_test \
   $(BINDIR)/$(CONFIG)/client_channel_stress_test \
@@ -1732,6 +1732,7 @@
   $(BINDIR)/$(CONFIG)/bm_pollset \
   $(BINDIR)/$(CONFIG)/channel_arguments_test \
   $(BINDIR)/$(CONFIG)/channel_filter_test \
+  $(BINDIR)/$(CONFIG)/channel_tracer_test \
   $(BINDIR)/$(CONFIG)/chttp2_settings_timeout_test \
   $(BINDIR)/$(CONFIG)/cli_call_test \
   $(BINDIR)/$(CONFIG)/client_channel_stress_test \
@@ -1918,8 +1919,6 @@
 	$(Q) $(BINDIR)/$(CONFIG)/grpc_channel_stack_builder_test || ( echo test grpc_channel_stack_builder_test failed ; exit 1 )
 	$(E) "[RUN]     Testing grpc_channel_stack_test"
 	$(Q) $(BINDIR)/$(CONFIG)/grpc_channel_stack_test || ( echo test grpc_channel_stack_test failed ; exit 1 )
-	$(E) "[RUN]     Testing grpc_channel_tracer_test"
-	$(Q) $(BINDIR)/$(CONFIG)/grpc_channel_tracer_test || ( echo test grpc_channel_tracer_test failed ; exit 1 )
 	$(E) "[RUN]     Testing grpc_completion_queue_test"
 	$(Q) $(BINDIR)/$(CONFIG)/grpc_completion_queue_test || ( echo test grpc_completion_queue_test failed ; exit 1 )
 	$(E) "[RUN]     Testing grpc_completion_queue_threading_test"
@@ -2130,6 +2129,8 @@
 	$(Q) $(BINDIR)/$(CONFIG)/channel_arguments_test || ( echo test channel_arguments_test failed ; exit 1 )
 	$(E) "[RUN]     Testing channel_filter_test"
 	$(Q) $(BINDIR)/$(CONFIG)/channel_filter_test || ( echo test channel_filter_test failed ; exit 1 )
+	$(E) "[RUN]     Testing channel_tracer_test"
+	$(Q) $(BINDIR)/$(CONFIG)/channel_tracer_test || ( echo test channel_tracer_test failed ; exit 1 )
 	$(E) "[RUN]     Testing chttp2_settings_timeout_test"
 	$(Q) $(BINDIR)/$(CONFIG)/chttp2_settings_timeout_test || ( echo test chttp2_settings_timeout_test failed ; exit 1 )
 	$(E) "[RUN]     Testing cli_call_test"
@@ -11414,38 +11415,6 @@
 endif
 
 
-GRPC_CHANNEL_TRACER_TEST_SRC = \
-    test/core/channel/channel_tracer_test.cc \
-
-GRPC_CHANNEL_TRACER_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GRPC_CHANNEL_TRACER_TEST_SRC))))
-ifeq ($(NO_SECURE),true)
-
-# You can't build secure targets if you don't have OpenSSL.
-
-$(BINDIR)/$(CONFIG)/grpc_channel_tracer_test: openssl_dep_error
-
-else
-
-
-
-$(BINDIR)/$(CONFIG)/grpc_channel_tracer_test: $(GRPC_CHANNEL_TRACER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
-	$(E) "[LD]      Linking $@"
-	$(Q) mkdir -p `dirname $@`
-	$(Q) $(LD) $(LDFLAGS) $(GRPC_CHANNEL_TRACER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/grpc_channel_tracer_test
-
-endif
-
-$(OBJDIR)/$(CONFIG)/test/core/channel/channel_tracer_test.o:  $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
-
-deps_grpc_channel_tracer_test: $(GRPC_CHANNEL_TRACER_TEST_OBJS:.o=.dep)
-
-ifneq ($(NO_SECURE),true)
-ifneq ($(NO_DEPS),true)
--include $(GRPC_CHANNEL_TRACER_TEST_OBJS:.o=.dep)
-endif
-endif
-
-
 GRPC_COMPLETION_QUEUE_TEST_SRC = \
     test/core/surface/completion_queue_test.cc \
 
@@ -15165,6 +15134,49 @@
 endif
 
 
+CHANNEL_TRACER_TEST_SRC = \
+    test/core/channel/channel_tracer_test.cc \
+
+CHANNEL_TRACER_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(CHANNEL_TRACER_TEST_SRC))))
+ifeq ($(NO_SECURE),true)
+
+# You can't build secure targets if you don't have OpenSSL.
+
+$(BINDIR)/$(CONFIG)/channel_tracer_test: openssl_dep_error
+
+else
+
+
+
+
+ifeq ($(NO_PROTOBUF),true)
+
+# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.0.0+.
+
+$(BINDIR)/$(CONFIG)/channel_tracer_test: protobuf_dep_error
+
+else
+
+$(BINDIR)/$(CONFIG)/channel_tracer_test: $(PROTOBUF_DEP) $(CHANNEL_TRACER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
+	$(E) "[LD]      Linking $@"
+	$(Q) mkdir -p `dirname $@`
+	$(Q) $(LDXX) $(LDFLAGS) $(CHANNEL_TRACER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/channel_tracer_test
+
+endif
+
+endif
+
+$(OBJDIR)/$(CONFIG)/test/core/channel/channel_tracer_test.o:  $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
+
+deps_channel_tracer_test: $(CHANNEL_TRACER_TEST_OBJS:.o=.dep)
+
+ifneq ($(NO_SECURE),true)
+ifneq ($(NO_DEPS),true)
+-include $(CHANNEL_TRACER_TEST_OBJS:.o=.dep)
+endif
+endif
+
+
 CHTTP2_SETTINGS_TIMEOUT_TEST_SRC = \
     test/core/transport/chttp2/settings_timeout_test.cc \
 
diff --git a/build.yaml b/build.yaml
index d03b7a1..bdc6db8 100644
--- a/build.yaml
+++ b/build.yaml
@@ -2432,17 +2432,6 @@
   - gpr_test_util
   - gpr
   uses_polling: false
-- name: grpc_channel_tracer_test
-  build: test
-  language: c
-  src:
-  - test/core/channel/channel_tracer_test.cc
-  deps:
-  - grpc_test_util
-  - grpc
-  - gpr_test_util
-  - gpr
-  uses_polling: false
 - name: grpc_completion_queue_test
   build: test
   language: c
@@ -3896,6 +3885,21 @@
   - grpc
   - gpr
   uses_polling: false
+- name: channel_tracer_test
+  gtest: true
+  build: test
+  language: c++
+  src:
+  - test/core/channel/channel_tracer_test.cc
+  deps:
+  - grpc_test_util
+  - grpc++
+  - grpc
+  - gpr_test_util
+  - gpr
+  uses:
+  - grpc++_test
+  uses_polling: false
 - name: chttp2_settings_timeout_test
   gtest: true
   build: test
diff --git a/src/core/lib/channel/channel_tracer.cc b/src/core/lib/channel/channel_tracer.cc
index fdb9657..38a5b1e 100644
--- a/src/core/lib/channel/channel_tracer.cc
+++ b/src/core/lib/channel/channel_tracer.cc
@@ -40,6 +40,27 @@
 
 namespace grpc_core {
 
+ChannelTrace::TraceEvent::TraceEvent(
+    grpc_slice data, grpc_error* error,
+    grpc_connectivity_state connectivity_state,
+    RefCountedPtr<ChannelTrace> referenced_tracer)
+    : data_(data),
+      error_(error),
+      timestamp_(grpc_millis_to_timespec(grpc_core::ExecCtx::Get()->Now(),
+                                         GPR_CLOCK_REALTIME)),
+      connectivity_state_(connectivity_state),
+      next_(nullptr),
+      referenced_tracer_(std::move(referenced_tracer)) {}
+
+ChannelTrace::TraceEvent::TraceEvent(grpc_slice data, grpc_error* error,
+                                     grpc_connectivity_state connectivity_state)
+    : data_(data),
+      error_(error),
+      timestamp_(grpc_millis_to_timespec(grpc_core::ExecCtx::Get()->Now(),
+                                         GPR_CLOCK_REALTIME)),
+      connectivity_state_(connectivity_state),
+      next_(nullptr) {}
+
 ChannelTrace::TraceEvent::~TraceEvent() {
   GRPC_ERROR_UNREF(error_);
   grpc_slice_unref_internal(data_);
@@ -72,7 +93,7 @@
   gpr_mu_destroy(&tracer_mu_);
 }
 
-intptr_t ChannelTrace::GetUuid() { return channel_uuid_; }
+intptr_t ChannelTrace::GetUuid() const { return channel_uuid_; }
 
 void ChannelTrace::AddTraceEventHelper(TraceEvent* new_trace_event) {
   ++num_events_logged_;
@@ -125,7 +146,7 @@
 
 }  // anonymous namespace
 
-void ChannelTrace::TraceEvent::RenderTraceEvent(grpc_json* json) {
+void ChannelTrace::TraceEvent::RenderTraceEvent(grpc_json* json) const {
   grpc_json* json_iterator = nullptr;
   json_iterator = grpc_json_create_child(json_iterator, json, "description",
                                          grpc_slice_to_c_string(data_),
@@ -150,7 +171,7 @@
   }
   json_iterator =
       grpc_json_create_child(json_iterator, json, "timestamp",
-                             fmt_time(time_created_), GRPC_JSON_STRING, true);
+                             fmt_time(timestamp_), GRPC_JSON_STRING, true);
   json_iterator =
       grpc_json_create_child(json_iterator, json, "state",
                              grpc_connectivity_state_name(connectivity_state_),
@@ -163,7 +184,7 @@
   }
 }
 
-char* ChannelTrace::RenderTrace() {
+char* ChannelTrace::RenderTrace() const {
   if (!max_list_size_)
     return nullptr;  // tracing is disabled if max_events == 0
   grpc_json* json = grpc_json_create(GRPC_JSON_OBJECT);
diff --git a/src/core/lib/channel/channel_tracer.h b/src/core/lib/channel/channel_tracer.h
index 976e66c..3339be8 100644
--- a/src/core/lib/channel/channel_tracer.h
+++ b/src/core/lib/channel/channel_tracer.h
@@ -38,7 +38,7 @@
   ~ChannelTrace();
 
   // returns the tracer's uuid
-  intptr_t GetUuid();
+  intptr_t GetUuid() const;
 
   // Adds a new trace event to the tracing object
   void AddTraceEvent(grpc_slice data, grpc_error* error,
@@ -57,7 +57,7 @@
 
   // Returns the tracing data rendered as a grpc json string.
   // The string is owned by the caller and must be freed.
-  char* RenderTrace();
+  char* RenderTrace() const;
 
  private:
   // Private class to encapsulate all the data and bookkeeping needed for a
@@ -69,41 +69,27 @@
     // overall channelz object, not just the ChannelTrace object
     TraceEvent(grpc_slice data, grpc_error* error,
                grpc_connectivity_state connectivity_state,
-               RefCountedPtr<ChannelTrace> referenced_tracer)
-        : data_(data),
-          error_(error),
-          connectivity_state_(connectivity_state),
-          next_(nullptr),
-          referenced_tracer_(std::move(referenced_tracer)) {
-      time_created_ = gpr_now(GPR_CLOCK_REALTIME);
-    }
+               RefCountedPtr<ChannelTrace> referenced_tracer);
 
     // Constructor for a TraceEvent that does not reverence a different
     // channel.
     TraceEvent(grpc_slice data, grpc_error* error,
-               grpc_connectivity_state connectivity_state)
-        : data_(data),
-          error_(error),
-          connectivity_state_(connectivity_state),
-          next_(nullptr),
-          referenced_tracer_(nullptr) {
-      time_created_ = gpr_now(GPR_CLOCK_REALTIME);
-    }
+               grpc_connectivity_state connectivity_state);
 
     ~TraceEvent();
 
     // Renders the data inside of this TraceEvent into a json object. This is
     // used by the ChannelTrace, when it is rendering itself.
-    void RenderTraceEvent(grpc_json* json);
+    void RenderTraceEvent(grpc_json* json) const;
 
     // set and get for the next_ pointer.
-    TraceEvent* next() { return next_; }
+    TraceEvent* next() const { return next_; }
     void set_next(TraceEvent* next) { next_ = next; }
 
    private:
     grpc_slice data_;
     grpc_error* error_;
-    gpr_timespec time_created_;
+    gpr_timespec timestamp_;
     grpc_connectivity_state connectivity_state_;
     TraceEvent* next_;
     // the tracer object for the (sub)channel that this trace event refers to.
diff --git a/src/core/lib/surface/channel.cc b/src/core/lib/surface/channel.cc
index 1488736..fb435b9 100644
--- a/src/core/lib/surface/channel.cc
+++ b/src/core/lib/surface/channel.cc
@@ -21,6 +21,7 @@
 #include "src/core/lib/surface/channel.h"
 
 #include <inttypes.h>
+#include <limits.h>
 #include <stdlib.h>
 #include <string.h>
 
@@ -173,8 +174,8 @@
     } else if (0 == strcmp(args->args[i].key,
                            GRPC_ARG_MAX_CHANNEL_TRACE_EVENTS_PER_NODE)) {
       GPR_ASSERT(channel_tracer_max_nodes == 0);
-      // max_nodes defaults to 0 (which is off), clamped between 0 and 100.
-      const grpc_integer_options options = {0, 0, 100};
+      // max_nodes defaults to 0 (which is off), clamped between 0 and INT_MAX
+      const grpc_integer_options options = {0, 0, INT_MAX};
       channel_tracer_max_nodes =
           (size_t)grpc_channel_arg_get_integer(&args->args[i], options);
     }
diff --git a/test/core/channel/channel_tracer_test.cc b/test/core/channel/channel_tracer_test.cc
index 78d4dad..d76dacc 100644
--- a/test/core/channel/channel_tracer_test.cc
+++ b/test/core/channel/channel_tracer_test.cc
@@ -22,6 +22,8 @@
 #include <grpc/support/alloc.h>
 #include <grpc/support/log.h>
 
+#include <gtest/gtest.h>
+
 #include "src/core/lib/channel/channel_tracer.h"
 #include "src/core/lib/channel/object_registry.h"
 #include "src/core/lib/gpr/useful.h"
@@ -30,9 +32,8 @@
 #include "test/core/util/channel_tracing_utils.h"
 #include "test/core/util/test_config.h"
 
-using grpc_core::ChannelTrace;
-using grpc_core::MakeRefCounted;
-using grpc_core::RefCountedPtr;
+namespace grpc_core {
+namespace testing {
 
 static void add_simple_trace_event(RefCountedPtr<ChannelTrace> tracer) {
   tracer->AddTraceEvent(grpc_slice_from_static_string("simple trace"),
@@ -99,7 +100,7 @@
 
 // Calls basic test with various values for max_nodes (including 0, which turns
 // the tracer off).
-static void test_basic_channel_sizing() {
+TEST(ChannelTracerTest, BasicTest) {
   test_basic_channel_tracing(0);
   test_basic_channel_tracing(1);
   test_basic_channel_tracing(2);
@@ -152,7 +153,7 @@
 }
 
 // Calls the complex test with a sweep of sizes for max_nodes.
-static void test_complex_channel_sizing() {
+TEST(ChannelTracerTest, ComplexTest) {
   test_complex_channel_tracing(0);
   test_complex_channel_tracing(1);
   test_complex_channel_tracing(2);
@@ -164,7 +165,7 @@
 // Test a case in which the parent channel has subchannels and the subchannels
 // have connections. Ensures that everything lives as long as it should then
 // gets deleted.
-static void test_nesting() {
+TEST(ChannelTracerTest, TestNesting) {
   grpc_core::ExecCtx exec_ctx;
   RefCountedPtr<ChannelTrace> tracer = MakeRefCounted<ChannelTrace>(10);
   add_simple_trace_event(tracer);
@@ -195,14 +196,14 @@
   conn1.reset(nullptr);
 }
 
+}  // namespace testing
+}  // namespace grpc_core
+
 int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   grpc_init();
-  test_basic_channel_tracing(5);
-  test_basic_channel_sizing();
-  test_complex_channel_tracing(5);
-  test_complex_channel_sizing();
-  test_nesting();
+  ::testing::InitGoogleTest(&argc, argv);
+  int ret = RUN_ALL_TESTS();
   grpc_shutdown();
-  return 0;
+  return ret;
 }
diff --git a/tools/run_tests/generated/sources_and_headers.json b/tools/run_tests/generated/sources_and_headers.json
index 94f45c8..e4741fc 100644
--- a/tools/run_tests/generated/sources_and_headers.json
+++ b/tools/run_tests/generated/sources_and_headers.json
@@ -926,23 +926,6 @@
     "headers": [], 
     "is_filegroup": false, 
     "language": "c", 
-    "name": "grpc_channel_tracer_test", 
-    "src": [
-      "test/core/channel/channel_tracer_test.cc"
-    ], 
-    "third_party": false, 
-    "type": "target"
-  }, 
-  {
-    "deps": [
-      "gpr", 
-      "gpr_test_util", 
-      "grpc", 
-      "grpc_test_util"
-    ], 
-    "headers": [], 
-    "is_filegroup": false, 
-    "language": "c", 
     "name": "grpc_completion_queue_test", 
     "src": [
       "test/core/surface/completion_queue_test.cc"
@@ -2847,6 +2830,25 @@
       "gpr", 
       "gpr_test_util", 
       "grpc", 
+      "grpc++", 
+      "grpc++_test", 
+      "grpc_test_util"
+    ], 
+    "headers": [], 
+    "is_filegroup": false, 
+    "language": "c++", 
+    "name": "channel_tracer_test", 
+    "src": [
+      "test/core/channel/channel_tracer_test.cc"
+    ], 
+    "third_party": false, 
+    "type": "target"
+  }, 
+  {
+    "deps": [
+      "gpr", 
+      "gpr_test_util", 
+      "grpc", 
       "grpc_test_util"
     ], 
     "headers": [], 
diff --git a/tools/run_tests/generated/tests.json b/tools/run_tests/generated/tests.json
index fdcac93..4d86843 100644
--- a/tools/run_tests/generated/tests.json
+++ b/tools/run_tests/generated/tests.json
@@ -1238,30 +1238,6 @@
     "flaky": false, 
     "gtest": false, 
     "language": "c", 
-    "name": "grpc_channel_tracer_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
-      "windows"
-    ], 
-    "uses_polling": false
-  }, 
-  {
-    "args": [], 
-    "benchmark": false, 
-    "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
-      "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c", 
     "name": "grpc_completion_queue_test", 
     "platforms": [
       "linux", 
@@ -3376,6 +3352,30 @@
     "flaky": false, 
     "gtest": true, 
     "language": "c++", 
+    "name": "channel_tracer_test", 
+    "platforms": [
+      "linux", 
+      "mac", 
+      "posix", 
+      "windows"
+    ], 
+    "uses_polling": false
+  }, 
+  {
+    "args": [], 
+    "benchmark": false, 
+    "ci_platforms": [
+      "linux", 
+      "mac", 
+      "posix", 
+      "windows"
+    ], 
+    "cpu_cost": 1.0, 
+    "exclude_configs": [], 
+    "exclude_iomgrs": [], 
+    "flaky": false, 
+    "gtest": true, 
+    "language": "c++", 
     "name": "chttp2_settings_timeout_test", 
     "platforms": [
       "linux",