xref: /aosp_15_r20/external/grpc-grpc/src/cpp/ext/otel/otel_server_call_tracer.h (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
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 #ifndef GRPC_SRC_CPP_EXT_OTEL_OTEL_SERVER_CALL_TRACER_H
20 #define GRPC_SRC_CPP_EXT_OTEL_OTEL_SERVER_CALL_TRACER_H
21 
22 #include <grpc/support/port_platform.h>
23 
24 #include "absl/strings/strip.h"
25 
26 #include "src/core/lib/channel/call_tracer.h"
27 #include "src/core/lib/channel/channel_args.h"
28 #include "src/cpp/ext/otel/otel_plugin.h"
29 
30 namespace grpc {
31 namespace internal {
32 
33 // OpenTelemetryPlugin::ServerCallTracer implementation
34 
35 class OpenTelemetryPlugin::ServerCallTracer
36     : public grpc_core::ServerCallTracer {
37  public:
ServerCallTracer(OpenTelemetryPlugin * otel_plugin,std::shared_ptr<OpenTelemetryPlugin::ServerScopeConfig> scope_config)38   ServerCallTracer(
39       OpenTelemetryPlugin* otel_plugin,
40       std::shared_ptr<OpenTelemetryPlugin::ServerScopeConfig> scope_config)
41       : start_time_(absl::Now()),
42         injected_labels_from_plugin_options_(
43             otel_plugin->plugin_options().size()),
44         otel_plugin_(otel_plugin),
45         scope_config_(std::move(scope_config)) {}
46 
TraceId()47   std::string TraceId() override {
48     // Not implemented
49     return "";
50   }
51 
SpanId()52   std::string SpanId() override {
53     // Not implemented
54     return "";
55   }
56 
IsSampled()57   bool IsSampled() override {
58     // Not implemented
59     return false;
60   }
61 
62   // Please refer to `grpc_transport_stream_op_batch_payload` for details on
63   // arguments.
64   void RecordSendInitialMetadata(
65       grpc_metadata_batch* send_initial_metadata) override;
66 
67   void RecordSendTrailingMetadata(
68       grpc_metadata_batch* /*send_trailing_metadata*/) override;
69 
RecordSendMessage(const grpc_core::SliceBuffer & send_message)70   void RecordSendMessage(const grpc_core::SliceBuffer& send_message) override {
71     RecordAnnotation(
72         absl::StrFormat("Send message: %ld bytes", send_message.Length()));
73   }
RecordSendCompressedMessage(const grpc_core::SliceBuffer & send_compressed_message)74   void RecordSendCompressedMessage(
75       const grpc_core::SliceBuffer& send_compressed_message) override {
76     RecordAnnotation(absl::StrFormat("Send compressed message: %ld bytes",
77                                      send_compressed_message.Length()));
78   }
79 
80   void RecordReceivedInitialMetadata(
81       grpc_metadata_batch* recv_initial_metadata) override;
82 
RecordReceivedMessage(const grpc_core::SliceBuffer & recv_message)83   void RecordReceivedMessage(
84       const grpc_core::SliceBuffer& recv_message) override {
85     RecordAnnotation(
86         absl::StrFormat("Received message: %ld bytes", recv_message.Length()));
87   }
RecordReceivedDecompressedMessage(const grpc_core::SliceBuffer & recv_decompressed_message)88   void RecordReceivedDecompressedMessage(
89       const grpc_core::SliceBuffer& recv_decompressed_message) override {
90     RecordAnnotation(absl::StrFormat("Received decompressed message: %ld bytes",
91                                      recv_decompressed_message.Length()));
92   }
93 
RecordReceivedTrailingMetadata(grpc_metadata_batch *)94   void RecordReceivedTrailingMetadata(
95       grpc_metadata_batch* /*recv_trailing_metadata*/) override {}
96 
RecordCancel(grpc_error_handle)97   void RecordCancel(grpc_error_handle /*cancel_error*/) override {
98     elapsed_time_ = absl::Now() - start_time_;
99   }
100 
101   void RecordEnd(const grpc_call_final_info* final_info) override;
102 
RecordAnnotation(absl::string_view)103   void RecordAnnotation(absl::string_view /*annotation*/) override {
104     // Not implemented
105   }
106 
RecordAnnotation(const Annotation &)107   void RecordAnnotation(const Annotation& /*annotation*/) override {
108     // Not implemented
109   }
StartNewTcpTrace()110   std::shared_ptr<grpc_core::TcpTracerInterface> StartNewTcpTrace() override {
111     // No TCP trace.
112     return nullptr;
113   }
114 
115  private:
MethodForStats()116   absl::string_view MethodForStats() const {
117     absl::string_view method = absl::StripPrefix(path_.as_string_view(), "/");
118     if (registered_method_ ||
119         (otel_plugin_->generic_method_attribute_filter() != nullptr &&
120          otel_plugin_->generic_method_attribute_filter()(method))) {
121       return method;
122     }
123     return "other";
124   }
125 
126   absl::Time start_time_;
127   absl::Duration elapsed_time_;
128   grpc_core::Slice path_;
129   bool registered_method_;
130   std::vector<std::unique_ptr<LabelsIterable>>
131       injected_labels_from_plugin_options_;
132   OpenTelemetryPlugin* otel_plugin_;
133   std::shared_ptr<OpenTelemetryPlugin::ServerScopeConfig> scope_config_;
134 };
135 
136 }  // namespace internal
137 }  // namespace grpc
138 
139 #endif  // GRPC_SRC_CPP_EXT_OTEL_OTEL_SERVER_CALL_TRACER_H
140