]> git.feebdaed.xyz Git - 0xmirror/grpc.git/commitdiff
Define TCP Metrics Domain
authorAananth V <aananthv@google.com>
Tue, 2 Dec 2025 04:00:07 +0000 (20:00 -0800)
committerCopybara-Service <copybara-worker@google.com>
Tue, 2 Dec 2025 04:02:49 +0000 (20:02 -0800)
PiperOrigin-RevId: 839039889

src/core/BUILD
src/core/lib/event_engine/tcp_telemetry.h [new file with mode: 0644]

index 2850be74c8dd977811a304bd29facdd8fdb5e75f..a568329f6538eb6049ce9542592a0d1b4dcf016d 100644 (file)
@@ -238,6 +238,17 @@ grpc_cc_library(
     ],
 )
 
+grpc_cc_library(
+    name = "tcp_telemetry",
+    hdrs = [
+        "lib/event_engine/tcp_telemetry.h",
+    ],
+    deps = [
+        "histogram",
+        "instrument",
+    ],
+)
+
 grpc_cc_library(
     name = "transport_framing_endpoint_extension",
     hdrs = [
diff --git a/src/core/lib/event_engine/tcp_telemetry.h b/src/core/lib/event_engine/tcp_telemetry.h
new file mode 100644 (file)
index 0000000..dc62e87
--- /dev/null
@@ -0,0 +1,126 @@
+// Copyright 2025 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_TCP_TELEMETRY_H
+#define GRPC_SRC_CORE_LIB_EVENT_ENGINE_TCP_TELEMETRY_H
+
+#include <cstdint>
+
+#include "src/core/telemetry/histogram.h"
+#include "src/core/telemetry/instrument.h"
+
+namespace grpc_core {
+
+class TcpTelemetryDomain final : public InstrumentDomain<TcpTelemetryDomain> {
+ public:
+  using Backend = HighContentionBackend;
+  static constexpr absl::string_view kName = "tcp_connection_metrics";
+  static constexpr auto kLabels = Labels(
+      "network.local.address", "network.local.port", "network.remote.address",
+      "network.remote.port", "is_control_endpoint");
+
+  static inline const auto kMinRtt =
+      RegisterHistogram<ExponentialHistogramShape>(
+          "min_rtt", "Minimum round trip time of a connection in microseconds",
+          "{us}", 1 << 24, 100);  // Max bucket is 16 seconds.
+  static inline const auto kDeliveryRate =
+      RegisterHistogram<ExponentialHistogramShape>(
+          "delivery_rate",
+          "TCP's most recent measure of the connection's "
+          "\"non-app-limited\" throughput.",
+          "By/s", int64_t{1} << 34, 100);  // Max bucket is 16 GiB/s.
+  static inline const auto kPacketsSent = RegisterCounter(
+      "packets_sent",
+      "Total packets sent by TCP including retransmissions and spurious "
+      "retransmissions.",
+      "{packet}");
+  static inline const auto kPacketsRetransmitted = RegisterCounter(
+      "packets_retransmitted",
+      "Total packets sent by TCP except those sent for the first time.",
+      "{packet}");
+  static inline const auto kPacketsSpuriousRetransmitted = RegisterCounter(
+      "packets_spurious_retransmitted",
+      "Total packets retransmitted by TCP that were later found to be "
+      "unnecessary.",
+      "{packet}");
+  static inline const auto kRecurringRetransmits = RegisterCounter(
+      "recurring_retransmits",
+      "The number of times the latest TCP packet was retransmitted due to "
+      "expiration of TCP retransmission timer (RTO), and not acknowledged at "
+      "the time the connection was closed.",
+      "{packet}");
+  static inline const auto kBytesSent = RegisterCounter(
+      "bytes_sent",
+      "Total bytes sent by TCP including retransmissions and spurious "
+      "retransmissions.",
+      "By");
+  static inline const auto kBytesRetransmitted = RegisterCounter(
+      "bytes_retransmitted",
+      "Total bytes sent by TCP except those sent for the first time.", "By");
+  static inline const auto kConnectionCount = RegisterUpDownCounter(
+      "connection_count", "Number of active TCP connections.", "{connection}");
+  static inline const auto kSyscallWrites = RegisterCounter(
+      "syscall_writes",
+      "The number of times we invoked the sendmsg (or sendmmsg) syscall and "
+      "wrote data to the TCP socket.",
+      "{syscall}");
+  static inline const auto kWriteSize =
+      RegisterHistogram<ExponentialHistogramShape>(
+          "write_size", "The number of bytes offered to each syscall_write.",
+          "By", 8 << 20, 20);
+  static inline const auto kSyscallReads = RegisterCounter(
+      "syscall_reads",
+      "The number of times we invoked the recvmsg (or recvmmsg or zero copy "
+      "getsockopt) syscall and read data from the TCP socket.",
+      "{syscall}");
+  static inline const auto kReadSize =
+      RegisterHistogram<ExponentialHistogramShape>(
+          "read_size", "The number of bytes received by each syscall_read.",
+          "By", 8 << 20, 20);
+  static inline const auto kSenderLatency =
+      RegisterHistogram<ExponentialHistogramShape>(
+          "sender_latency",
+          "Time taken by the TCP socket to write the first byte of a write "
+          "onto the NIC.",
+          "us", 1e6, 20);
+  static inline const auto kTransferLatency1k =
+      RegisterHistogram<ExponentialHistogramShape>(
+          "transfer_latency_1k",
+          "Time taken to transmit the first 1024 bytes of a write.", "us", 1e6,
+          20);
+  static inline const auto kTransferLatency8k =
+      RegisterHistogram<ExponentialHistogramShape>(
+          "transfer_latency_8k",
+          "Time taken to transmit the first 8196 bytes of a write.", "us", 1e6,
+          20);
+  static inline const auto kTransferLatency64k =
+      RegisterHistogram<ExponentialHistogramShape>(
+          "transfer_latency_64k",
+          "Time taken to transmit the first 65536 bytes of a write.", "us", 1e6,
+          20);
+  static inline const auto kTransferLatency256k =
+      RegisterHistogram<ExponentialHistogramShape>(
+          "transfer_latency_256k",
+          "Time taken to transmit the first 262144 bytes of a write.", "us",
+          1e6, 20);
+  static inline const auto kTransferLatency2m =
+      RegisterHistogram<ExponentialHistogramShape>(
+          "transfer_latency_2m",
+          "Time taken to transmit the first 2097152 bytes of a write.", "us",
+          1e6, 20);
+};
+
+};  // namespace grpc_core
+
+#endif  // GRPC_SRC_CORE_LIB_EVENT_ENGINE_TCP_TELEMETRY_H