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