Skip to content

Commit

Permalink
[export]
Browse files Browse the repository at this point in the history
[gRPC telemetry] Collect TCP connection metrics

----
DO NOT SUBMIT. This PR is for testing purposes only. [cl/616954448](http://cl/616954448)

PiperOrigin-RevId: 616954448
  • Loading branch information
nanahpang authored and Copybara-Service committed May 15, 2024
1 parent 05ae7fb commit 7406705
Show file tree
Hide file tree
Showing 21 changed files with 264 additions and 0 deletions.
2 changes: 2 additions & 0 deletions BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -4833,6 +4833,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",
Expand Down
4 changes: 4 additions & 0 deletions CMakeLists.txt

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Makefile

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions Package.swift

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions build_autogenerated.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions config.m4

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions config.w32

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions gRPC-C++.podspec

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions gRPC-Core.podspec

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions grpc.gemspec

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions include/grpc/impl/channel_arg_names.h
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,8 @@
"grpc.experimental.tcp_tx_zerocopy_max_simultaneous_sends"
/* Overrides the TCP socket recieve buffer size, SO_RCVBUF. */
#define GRPC_ARG_TCP_RECEIVE_BUFFER_SIZE "grpc.tcp_receive_buffer_size"
/** If non-zero, enable TCP tracing and stats collection. */
#define GRPC_ARG_TCP_TRACING_ENABLED "grpc.tcp_tracing_enabled"
/* Timeout in milliseconds to use for calls to the grpclb load balancer.
If 0 or unset, the balancer calls will have no deadline. */
#define GRPC_ARG_GRPCLB_CALL_TIMEOUT_MS "grpc.grpclb_call_timeout_ms"
Expand Down
2 changes: 2 additions & 0 deletions package.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 7 additions & 0 deletions src/core/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -76,20 +76,27 @@ grpc_cc_library(

grpc_cc_library(
name = "event_engine_extensions",
srcs = ["lib/event_engine/extensions/tcp_trace.cc"],
hdrs = [
"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",
"absl/functional:any_invocable",
"absl/strings",
"absl/time",
"absl/types:optional",
],
deps = [
":memory_quota",
":metrics",
"//:event_engine_base_hdrs",
"//:gpr",
"//:gpr_platform",
"//:tcp_tracer",
],
)

Expand Down
19 changes: 19 additions & 0 deletions src/core/ext/transport/chttp2/transport/chttp2_transport.cc
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,8 @@
#include "src/core/lib/channel/tcp_tracer.h"
#include "src/core/lib/debug/stats.h"
#include "src/core/lib/debug/stats_data.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/gpr/string.h"
#include "src/core/lib/gpr/useful.h"
Expand All @@ -91,6 +93,7 @@
#include "src/core/lib/http/parser.h"
#include "src/core/lib/iomgr/combiner.h"
#include "src/core/lib/iomgr/error.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"
Expand Down Expand Up @@ -591,6 +594,10 @@ static void init_keepalive_pings_if_enabled_locked(
}
}

using grpc_event_engine::experimental::Http2TransportTcpTracer;
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)
Expand Down Expand Up @@ -618,6 +625,18 @@ grpc_chttp2_transport::grpc_chttp2_transport(
deframe_state(is_client ? GRPC_DTS_FH_0 : GRPC_DTS_CLIENT_PREFIX_0),
is_client(is_client) {
cl = 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)) {
epte = QueryExtension<TcpTraceExtension>(
grpc_event_engine::experimental::grpc_get_wrapped_event_engine_endpoint(
ep));
if (epte != nullptr) {
tcp_tracer = std::make_shared<Http2TransportTcpTracer>();
epte->SetTcpTracer(tcp_tracer);
}
}

CHECK(strlen(GRPC_CHTTP2_CLIENT_CONNECT_STRING) ==
GRPC_CHTTP2_CLIENT_CONNECT_STRLEN);

Expand Down
5 changes: 5 additions & 0 deletions src/core/ext/transport/chttp2/transport/internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/channel/tcp_tracer.h"
#include "src/core/lib/debug/trace.h"
#include "src/core/lib/event_engine/extensions/tcp_trace.h"
#include "src/core/lib/gprpp/bitset.h"
#include "src/core/lib/gprpp/debug_location.h"
#include "src/core/lib/gprpp/ref_counted.h"
Expand Down Expand Up @@ -535,6 +536,10 @@ struct grpc_chttp2_transport final : public grpc_core::FilterStackTransport,
// What percentage of rst_stream frames on the server should cause a ping
// frame to be generated.
uint8_t ping_on_rst_stream_percent;

/// Only set when enabled.
grpc_event_engine::experimental::TcpTraceExtension* epte;
std::shared_ptr<grpc_core::TcpTracerInterface> tcp_tracer;
};

typedef enum {
Expand Down
2 changes: 2 additions & 0 deletions src/core/lib/channel/metrics.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@
namespace grpc_core {

constexpr absl::string_view kMetricLabelTarget = "grpc.target";
constexpr absl::string_view kMetricLabelPeerAddress = "grpc.tcp.peer_address";
constexpr absl::string_view kMetricLabelLocalAddress = "grpc.tcp.local_address";

// A global registry of instruments(metrics). This API is designed to be used
// to register instruments (Counter, Histogram, and Gauge) as part of program
Expand Down

0 comments on commit 7406705

Please sign in to comment.