From ae90b3ed01350d1d86338c23defd5f6583134e8f Mon Sep 17 00:00:00 2001 From: Nana Pang Date: Tue, 4 Jun 2024 12:54:47 -0700 Subject: [PATCH] [gRPC telemetry] Collect TCP connection metrics PiperOrigin-RevId: 640253901 --- BUILD | 2 + Package.swift | 1 + build_autogenerated.yaml | 4 ++ gRPC-C++.podspec | 2 + gRPC-Core.podspec | 2 + grpc.gemspec | 1 + package.xml | 1 + src/core/BUILD | 2 + .../chttp2/transport/chttp2_transport.cc | 17 ++++++++ .../lib/event_engine/extensions/tcp_trace.h | 43 +++++++++++++++++++ tools/doxygen/Doxyfile.c++.internal | 1 + tools/doxygen/Doxyfile.core.internal | 1 + 12 files changed, 77 insertions(+) create mode 100644 src/core/lib/event_engine/extensions/tcp_trace.h diff --git a/BUILD b/BUILD index 8b695a1c5e4..887a2c2a6c1 100644 --- a/BUILD +++ b/BUILD @@ -4818,6 +4818,8 @@ grpc_cc_library( "//src/core:connectivity_state", "//src/core:error", "//src/core:error_utils", + "//src/core:event_engine_extensions", + "//src/core:event_engine_query_extensions", "//src/core:experiments", "//src/core:gpr_manual_constructor", "//src/core:http2_errors", diff --git a/Package.swift b/Package.swift index bfc9312d1fe..ae298621153 100644 --- a/Package.swift +++ b/Package.swift @@ -1148,6 +1148,7 @@ let package = Package( "src/core/lib/event_engine/extensions/can_track_errors.h", "src/core/lib/event_engine/extensions/chaotic_good_extension.h", "src/core/lib/event_engine/extensions/supports_fd.h", + "src/core/lib/event_engine/extensions/tcp_trace.h", "src/core/lib/event_engine/forkable.cc", "src/core/lib/event_engine/forkable.h", "src/core/lib/event_engine/grpc_polled_fd.h", diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index 198ee0d8fae..36fba504a47 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -823,6 +823,7 @@ libs: - src/core/lib/event_engine/extensions/can_track_errors.h - src/core/lib/event_engine/extensions/chaotic_good_extension.h - src/core/lib/event_engine/extensions/supports_fd.h + - src/core/lib/event_engine/extensions/tcp_trace.h - src/core/lib/event_engine/forkable.h - src/core/lib/event_engine/grpc_polled_fd.h - src/core/lib/event_engine/handle_containers.h @@ -2366,6 +2367,7 @@ libs: - src/core/lib/event_engine/extensions/can_track_errors.h - src/core/lib/event_engine/extensions/chaotic_good_extension.h - src/core/lib/event_engine/extensions/supports_fd.h + - src/core/lib/event_engine/extensions/tcp_trace.h - src/core/lib/event_engine/forkable.h - src/core/lib/event_engine/grpc_polled_fd.h - src/core/lib/event_engine/handle_containers.h @@ -4458,6 +4460,7 @@ libs: - src/core/lib/event_engine/extensions/can_track_errors.h - src/core/lib/event_engine/extensions/chaotic_good_extension.h - src/core/lib/event_engine/extensions/supports_fd.h + - src/core/lib/event_engine/extensions/tcp_trace.h - src/core/lib/event_engine/forkable.h - src/core/lib/event_engine/grpc_polled_fd.h - src/core/lib/event_engine/handle_containers.h @@ -11705,6 +11708,7 @@ targets: - src/core/lib/event_engine/extensions/can_track_errors.h - src/core/lib/event_engine/extensions/chaotic_good_extension.h - src/core/lib/event_engine/extensions/supports_fd.h + - src/core/lib/event_engine/extensions/tcp_trace.h - src/core/lib/event_engine/forkable.h - src/core/lib/event_engine/grpc_polled_fd.h - src/core/lib/event_engine/handle_containers.h diff --git a/gRPC-C++.podspec b/gRPC-C++.podspec index bd16e5d387e..be82baae8c5 100644 --- a/gRPC-C++.podspec +++ b/gRPC-C++.podspec @@ -904,6 +904,7 @@ Pod::Spec.new do |s| 'src/core/lib/event_engine/extensions/can_track_errors.h', 'src/core/lib/event_engine/extensions/chaotic_good_extension.h', 'src/core/lib/event_engine/extensions/supports_fd.h', + 'src/core/lib/event_engine/extensions/tcp_trace.h', 'src/core/lib/event_engine/forkable.h', 'src/core/lib/event_engine/grpc_polled_fd.h', 'src/core/lib/event_engine/handle_containers.h', @@ -2177,6 +2178,7 @@ Pod::Spec.new do |s| 'src/core/lib/event_engine/extensions/can_track_errors.h', 'src/core/lib/event_engine/extensions/chaotic_good_extension.h', 'src/core/lib/event_engine/extensions/supports_fd.h', + 'src/core/lib/event_engine/extensions/tcp_trace.h', 'src/core/lib/event_engine/forkable.h', 'src/core/lib/event_engine/grpc_polled_fd.h', 'src/core/lib/event_engine/handle_containers.h', diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index c71dbf7fdae..274bcb13549 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -1267,6 +1267,7 @@ Pod::Spec.new do |s| 'src/core/lib/event_engine/extensions/can_track_errors.h', 'src/core/lib/event_engine/extensions/chaotic_good_extension.h', 'src/core/lib/event_engine/extensions/supports_fd.h', + 'src/core/lib/event_engine/extensions/tcp_trace.h', 'src/core/lib/event_engine/forkable.cc', 'src/core/lib/event_engine/forkable.h', 'src/core/lib/event_engine/grpc_polled_fd.h', @@ -2959,6 +2960,7 @@ Pod::Spec.new do |s| 'src/core/lib/event_engine/extensions/can_track_errors.h', 'src/core/lib/event_engine/extensions/chaotic_good_extension.h', 'src/core/lib/event_engine/extensions/supports_fd.h', + 'src/core/lib/event_engine/extensions/tcp_trace.h', 'src/core/lib/event_engine/forkable.h', 'src/core/lib/event_engine/grpc_polled_fd.h', 'src/core/lib/event_engine/handle_containers.h', diff --git a/grpc.gemspec b/grpc.gemspec index c7b08f484ba..8fcf9cb1dd8 100644 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -1154,6 +1154,7 @@ Gem::Specification.new do |s| s.files += %w( src/core/lib/event_engine/extensions/can_track_errors.h ) s.files += %w( src/core/lib/event_engine/extensions/chaotic_good_extension.h ) s.files += %w( src/core/lib/event_engine/extensions/supports_fd.h ) + s.files += %w( src/core/lib/event_engine/extensions/tcp_trace.h ) s.files += %w( src/core/lib/event_engine/forkable.cc ) s.files += %w( src/core/lib/event_engine/forkable.h ) s.files += %w( src/core/lib/event_engine/grpc_polled_fd.h ) diff --git a/package.xml b/package.xml index 6c86c1b4769..67b371367cd 100644 --- a/package.xml +++ b/package.xml @@ -1136,6 +1136,7 @@ + diff --git a/src/core/BUILD b/src/core/BUILD index e23dec8b9b3..79359edb982 100644 --- a/src/core/BUILD +++ b/src/core/BUILD @@ -80,6 +80,7 @@ grpc_cc_library( "lib/event_engine/extensions/can_track_errors.h", "lib/event_engine/extensions/chaotic_good_extension.h", "lib/event_engine/extensions/supports_fd.h", + "lib/event_engine/extensions/tcp_trace.h", ], external_deps = [ "absl/status:statusor", @@ -90,6 +91,7 @@ grpc_cc_library( ":memory_quota", "//:event_engine_base_hdrs", "//:gpr_platform", + "//:tcp_tracer", ], ) diff --git a/src/core/ext/transport/chttp2/transport/chttp2_transport.cc b/src/core/ext/transport/chttp2/transport/chttp2_transport.cc index 3557eaef427..27d4a54d7bd 100644 --- a/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +++ b/src/core/ext/transport/chttp2/transport/chttp2_transport.cc @@ -75,6 +75,8 @@ #include "src/core/ext/transport/chttp2/transport/write_size_policy.h" #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/config/config_vars.h" +#include "src/core/lib/event_engine/extensions/tcp_trace.h" +#include "src/core/lib/event_engine/query_extensions.h" #include "src/core/lib/experiments/experiments.h" #include "src/core/lib/gprpp/bitset.h" #include "src/core/lib/gprpp/crash.h" @@ -85,6 +87,7 @@ #include "src/core/lib/iomgr/combiner.h" #include "src/core/lib/iomgr/error.h" #include "src/core/lib/iomgr/ev_posix.h" +#include "src/core/lib/iomgr/event_engine_shims/endpoint.h" #include "src/core/lib/iomgr/exec_ctx.h" #include "src/core/lib/iomgr/iomgr_fwd.h" #include "src/core/lib/iomgr/port.h" @@ -585,6 +588,9 @@ static void init_keepalive_pings_if_enabled_locked( } } +using grpc_event_engine::experimental::QueryExtension; +using grpc_event_engine::experimental::TcpTraceExtension; + grpc_chttp2_transport::grpc_chttp2_transport( const grpc_core::ChannelArgs& channel_args, grpc_endpoint* ep, bool is_client) @@ -612,6 +618,17 @@ grpc_chttp2_transport::grpc_chttp2_transport( deframe_state(is_client ? GRPC_DTS_FH_0 : GRPC_DTS_CLIENT_PREFIX_0), is_client(is_client) { context_list = new grpc_core::ContextList(); + + if (channel_args.GetBool(GRPC_ARG_TCP_TRACING_ENABLED).value_or(false) && + grpc_event_engine::experimental::grpc_is_event_engine_endpoint(ep)) { + auto epte = QueryExtension( + grpc_event_engine::experimental::grpc_get_wrapped_event_engine_endpoint( + ep)); + if (epte != nullptr) { + epte->InitializeAndReturnTcpTracer(); + } + } + CHECK(strlen(GRPC_CHTTP2_CLIENT_CONNECT_STRING) == GRPC_CHTTP2_CLIENT_CONNECT_STRLEN); diff --git a/src/core/lib/event_engine/extensions/tcp_trace.h b/src/core/lib/event_engine/extensions/tcp_trace.h new file mode 100644 index 00000000000..e5d66a45860 --- /dev/null +++ b/src/core/lib/event_engine/extensions/tcp_trace.h @@ -0,0 +1,43 @@ +// Copyright 2024 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef GRPC_SRC_CORE_LIB_EVENT_ENGINE_EXTENSIONS_TCP_TRACE_H +#define GRPC_SRC_CORE_LIB_EVENT_ENGINE_EXTENSIONS_TCP_TRACE_H + +#include + +#include "absl/strings/string_view.h" + +#include "src/core/telemetry/tcp_tracer.h" + +namespace grpc_event_engine { +namespace experimental { + +/** If non-zero, enable TCP tracing and stats collection. */ +#define GRPC_ARG_TCP_TRACING_ENABLED "grpc.tcp_tracing_enabled" + +class TcpTraceExtension { + public: + virtual ~TcpTraceExtension() = default; + static absl::string_view EndpointExtensionName() { + return "io.grpc.event_engine.extension.tcp_trace"; + } + virtual std::shared_ptr + InitializeAndReturnTcpTracer() = 0; +}; + +} // namespace experimental +} // namespace grpc_event_engine + +#endif // GRPC_SRC_CORE_LIB_EVENT_ENGINE_EXTENSIONS_TCP_TRACE_H diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index 405c36cf92d..e5f91a13df7 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -2153,6 +2153,7 @@ src/core/lib/event_engine/event_engine_context.h \ src/core/lib/event_engine/extensions/can_track_errors.h \ src/core/lib/event_engine/extensions/chaotic_good_extension.h \ src/core/lib/event_engine/extensions/supports_fd.h \ +src/core/lib/event_engine/extensions/tcp_trace.h \ src/core/lib/event_engine/forkable.cc \ src/core/lib/event_engine/forkable.h \ src/core/lib/event_engine/grpc_polled_fd.h \ diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index 3506439e7e9..45e1972e038 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -1925,6 +1925,7 @@ src/core/lib/event_engine/event_engine_context.h \ src/core/lib/event_engine/extensions/can_track_errors.h \ src/core/lib/event_engine/extensions/chaotic_good_extension.h \ src/core/lib/event_engine/extensions/supports_fd.h \ +src/core/lib/event_engine/extensions/tcp_trace.h \ src/core/lib/event_engine/forkable.cc \ src/core/lib/event_engine/forkable.h \ src/core/lib/event_engine/grpc_polled_fd.h \