diff --git a/book/api/metrics-generated.md b/book/api/metrics-generated.md
index 81c8ebe9e68..23885d86449 100644
--- a/book/api/metrics-generated.md
+++ b/book/api/metrics-generated.md
@@ -125,6 +125,7 @@
| quic_pkt_oversz | `counter` | Number of QUIC packets dropped due to being too large. |
| quic_pkt_verneg | `counter` | Number of QUIC version negotiation packets received. |
| quic_retry_sent | `counter` | Number of QUIC Retry packets sent. |
+| quic_pkt_retransmissions | `counter` | Number of QUIC packets that retransmitted. |
## Bundle Tile
| Metric | Type | Description |
diff --git a/src/disco/metrics/generated/fd_metrics_quic.c b/src/disco/metrics/generated/fd_metrics_quic.c
index eba4df8a6ce..cd0fe61dbd2 100644
--- a/src/disco/metrics/generated/fd_metrics_quic.c
+++ b/src/disco/metrics/generated/fd_metrics_quic.c
@@ -78,4 +78,5 @@ const fd_metrics_meta_t FD_METRICS_QUIC[FD_METRICS_QUIC_TOTAL] = {
DECLARE_METRIC( QUIC_PKT_OVERSZ, COUNTER ),
DECLARE_METRIC( QUIC_PKT_VERNEG, COUNTER ),
DECLARE_METRIC( QUIC_RETRY_SENT, COUNTER ),
+ DECLARE_METRIC( QUIC_PKT_RETRANSMISSIONS, COUNTER ),
};
diff --git a/src/disco/metrics/generated/fd_metrics_quic.h b/src/disco/metrics/generated/fd_metrics_quic.h
index 37107cef90c..987520b71bf 100644
--- a/src/disco/metrics/generated/fd_metrics_quic.h
+++ b/src/disco/metrics/generated/fd_metrics_quic.h
@@ -313,5 +313,11 @@
#define FD_METRICS_COUNTER_QUIC_RETRY_SENT_DESC "Number of QUIC Retry packets sent."
#define FD_METRICS_COUNTER_QUIC_RETRY_SENT_CVT (FD_METRICS_CONVERTER_NONE)
-#define FD_METRICS_QUIC_TOTAL (76UL)
+#define FD_METRICS_COUNTER_QUIC_PKT_RETRANSMISSIONS_OFF (124UL)
+#define FD_METRICS_COUNTER_QUIC_PKT_RETRANSMISSIONS_NAME "quic_pkt_retransmissions"
+#define FD_METRICS_COUNTER_QUIC_PKT_RETRANSMISSIONS_TYPE (FD_METRICS_TYPE_COUNTER)
+#define FD_METRICS_COUNTER_QUIC_PKT_RETRANSMISSIONS_DESC "Number of QUIC packets that retransmitted."
+#define FD_METRICS_COUNTER_QUIC_PKT_RETRANSMISSIONS_CVT (FD_METRICS_CONVERTER_NONE)
+
+#define FD_METRICS_QUIC_TOTAL (77UL)
extern const fd_metrics_meta_t FD_METRICS_QUIC[FD_METRICS_QUIC_TOTAL];
diff --git a/src/disco/metrics/metrics.xml b/src/disco/metrics/metrics.xml
index aaf73329b32..95420e027be 100644
--- a/src/disco/metrics/metrics.xml
+++ b/src/disco/metrics/metrics.xml
@@ -176,6 +176,7 @@ metric introduced.
+
diff --git a/src/disco/quic/fd_quic_tile.c b/src/disco/quic/fd_quic_tile.c
index b414540657d..8cc0a92b661 100644
--- a/src/disco/quic/fd_quic_tile.c
+++ b/src/disco/quic/fd_quic_tile.c
@@ -157,6 +157,7 @@ metrics_write( fd_quic_ctx_t * ctx ) {
FD_MCNT_SET( QUIC, PKT_UNDERSZ, ctx->quic->metrics.pkt_undersz_cnt );
FD_MCNT_SET( QUIC, PKT_OVERSZ, ctx->quic->metrics.pkt_oversz_cnt );
FD_MCNT_SET( QUIC, PKT_VERNEG, ctx->quic->metrics.pkt_verneg_cnt );
+ FD_MCNT_SET( QUIC, PKT_META_RETRY, ctx->quic->metrics.pkt_meta_retry_cnt );
FD_MCNT_SET( QUIC, HANDSHAKES_CREATED, ctx->quic->metrics.hs_created_cnt );
FD_MCNT_SET( QUIC, HANDSHAKE_ERROR_ALLOC_FAIL, ctx->quic->metrics.hs_err_alloc_fail_cnt );
diff --git a/src/disco/quic/test_quic_metrics.txt b/src/disco/quic/test_quic_metrics.txt
index edf2d9bda70..5601c245b8e 100644
--- a/src/disco/quic/test_quic_metrics.txt
+++ b/src/disco/quic/test_quic_metrics.txt
@@ -236,3 +236,7 @@ quic_pkt_verneg{kind="quic",kind_id="0"} 122
# HELP quic_retry_sent Number of QUIC Retry packets sent.
# TYPE quic_retry_sent counter
quic_retry_sent{kind="quic",kind_id="0"} 123
+
+# HELP quic_pkt_retransmissions Number of QUIC packets that retransmitted.
+# TYPE quic_pkt_retransmissions counter
+quic_pkt_retransmissions{kind="quic",kind_id="0"} 124
diff --git a/src/waltz/quic/fd_quic.c b/src/waltz/quic/fd_quic.c
index 9805a373d55..0e371674bf9 100644
--- a/src/waltz/quic/fd_quic.c
+++ b/src/waltz/quic/fd_quic.c
@@ -3232,6 +3232,7 @@ fd_quic_gen_handshake_done_frame( fd_quic_conn_t * conn,
uchar * payload_end,
fd_quic_pkt_meta_t * pkt_meta,
ulong now ) {
+ FD_DTRACE_PROBE_1( quic_gen_handshake_done_frame, conn->our_conn_id );
if( conn->handshake_done_send==0 ) return 0UL;
conn->handshake_done_send = 0;
if( FD_UNLIKELY( conn->handshake_done_ackd ) ) return 0UL;
@@ -3673,6 +3674,7 @@ fd_quic_conn_tx( fd_quic_t * quic,
hdr_sz = fd_quic_encode_initial( cur_ptr, cur_sz, &initial );
hdr_len_field = cur_ptr + hdr_sz - 6; /* 2 byte len, 4 byte packet number */
+ FD_DTRACE_PROBE_2( quic_encode_initial, initial.src_conn_id, initial.dst_conn_id );
break;
}
@@ -3694,6 +3696,7 @@ fd_quic_conn_tx( fd_quic_t * quic,
hdr_sz = fd_quic_encode_handshake( cur_ptr, cur_sz, &handshake );
hdr_len_field = cur_ptr + hdr_sz - 6; /* 2 byte len, 4 byte packet number */
+ FD_DTRACE_PROBE_2( quic_encode_handshake, handshake.src_conn_id, handshake.dst_conn_id );
break;
}
@@ -3709,6 +3712,7 @@ fd_quic_conn_tx( fd_quic_t * quic,
one_rtt.pkt_num = pkt_number;
hdr_sz = fd_quic_encode_one_rtt( cur_ptr, cur_sz, &one_rtt );
+ FD_DTRACE_PROBE_2( quic_encode_one_rtt, one_rtt.dst_conn_id, one_rtt.pkt_num );
break;
}
@@ -4514,6 +4518,10 @@ fd_quic_pkt_meta_retry( fd_quic_t * quic,
continue;
}
+ quic->metrics.pkt_meta_retry_cnt++;
+
+ FD_DTRACE_PROBE_4( quic_pkt_meta_retry, conn->our_conn_id, pkt_meta->pkt_number, pkt_meta->expiry, pkt_meta->flags);
+
/* set the data to retry */
uint flags = pkt_meta->flags;
if( flags & FD_QUIC_PKT_META_FLAGS_HS_DATA ) {
diff --git a/src/waltz/quic/fd_quic.h b/src/waltz/quic/fd_quic.h
index 04e9510f0e2..758881495bb 100644
--- a/src/waltz/quic/fd_quic.h
+++ b/src/waltz/quic/fd_quic.h
@@ -324,6 +324,7 @@ union fd_quic_metrics {
ulong pkt_no_conn_cnt; /* number of packets with unknown conn ID (excl. Initial) */
ulong pkt_tx_alloc_fail_cnt; /* number of pkt_meta alloc fails */
ulong pkt_verneg_cnt; /* number of QUIC version negotiation packets or packets with wrong version */
+ ulong pkt_meta_retry_cnt; /* number of pkt_meta retries */
/* Frame metrics */
ulong frame_rx_cnt[ 22 ]; /* number of frames received (indexed by implementation-defined IDs) */