Skip to content

Commit d250f76

Browse files
committed
refactor(http/prom): StreamLabel::end_response accepts EosRef
Signed-off-by: katelyn martin <[email protected]>
1 parent 6fba040 commit d250f76

File tree

8 files changed

+31
-39
lines changed

8 files changed

+31
-39
lines changed

linkerd/app/outbound/src/http/logical/policy/route/metrics.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use linkerd_http_prom::{
1010
stream_label::{
1111
error::LabelError,
1212
status::{LabelGrpcStatus, LabelHttpStatus},
13-
LabelSet, StreamLabel,
13+
EosRef, LabelSet, StreamLabel,
1414
},
1515
};
1616

@@ -337,7 +337,7 @@ where
337337
error.init_response(rsp);
338338
}
339339

340-
fn end_response(&mut self, res: Result<Option<&http::HeaderMap>, &linkerd_app_core::Error>) {
340+
fn end_response(&mut self, res: EosRef<'_>) {
341341
let Self {
342342
parent: _,
343343
status,
@@ -395,7 +395,7 @@ where
395395
error.init_response(rsp);
396396
}
397397

398-
fn end_response(&mut self, res: Result<Option<&http::HeaderMap>, &linkerd_app_core::Error>) {
398+
fn end_response(&mut self, res: EosRef<'_>) {
399399
let Self {
400400
parent: _,
401401
status,

linkerd/http/prom/src/record_response.rs

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use crate::stream_label::{LabelSet, MkStreamLabel, StreamLabel};
22
use http_body::Body;
33
use linkerd_error::Error;
4+
use linkerd_http_body_eos::EosRef;
45
use linkerd_http_box::BoxBody;
56
use linkerd_stack as svc;
67
use prometheus_client::metrics::{
@@ -180,15 +181,15 @@ where
180181

181182
let (head, inner) = rsp.into_parts();
182183
if inner.is_end_stream() {
183-
end_stream(&mut state, Ok(None));
184+
end_stream(&mut state, EosRef::None);
184185
}
185186
Poll::Ready(Ok(http::Response::from_parts(
186187
head,
187188
BoxBody::new(ResponseBody { inner, state }),
188189
)))
189190
}
190191
Err(error) => {
191-
end_stream(&mut state, Err(&error));
192+
end_stream(&mut state, EosRef::Error(&error));
192193
Poll::Ready(Err(error))
193194
}
194195
}
@@ -217,14 +218,14 @@ where
217218

218219
match &frame {
219220
Some(Ok(frame)) => {
220-
if let trls @ Some(_) = frame.trailers_ref() {
221-
end_stream(this.state, Ok(trls));
221+
if let Some(trls) = frame.trailers_ref() {
222+
end_stream(this.state, EosRef::Trailers(trls));
222223
} else if this.inner.is_end_stream() {
223-
end_stream(this.state, Ok(None));
224+
end_stream(this.state, EosRef::None);
224225
}
225226
}
226-
Some(Err(error)) => end_stream(this.state, Err(error)),
227-
None => end_stream(this.state, Ok(None)),
227+
Some(Err(error)) => end_stream(this.state, EosRef::Error(error)),
228+
None => end_stream(this.state, EosRef::None),
228229
}
229230

230231
Poll::Ready(frame)
@@ -246,15 +247,13 @@ where
246247
fn drop(self: Pin<&mut Self>) {
247248
let this = self.project();
248249
if this.state.is_some() {
249-
end_stream(this.state, Err(&RequestCancelled.into()));
250+
end_stream(this.state, EosRef::Cancelled);
250251
}
251252
}
252253
}
253254

254-
fn end_stream<L>(
255-
state: &mut Option<ResponseState<L>>,
256-
res: Result<Option<&http::HeaderMap>, &Error>,
257-
) where
255+
fn end_stream<L>(state: &mut Option<ResponseState<L>>, res: EosRef<'_>)
256+
where
258257
L: StreamLabel,
259258
L::DurationLabels: LabelSet,
260259
{

linkerd/http/prom/src/status.rs

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
//! A tower middleware for counting response status codes.
22
3-
use crate::{
4-
record_response::RequestCancelled,
5-
stream_label::{LabelSet, MkStreamLabel, StreamLabel},
6-
};
3+
use crate::stream_label::{LabelSet, MkStreamLabel, StreamLabel};
74
use http::{Request, Response};
85
use http_body::Body;
96
use linkerd_error::Error;
@@ -258,16 +255,7 @@ where
258255
L: Clone + Hash + Eq + Send + Sync + 'static,
259256
{
260257
fn on_eos(eos: EosRef<'_, Error>, mut stream_label: SL, metrics: StatusMetrics<L>) {
261-
// TODO(kate): a static cancellation error. see linkerd/linkerd2-proxy#4306.
262-
let cancelled = RequestCancelled.into();
263-
264-
stream_label.end_response(match eos {
265-
EosRef::None => Ok(None),
266-
EosRef::Trailers(trls) => Ok(Some(trls)),
267-
EosRef::Error(error) => Err(error),
268-
EosRef::Cancelled => Err(&cancelled),
269-
});
270-
258+
stream_label.end_response(eos);
271259
let labels = stream_label.status_labels();
272260
let counter = metrics.metric(&labels);
273261
counter.inc();

linkerd/http/prom/src/status/tests.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -484,7 +484,7 @@ mod util {
484484
http.init_response(rsp);
485485
}
486486

487-
fn end_response(&mut self, trailers: Result<Option<&http::HeaderMap>, &Error>) {
487+
fn end_response(&mut self, trailers: EosRef<'_>) {
488488
let Self { grpc, http } = self;
489489
grpc.end_response(trailers);
490490
http.end_response(trailers);

linkerd/http/prom/src/stream_label.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
//! Stream labeling facilities.
22
3-
use linkerd_error::Error;
43
use prometheus_client::encoding::EncodeLabelSet;
54

65
pub mod error;
76
pub mod status;
87
pub mod with;
98

9+
pub use linkerd_http_body_eos::EosRef;
10+
1011
/// A strategy for labeling request/responses streams for status and duration
1112
/// metrics.
1213
///
@@ -30,7 +31,7 @@ pub trait StreamLabel: Send + 'static {
3031
type StatusLabels;
3132

3233
fn init_response<B>(&mut self, rsp: &http::Response<B>);
33-
fn end_response(&mut self, trailers: Result<Option<&http::HeaderMap>, &Error>);
34+
fn end_response(&mut self, trailers: EosRef<'_>);
3435

3536
fn status_labels(&self) -> Self::StatusLabels;
3637
fn duration_labels(&self) -> Self::DurationLabels;

linkerd/http/prom/src/stream_label/error.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
33
use super::StreamLabel;
44
use linkerd_error::Error;
5+
use linkerd_http_body_eos::EosRef;
56

67
/// A [`StreamLabel`] implementation that maps boxed errors to labels.
78
#[derive(Clone, Debug, Default)]
@@ -21,8 +22,8 @@ where
2122

2223
fn init_response<B>(&mut self, _: &http::Response<B>) {}
2324

24-
fn end_response(&mut self, res: Result<Option<&http::HeaderMap>, &Error>) {
25-
let Err(err) = res else { return };
25+
fn end_response(&mut self, res: EosRef<'_>) {
26+
let EosRef::Error(err) = res else { return };
2627
let labels = E::from(err);
2728
self.error = Some(labels);
2829
}

linkerd/http/prom/src/stream_label/status.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
55
use crate::stream_label::{MkStreamLabel, StreamLabel};
66
use http::{HeaderMap, HeaderValue, Response, StatusCode};
7-
use linkerd_error::Error;
7+
use linkerd_http_body_eos::EosRef;
88
use tonic::Code;
99

1010
/// A [`MkStreamLabel`] implementation for gRPC traffic.
@@ -58,8 +58,10 @@ impl StreamLabel for LabelGrpcStatus {
5858
self.code = Self::get_grpc_status(headers);
5959
}
6060

61-
fn end_response(&mut self, trailers: Result<Option<&HeaderMap>, &Error>) {
62-
let Ok(Some(trailers)) = trailers else { return };
61+
fn end_response(&mut self, trailers: EosRef<'_>) {
62+
let EosRef::Trailers(trailers) = trailers else {
63+
return;
64+
};
6365
self.code = Self::get_grpc_status(trailers);
6466
}
6567

@@ -101,7 +103,7 @@ impl StreamLabel for LabelHttpStatus {
101103
self.status = Some(rsp.status());
102104
}
103105

104-
fn end_response(&mut self, _: Result<Option<&http::HeaderMap>, &linkerd_error::Error>) {}
106+
fn end_response(&mut self, _: EosRef<'_>) {}
105107

106108
fn status_labels(&self) -> Self::StatusLabels {
107109
self.status

linkerd/http/prom/src/stream_label/with.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
//! [`StreamLabel`] implementation for labels known in advance.
22
33
use super::{MkStreamLabel, StreamLabel};
4+
use linkerd_http_body_eos::EosRef;
45

56
/// A [`MkStreamLabel`] implementation for `L`-typed labels.
67
///
@@ -45,7 +46,7 @@ where
4546
type StatusLabels = L;
4647

4748
fn init_response<B>(&mut self, _: &http::Response<B>) {}
48-
fn end_response(&mut self, _: Result<Option<&http::HeaderMap>, &linkerd_error::Error>) {}
49+
fn end_response(&mut self, _: EosRef<'_>) {}
4950

5051
fn status_labels(&self) -> Self::StatusLabels {
5152
self.labels.clone()

0 commit comments

Comments
 (0)