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