Write ClientChannelNode in terms of client_channel
diff --git a/src/core/ext/filters/client_channel/client_channel_channelz.cc b/src/core/ext/filters/client_channel/client_channel_channelz.cc
index c9bdce1..e9534f2 100644
--- a/src/core/ext/filters/client_channel/client_channel_channelz.cc
+++ b/src/core/ext/filters/client_channel/client_channel_channelz.cc
@@ -18,8 +18,10 @@
 
 #include <grpc/support/port_platform.h>
 
+#include "src/core/ext/filters/client_channel/client_channel.h"
 #include "src/core/ext/filters/client_channel/client_channel_channelz.h"
 #include "src/core/lib/gpr/useful.h"
+#include "src/core/lib/surface/channel.h"
 #include "src/core/lib/transport/connectivity_state.h"
 
 namespace grpc_core {
@@ -37,12 +39,21 @@
     client_channel_channelz_copy, client_channel_channelz_destroy,
     client_channel_channelz_cmp};
 
+ClientChannelNode::ClientChannelNode(grpc_channel* channel,
+                                     size_t channel_tracer_max_nodes)
+    : ChannelNode(channel, channel_tracer_max_nodes) {
+  client_channel_ =
+      grpc_channel_stack_last_element(grpc_channel_get_channel_stack(channel));
+  GPR_ASSERT(client_channel_->filter == &grpc_client_channel_filter);
+}
+
 void ClientChannelNode::PopulateConnectivityState(grpc_json* json) {
   grpc_connectivity_state state;
-  if (channel() != nullptr) {
-    state = grpc_channel_check_connectivity_state(channel(), false);
-  } else {
+  if (ChannelIsDestroyed()) {
     state = GRPC_CHANNEL_SHUTDOWN;
+  } else {
+    state =
+        grpc_client_channel_check_connectivity_state(client_channel_, false);
   }
   json = grpc_json_create_child(nullptr, json, "state", nullptr,
                                 GRPC_JSON_OBJECT, false);
diff --git a/src/core/ext/filters/client_channel/client_channel_channelz.h b/src/core/ext/filters/client_channel/client_channel_channelz.h
index d339b4e..a3f8b07 100644
--- a/src/core/ext/filters/client_channel/client_channel_channelz.h
+++ b/src/core/ext/filters/client_channel/client_channel_channelz.h
@@ -31,8 +31,7 @@
 // functionality like querying for connectivity_state and subchannel data.
 class ClientChannelNode : public ChannelNode {
  public:
-  ClientChannelNode(grpc_channel* channel, size_t channel_tracer_max_nodes)
-      : ChannelNode(channel, channel_tracer_max_nodes) {}
+  ClientChannelNode(grpc_channel* channel, size_t channel_tracer_max_nodes);
   virtual ~ClientChannelNode() {}
 
   // Override this functionality since client_channels have a notion of
@@ -42,6 +41,9 @@
   // Helper to create a channel arg to ensure this type of ChannelNode is
   // created.
   static grpc_arg CreateArg();
+
+ private:
+  grpc_channel_element* client_channel_;
 };
 
 RefCountedPtr<ChannelNode> MakeClientChannelNode(
diff --git a/src/core/lib/channel/channelz.h b/src/core/lib/channel/channelz.h
index fc972bf..e14e1b7 100644
--- a/src/core/lib/channel/channelz.h
+++ b/src/core/lib/channel/channelz.h
@@ -64,15 +64,14 @@
 
   ChannelTrace* trace() { return trace_.get(); }
 
-  void set_channel_destroyed() {
+  void MarkChannelDestroyed() {
     GPR_ASSERT(channel_ != nullptr);
     channel_ = nullptr;
   }
 
-  intptr_t channel_uuid() { return channel_uuid_; }
+  bool ChannelIsDestroyed() { return channel_ == nullptr; }
 
- protected:
-  grpc_channel* channel() { return channel_; }
+  intptr_t channel_uuid() { return channel_uuid_; }
 
  private:
   // testing peer friend.
diff --git a/src/core/lib/surface/channel.cc b/src/core/lib/surface/channel.cc
index a17fde0..71bd24c 100644
--- a/src/core/lib/surface/channel.cc
+++ b/src/core/lib/surface/channel.cc
@@ -410,7 +410,7 @@
 static void destroy_channel(void* arg, grpc_error* error) {
   grpc_channel* channel = static_cast<grpc_channel*>(arg);
   if (channel->channelz_channel != nullptr) {
-    channel->channelz_channel->set_channel_destroyed();
+    channel->channelz_channel->MarkChannelDestroyed();
     channel->channelz_channel.reset();
   }
   grpc_channel_stack_destroy(CHANNEL_STACK_FROM_CHANNEL(channel));