Merge branch 'master' of https://github.com/grpc/grpc into channelz-server

pull/16346/head
ncteisen 6 years ago
commit 722bc69966
  1. 13
      src/cpp/server/channelz/channelz_service.cc
  2. 4
      src/cpp/server/channelz/channelz_service.h
  3. 52
      test/cpp/end2end/channelz_service_test.cc

@ -60,4 +60,17 @@ Status ChannelzService::GetChannel(
return Status::OK;
}
Status ChannelzService::GetSubchannel(
ServerContext* unused, const channelz::v1::GetSubchannelRequest* request,
channelz::v1::GetSubchannelResponse* response) {
char* json_str = grpc_channelz_get_subchannel(request->subchannel_id());
google::protobuf::util::Status s =
google::protobuf::util::JsonStringToMessage(json_str, response);
gpr_free(json_str);
if (s != google::protobuf::util::Status::OK) {
return Status(INTERNAL, s.ToString());
}
return Status::OK;
}
} // namespace grpc

@ -36,6 +36,10 @@ class ChannelzService final : public channelz::v1::Channelz::Service {
Status GetChannel(ServerContext* unused,
const channelz::v1::GetChannelRequest* request,
channelz::v1::GetChannelResponse* response) override;
// implementation of GetSubchannel rpc
Status GetSubchannel(ServerContext* unused,
const channelz::v1::GetSubchannelRequest* request,
channelz::v1::GetSubchannelResponse* response) override;
};
} // namespace grpc

@ -35,10 +35,14 @@
#include "test/core/util/test_config.h"
#include "test/cpp/end2end/test_service_impl.h"
#include <google/protobuf/text_format.h>
#include <gtest/gtest.h>
using grpc::channelz::v1::GetChannelRequest;
using grpc::channelz::v1::GetChannelResponse;
using grpc::channelz::v1::GetSubchannelRequest;
using grpc::channelz::v1::GetSubchannelResponse;
using grpc::channelz::v1::GetTopChannelsRequest;
using grpc::channelz::v1::GetTopChannelsResponse;
@ -355,6 +359,54 @@ TEST_F(ChannelzServerTest, ManyRequestsManyChannels) {
}
}
TEST_F(ChannelzServerTest, ManySubchannels) {
ResetStubs();
const int kNumChannels = 4;
ConfigureProxy(kNumChannels);
const int kNumSuccess = 10;
const int kNumFailed = 11;
for (int i = 0; i < kNumSuccess; ++i) {
SendSuccessfulEcho(0);
SendSuccessfulEcho(2);
}
for (int i = 0; i < kNumFailed; ++i) {
SendFailedEcho(1);
SendFailedEcho(2);
}
GetTopChannelsRequest gtc_request;
GetTopChannelsResponse gtc_response;
gtc_request.set_start_channel_id(0);
ClientContext context;
Status s =
channelz_stub_->GetTopChannels(&context, gtc_request, &gtc_response);
EXPECT_TRUE(s.ok()) << s.error_message();
EXPECT_EQ(gtc_response.channel_size(), kNumChannels);
for (int i = 0; i < gtc_response.channel_size(); ++i) {
// if the channel sent no RPCs, then expect no subchannels to have been
// created.
if (gtc_response.channel(i).data().calls_started() == 0) {
EXPECT_EQ(gtc_response.channel(i).subchannel_ref_size(), 0);
continue;
}
// The resolver must return at least one address.
ASSERT_GT(gtc_response.channel(i).subchannel_ref_size(), 0);
GetSubchannelRequest gsc_request;
GetSubchannelResponse gsc_response;
gsc_request.set_subchannel_id(
gtc_response.channel(i).subchannel_ref(0).subchannel_id());
ClientContext context;
Status s =
channelz_stub_->GetSubchannel(&context, gsc_request, &gsc_response);
EXPECT_TRUE(s.ok()) << s.error_message();
EXPECT_EQ(gtc_response.channel(i).data().calls_started(),
gsc_response.subchannel().data().calls_started());
EXPECT_EQ(gtc_response.channel(i).data().calls_succeeded(),
gsc_response.subchannel().data().calls_succeeded());
EXPECT_EQ(gtc_response.channel(i).data().calls_failed(),
gsc_response.subchannel().data().calls_failed());
}
}
} // namespace testing
} // namespace grpc

Loading…
Cancel
Save