• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 //
3 // Copyright 2023 gRPC authors.
4 //
5 // Licensed under the Apache License, Version 2.0 (the "License");
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 //     http://www.apache.org/licenses/LICENSE-2.0
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16 //
17 //
18 
19 #include "src/core/telemetry/call_tracer.h"
20 
21 #include <grpc/event_engine/memory_allocator.h>
22 #include <grpc/grpc.h>
23 
24 #include <vector>
25 
26 #include "gtest/gtest.h"
27 #include "src/core/lib/promise/context.h"
28 #include "src/core/lib/resource_quota/memory_quota.h"
29 #include "src/core/lib/resource_quota/resource_quota.h"
30 #include "src/core/util/ref_counted_ptr.h"
31 #include "test/core/test_util/fake_stats_plugin.h"
32 #include "test/core/test_util/test_config.h"
33 
34 namespace grpc_core {
35 namespace {
36 
37 class CallTracerTest : public ::testing::Test {
38  protected:
39   RefCountedPtr<Arena> arena_ = SimpleArenaAllocator()->MakeArena();
40   std::vector<std::string> annotation_logger_;
41 };
42 
TEST_F(CallTracerTest,BasicClientCallTracer)43 TEST_F(CallTracerTest, BasicClientCallTracer) {
44   FakeClientCallTracer client_call_tracer(&annotation_logger_);
45   AddClientCallTracerToContext(arena_.get(), &client_call_tracer);
46   arena_->GetContext<CallTracerAnnotationInterface>()->RecordAnnotation("Test");
47   EXPECT_EQ(annotation_logger_, std::vector<std::string>{"Test"});
48 }
49 
TEST_F(CallTracerTest,MultipleClientCallTracers)50 TEST_F(CallTracerTest, MultipleClientCallTracers) {
51   promise_detail::Context<Arena> arena_ctx(arena_.get());
52   FakeClientCallTracer client_call_tracer1(&annotation_logger_);
53   FakeClientCallTracer client_call_tracer2(&annotation_logger_);
54   FakeClientCallTracer client_call_tracer3(&annotation_logger_);
55   AddClientCallTracerToContext(arena_.get(), &client_call_tracer1);
56   AddClientCallTracerToContext(arena_.get(), &client_call_tracer2);
57   AddClientCallTracerToContext(arena_.get(), &client_call_tracer3);
58   arena_->GetContext<CallTracerAnnotationInterface>()->RecordAnnotation("Test");
59   EXPECT_EQ(annotation_logger_,
60             std::vector<std::string>({"Test", "Test", "Test"}));
61 }
62 
TEST_F(CallTracerTest,MultipleClientCallAttemptTracers)63 TEST_F(CallTracerTest, MultipleClientCallAttemptTracers) {
64   promise_detail::Context<Arena> arena_ctx(arena_.get());
65   FakeClientCallTracer client_call_tracer1(&annotation_logger_);
66   FakeClientCallTracer client_call_tracer2(&annotation_logger_);
67   FakeClientCallTracer client_call_tracer3(&annotation_logger_);
68   AddClientCallTracerToContext(arena_.get(), &client_call_tracer1);
69   AddClientCallTracerToContext(arena_.get(), &client_call_tracer2);
70   AddClientCallTracerToContext(arena_.get(), &client_call_tracer3);
71   auto* attempt_tracer =
72       DownCast<ClientCallTracer*>(
73           arena_->GetContext<CallTracerAnnotationInterface>())
74           ->StartNewAttempt(true /* is_transparent_retry */);
75   attempt_tracer->RecordAnnotation("Test");
76   EXPECT_EQ(annotation_logger_,
77             std::vector<std::string>({"Test", "Test", "Test"}));
78   attempt_tracer->RecordEnd(gpr_timespec());
79 }
80 
TEST_F(CallTracerTest,BasicServerCallTracerTest)81 TEST_F(CallTracerTest, BasicServerCallTracerTest) {
82   FakeServerCallTracer server_call_tracer(&annotation_logger_);
83   AddServerCallTracerToContext(arena_.get(), &server_call_tracer);
84   arena_->GetContext<CallTracerAnnotationInterface>()->RecordAnnotation("Test");
85   arena_->GetContext<CallTracerAnnotationInterface>()->RecordAnnotation("Test");
86   EXPECT_EQ(annotation_logger_, std::vector<std::string>({"Test", "Test"}));
87 }
88 
TEST_F(CallTracerTest,MultipleServerCallTracers)89 TEST_F(CallTracerTest, MultipleServerCallTracers) {
90   promise_detail::Context<Arena> arena_ctx(arena_.get());
91   FakeServerCallTracer server_call_tracer1(&annotation_logger_);
92   FakeServerCallTracer server_call_tracer2(&annotation_logger_);
93   FakeServerCallTracer server_call_tracer3(&annotation_logger_);
94   AddServerCallTracerToContext(arena_.get(), &server_call_tracer1);
95   AddServerCallTracerToContext(arena_.get(), &server_call_tracer2);
96   AddServerCallTracerToContext(arena_.get(), &server_call_tracer3);
97   arena_->GetContext<CallTracerAnnotationInterface>()->RecordAnnotation("Test");
98   EXPECT_EQ(annotation_logger_,
99             std::vector<std::string>({"Test", "Test", "Test"}));
100 }
101 
102 }  // namespace
103 }  // namespace grpc_core
104 
main(int argc,char ** argv)105 int main(int argc, char** argv) {
106   ::testing::InitGoogleTest(&argc, argv);
107   grpc::testing::TestEnvironment env(&argc, argv);
108   grpc_init();
109   auto r = RUN_ALL_TESTS();
110   grpc_shutdown();
111   return r;
112 }
113