Skip to main content

aws_smithy_runtime_api/client/connection/
establishment.rs

1/*
2 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3 * SPDX-License-Identifier: Apache-2.0
4 */
5
6use std::sync::Arc;
7use std::time::Duration;
8
9/// Measurements from one successful connection establishment.
10///
11/// The total and transport durations are available when an HTTP client exposes
12/// this value. Transport substages remain optional because a custom connector
13/// may expose only its aggregate connection work.
14#[derive(Clone, Debug, Eq, PartialEq)]
15#[non_exhaustive]
16pub struct ConnectionEstablishmentMetadata {
17    inner: Arc<ConnectionEstablishmentMetadataInner>,
18}
19
20#[derive(Debug, Eq, PartialEq)]
21struct ConnectionEstablishmentMetadataInner {
22    total_duration: Duration,
23    transport_duration: Duration,
24    protocol_handshake_duration: Option<Duration>,
25    dns_duration: Option<Duration>,
26    socket_connect_duration: Option<Duration>,
27    proxy_duration: Option<Duration>,
28    tls_duration: Option<Duration>,
29}
30
31impl ConnectionEstablishmentMetadata {
32    /// Creates a builder for successful establishment measurements.
33    pub fn builder() -> ConnectionEstablishmentMetadataBuilder {
34        ConnectionEstablishmentMetadataBuilder::new()
35    }
36
37    /// Returns elapsed time from establishment start until pool installation.
38    pub fn total_duration(&self) -> Duration {
39        self.inner.total_duration
40    }
41
42    /// Returns elapsed time spent in the configured transport connector.
43    pub fn transport_duration(&self) -> Duration {
44        self.inner.transport_duration
45    }
46
47    /// Returns elapsed time spent in the HTTP protocol handshake, when known.
48    pub fn protocol_handshake_duration(&self) -> Option<Duration> {
49        self.inner.protocol_handshake_duration
50    }
51
52    /// Returns elapsed time spent resolving DNS, when reported by the connector.
53    pub fn dns_duration(&self) -> Option<Duration> {
54        self.inner.dns_duration
55    }
56
57    /// Returns elapsed time spent establishing the selected socket, when reported.
58    pub fn socket_connect_duration(&self) -> Option<Duration> {
59        self.inner.socket_connect_duration
60    }
61
62    /// Returns elapsed time spent negotiating a proxy path, when reported.
63    pub fn proxy_duration(&self) -> Option<Duration> {
64        self.inner.proxy_duration
65    }
66
67    /// Returns elapsed time spent in TLS establishment, when reported.
68    pub fn tls_duration(&self) -> Option<Duration> {
69        self.inner.tls_duration
70    }
71}
72
73/// Builder for [`ConnectionEstablishmentMetadata`].
74#[derive(Clone, Debug, Default)]
75pub struct ConnectionEstablishmentMetadataBuilder {
76    total_duration: Option<Duration>,
77    transport_duration: Option<Duration>,
78    protocol_handshake_duration: Option<Duration>,
79    dns_duration: Option<Duration>,
80    socket_connect_duration: Option<Duration>,
81    proxy_duration: Option<Duration>,
82    tls_duration: Option<Duration>,
83}
84
85impl ConnectionEstablishmentMetadataBuilder {
86    /// Creates an empty builder.
87    pub fn new() -> Self {
88        Self::default()
89    }
90
91    /// Sets total elapsed establishment time.
92    pub fn total_duration(mut self, duration: Duration) -> Self {
93        self.set_total_duration(Some(duration));
94        self
95    }
96
97    /// Sets total elapsed establishment time.
98    pub fn set_total_duration(&mut self, duration: Option<Duration>) -> &mut Self {
99        self.total_duration = duration;
100        self
101    }
102
103    /// Sets aggregate transport-connector time.
104    pub fn transport_duration(mut self, duration: Duration) -> Self {
105        self.set_transport_duration(Some(duration));
106        self
107    }
108
109    /// Sets aggregate transport-connector time.
110    pub fn set_transport_duration(&mut self, duration: Option<Duration>) -> &mut Self {
111        self.transport_duration = duration;
112        self
113    }
114
115    /// Sets HTTP protocol-handshake time.
116    pub fn protocol_handshake_duration(mut self, duration: Duration) -> Self {
117        self.set_protocol_handshake_duration(Some(duration));
118        self
119    }
120
121    /// Sets HTTP protocol-handshake time.
122    pub fn set_protocol_handshake_duration(&mut self, duration: Option<Duration>) -> &mut Self {
123        self.protocol_handshake_duration = duration;
124        self
125    }
126
127    /// Sets DNS resolution time.
128    pub fn dns_duration(mut self, duration: Duration) -> Self {
129        self.set_dns_duration(Some(duration));
130        self
131    }
132
133    /// Sets DNS resolution time.
134    pub fn set_dns_duration(&mut self, duration: Option<Duration>) -> &mut Self {
135        self.dns_duration = duration;
136        self
137    }
138
139    /// Sets socket establishment time.
140    pub fn socket_connect_duration(mut self, duration: Duration) -> Self {
141        self.set_socket_connect_duration(Some(duration));
142        self
143    }
144
145    /// Sets socket establishment time.
146    pub fn set_socket_connect_duration(&mut self, duration: Option<Duration>) -> &mut Self {
147        self.socket_connect_duration = duration;
148        self
149    }
150
151    /// Sets proxy negotiation time.
152    pub fn proxy_duration(mut self, duration: Duration) -> Self {
153        self.set_proxy_duration(Some(duration));
154        self
155    }
156
157    /// Sets proxy negotiation time.
158    pub fn set_proxy_duration(&mut self, duration: Option<Duration>) -> &mut Self {
159        self.proxy_duration = duration;
160        self
161    }
162
163    /// Sets TLS establishment time.
164    pub fn tls_duration(mut self, duration: Duration) -> Self {
165        self.set_tls_duration(Some(duration));
166        self
167    }
168
169    /// Sets TLS establishment time.
170    pub fn set_tls_duration(&mut self, duration: Option<Duration>) -> &mut Self {
171        self.tls_duration = duration;
172        self
173    }
174
175    /// Builds successful connection-establishment metadata.
176    ///
177    /// # Panics
178    ///
179    /// Panics when total or transport duration is unset.
180    pub fn build(self) -> ConnectionEstablishmentMetadata {
181        ConnectionEstablishmentMetadata {
182            inner: Arc::new(ConnectionEstablishmentMetadataInner {
183                total_duration: self
184                    .total_duration
185                    .expect("total_duration is required for connection establishment metadata"),
186                transport_duration: self
187                    .transport_duration
188                    .expect("transport_duration is required for connection establishment metadata"),
189                protocol_handshake_duration: self.protocol_handshake_duration,
190                dns_duration: self.dns_duration,
191                socket_connect_duration: self.socket_connect_duration,
192                proxy_duration: self.proxy_duration,
193                tls_duration: self.tls_duration,
194            }),
195        }
196    }
197}