23 #include "absl/strings/str_cat.h" 
   24 #include "absl/strings/string_view.h" 
   25 #include "gmock/gmock.h" 
   26 #include "gtest/gtest.h" 
   27 #include "opencensus/stats/stats.h" 
   28 #include "opencensus/stats/tag_key.h" 
   29 #include "opencensus/stats/testing/test_utils.h" 
   30 #include "opencensus/tags/tag_map.h" 
   31 #include "opencensus/tags/with_tag_map.h" 
   38 #include "src/proto/grpc/testing/echo.grpc.pb.h" 
   46 using ::opencensus::stats::Aggregation;
 
   47 using ::opencensus::stats::Distribution;
 
   49 using ::opencensus::stats::ViewDescriptor;
 
   50 using ::opencensus::stats::testing::TestUtils;
 
   51 using ::opencensus::tags::TagKey;
 
   52 using ::opencensus::tags::WithTagMap;
 
   54 const auto TEST_TAG_KEY = TagKey::Register(
"my_key");
 
   55 const auto TEST_TAG_VALUE = 
"my_value";
 
   56 const char* kExpectedTraceIdKey = 
"expected_trace_id";
 
   67       ServerReaderWriter<EchoResponse, EchoRequest>* 
stream)
 override {
 
   75       if (
metadata.first == kExpectedTraceIdKey) {
 
   92   void SetUp()
 override {
 
  111   void ResetStub(std::shared_ptr<Channel> 
channel) {
 
  115   void TearDown()
 override {
 
  120   void RunServerLoop() { 
server_->Wait(); }
 
  130   std::unique_ptr<EchoTestService::Stub> 
stub_;
 
  133 TEST_F(StatsPluginEnd2EndTest, ErrorCount) {
 
  134   const auto client_method_descriptor =
 
  137           .set_name(
"client_method")
 
  140           .add_column(TEST_TAG_KEY);
 
  141   View client_method_view(client_method_descriptor);
 
  142   const auto server_method_descriptor =
 
  145           .set_name(
"server_method")
 
  149   View server_method_view(server_method_descriptor);
 
  151   const auto client_status_descriptor =
 
  154           .set_name(
"client_status")
 
  157           .add_column(TEST_TAG_KEY);
 
  158   View client_status_view(client_status_descriptor);
 
  159   const auto server_status_descriptor =
 
  162           .set_name(
"server_status")
 
  165   View server_status_view(server_status_descriptor);
 
  168   for (
int i = 0; 
i <= 16; ++
i) {
 
  171     request.mutable_param()->mutable_expected_error()->set_code(
i);
 
  175       WithTagMap 
tags({{TEST_TAG_KEY, TEST_TAG_VALUE}});
 
  184       client_method_view.GetData().int_data(),
 
  188   EXPECT_THAT(server_method_view.GetData().int_data(),
 
  243   EXPECT_THAT(client_status_view.GetData().int_data(),
 
  245   EXPECT_THAT(server_status_view.GetData().int_data(),
 
  249 TEST_F(StatsPluginEnd2EndTest, RequestReceivedBytesPerRpc) {
 
  251   View client_received_bytes_per_rpc_view(
 
  254   View server_received_bytes_per_rpc_view(
 
  269   EXPECT_THAT(client_received_bytes_per_rpc_view.GetData().distribution_data(),
 
  275   EXPECT_THAT(client_sent_bytes_per_rpc_view.GetData().distribution_data(),
 
  281   EXPECT_THAT(server_received_bytes_per_rpc_view.GetData().distribution_data(),
 
  287   EXPECT_THAT(server_sent_bytes_per_rpc_view.GetData().distribution_data(),
 
  295 TEST_F(StatsPluginEnd2EndTest, Latency) {
 
  318       client_latency_view.GetData().distribution_data(),
 
  328   const auto client_latency = client_latency_view.GetData()
 
  333       client_server_latency_view.GetData().distribution_data(),
 
  344   const auto client_elapsed_time = client_server_latency_view.GetData()
 
  349       server_server_latency_view.GetData().distribution_data(),
 
  358 TEST_F(StatsPluginEnd2EndTest, CompletedRpcs) {
 
  366   for (
int i = 0; 
i < 
count; ++
i) {
 
  376     EXPECT_THAT(client_completed_rpcs_view.GetData().int_data(),
 
  379     EXPECT_THAT(server_completed_rpcs_view.GetData().int_data(),
 
  392   EXPECT_THAT(client_completed_rpcs_view.GetData().int_data(),
 
  395                       "grpc.testing.EchoTestService/BidiStream", 
"CANCELLED"),
 
  399 TEST_F(StatsPluginEnd2EndTest, RequestReceivedMessagesPerRpc) {
 
  401   View client_received_messages_per_rpc_view(
 
  403   View client_sent_messages_per_rpc_view(
 
  405   View server_received_messages_per_rpc_view(
 
  407   View server_sent_messages_per_rpc_view(
 
  414   for (
int i = 0; 
i < 
count; ++
i) {
 
  425         client_received_messages_per_rpc_view.GetData().distribution_data(),
 
  432         client_sent_messages_per_rpc_view.GetData().distribution_data(),
 
  439         server_received_messages_per_rpc_view.GetData().distribution_data(),
 
  446         server_sent_messages_per_rpc_view.GetData().distribution_data(),
 
  455 TEST_F(StatsPluginEnd2EndTest, TestRetryStatsWithoutAdditionalRetries) {
 
  457   View client_transparent_retries_cumulative_view(
 
  464   for (
int i = 0; 
i < 
count; ++
i) {
 
  474         client_retries_cumulative_view.GetData().int_data(),
 
  478         client_transparent_retries_cumulative_view.GetData().int_data(),
 
  482         client_retry_delay_per_call_view.GetData().distribution_data(),
 
  489 TEST_F(StatsPluginEnd2EndTest, TestRetryStatsWithAdditionalRetries) {
 
  491   View client_transparent_retries_cumulative_view(
 
  494   ChannelArguments 
args;
 
  497                  "  \"methodConfig\": [ {\n" 
  499                  "      { \"service\": \"grpc.testing.EchoTestService\" }\n" 
  501                  "    \"retryPolicy\": {\n" 
  502                  "      \"maxAttempts\": 3,\n" 
  503                  "      \"initialBackoff\": \"0.1s\",\n" 
  504                  "      \"maxBackoff\": \"120s\",\n" 
  505                  "      \"backoffMultiplier\": 1,\n" 
  506                  "      \"retryableStatusCodes\": [ \"ABORTED\" ]\n" 
  514   request.mutable_param()->mutable_expected_error()->set_code(
 
  519   for (
int i = 0; 
i < 
count; ++
i) {
 
  527     EXPECT_THAT(client_retries_cumulative_view.GetData().int_data(),
 
  532         client_transparent_retries_cumulative_view.GetData().int_data(),
 
  535     auto data = client_retry_delay_per_call_view.GetData().distribution_data();
 
  536     for (
const auto& entry : 
data) {
 
  538               entry.second.mean());
 
  542         client_retry_delay_per_call_view.GetData().distribution_data(),
 
  552 TEST_F(StatsPluginEnd2EndTest, TestApplicationCensusContextFlows) {
 
  563                       app_census_context.Span().context().trace_id().ToHex());
 
  572 int main(
int argc, 
char** argv) {