Skip to content

Commit 3b34777

Browse files
committed
refactor(app/inbound): consolidate route label encoding
in #4180, we noted during review that encoding prometheus labels for route and parent metadata entails a slightly unfortunate amount of repetitive boilerplate. in the outbound proxy, we define a local `RouteLabels` type that implements the `EncodeLabelSet` and `EncodeLabelSetMut`, which we use to integrate label sets with the `prometheus_client` SDK. this commit introduces an equivalent pattern to the inbound proxy. a `RouteLabels` newtype wrapper over the shared `linkerd_app_core` structure is introduced, which in turn simplifies the `EncodeLabelSet` and `EncodeLabelSetMut` implementations of the `RequestCountLabels`, `ResponseBodyDataLabels`, and `RequestBodyDataLabels` types. Signed-off-by: katelyn martin <[email protected]>
1 parent 3f33f59 commit 3b34777

File tree

3 files changed

+65
-62
lines changed

3 files changed

+65
-62
lines changed

linkerd/app/inbound/src/http/router/metrics.rs

Lines changed: 15 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
use crate::{policy::PermitVariant, InboundMetrics};
22
use linkerd_app_core::{
3-
metrics::{
4-
prom::{
5-
self,
6-
encoding::{self, EncodeLabelSet, LabelSetEncoder},
7-
EncodeLabelSetMut,
8-
},
9-
RouteLabels, ServerLabel,
3+
metrics::prom::{
4+
self,
5+
encoding::{EncodeLabelSet, LabelSetEncoder},
6+
EncodeLabelSetMut,
107
},
118
svc,
129
};
@@ -15,6 +12,10 @@ use linkerd_http_prom::{
1512
count_reqs::{self, RequestCount},
1613
};
1714

15+
pub use self::labels::RouteLabels;
16+
17+
mod labels;
18+
1819
pub(super) fn layer<N>(
1920
InboundMetrics {
2021
request_count,
@@ -157,24 +158,9 @@ where
157158

158159
impl EncodeLabelSetMut for RequestCountLabels {
159160
fn encode_label_set(&self, enc: &mut LabelSetEncoder<'_>) -> std::fmt::Result {
160-
use encoding::EncodeLabel as _;
161-
162-
let Self {
163-
route:
164-
RouteLabels {
165-
server: ServerLabel(parent, port),
166-
route,
167-
},
168-
} = self;
169-
170-
("parent_group", parent.group()).encode(enc.encode_label())?;
171-
("parent_kind", parent.kind()).encode(enc.encode_label())?;
172-
("parent_name", parent.name()).encode(enc.encode_label())?;
173-
("parent_port", *port).encode(enc.encode_label())?;
161+
let Self { route } = self;
174162

175-
("route_group", route.group()).encode(enc.encode_label())?;
176-
("route_kind", route.kind()).encode(enc.encode_label())?;
177-
("route_name", route.name()).encode(enc.encode_label())?;
163+
route.encode_label_set(enc)?;
178164

179165
Ok(())
180166
}
@@ -221,24 +207,9 @@ impl ResponseBodyFamilies {
221207

222208
impl EncodeLabelSetMut for ResponseBodyDataLabels {
223209
fn encode_label_set(&self, enc: &mut LabelSetEncoder<'_>) -> std::fmt::Result {
224-
use encoding::EncodeLabel as _;
210+
let Self { route } = self;
225211

226-
let Self {
227-
route:
228-
RouteLabels {
229-
server: ServerLabel(parent, port),
230-
route,
231-
},
232-
} = self;
233-
234-
("parent_group", parent.group()).encode(enc.encode_label())?;
235-
("parent_kind", parent.kind()).encode(enc.encode_label())?;
236-
("parent_name", parent.name()).encode(enc.encode_label())?;
237-
("parent_port", *port).encode(enc.encode_label())?;
238-
239-
("route_group", route.group()).encode(enc.encode_label())?;
240-
("route_kind", route.kind()).encode(enc.encode_label())?;
241-
("route_name", route.name()).encode(enc.encode_label())?;
212+
route.encode_label_set(enc)?;
242213

243214
Ok(())
244215
}
@@ -302,24 +273,9 @@ impl RequestBodyFamilies {
302273

303274
impl EncodeLabelSetMut for RequestBodyDataLabels {
304275
fn encode_label_set(&self, enc: &mut LabelSetEncoder<'_>) -> std::fmt::Result {
305-
use encoding::EncodeLabel as _;
306-
307-
let Self {
308-
route:
309-
RouteLabels {
310-
server: ServerLabel(parent, port),
311-
route,
312-
},
313-
} = self;
314-
315-
("parent_group", parent.group()).encode(enc.encode_label())?;
316-
("parent_kind", parent.kind()).encode(enc.encode_label())?;
317-
("parent_name", parent.name()).encode(enc.encode_label())?;
318-
("parent_port", *port).encode(enc.encode_label())?;
319-
320-
("route_group", route.group()).encode(enc.encode_label())?;
321-
("route_kind", route.kind()).encode(enc.encode_label())?;
322-
("route_name", route.name()).encode(enc.encode_label())?;
276+
let Self { route } = self;
277+
278+
route.encode_label_set(enc)?;
323279

324280
Ok(())
325281
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
use linkerd_app_core::metrics::prom::{
2+
encoding::{self, EncodeLabelSet, LabelSetEncoder},
3+
EncodeLabelSetMut,
4+
};
5+
6+
/// Labels referencing an inbound server and route.
7+
///
8+
/// Provides an [`EncodeLabelSet`] implementation for route labels.
9+
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
10+
pub struct RouteLabels(linkerd_app_core::metrics::RouteLabels);
11+
12+
// === impl RouteLabels ===
13+
14+
impl From<linkerd_app_core::metrics::RouteLabels> for RouteLabels {
15+
fn from(labels: linkerd_app_core::metrics::RouteLabels) -> Self {
16+
Self(labels)
17+
}
18+
}
19+
20+
impl EncodeLabelSetMut for RouteLabels {
21+
fn encode_label_set(&self, enc: &mut LabelSetEncoder<'_>) -> std::fmt::Result {
22+
use encoding::EncodeLabel as _;
23+
24+
let Self(linkerd_app_core::metrics::RouteLabels {
25+
server: linkerd_app_core::metrics::ServerLabel(parent, port),
26+
route,
27+
}) = self;
28+
29+
("parent_group", parent.group()).encode(enc.encode_label())?;
30+
("parent_kind", parent.kind()).encode(enc.encode_label())?;
31+
("parent_name", parent.name()).encode(enc.encode_label())?;
32+
("parent_port", *port).encode(enc.encode_label())?;
33+
34+
("route_group", route.group()).encode(enc.encode_label())?;
35+
("route_kind", route.kind()).encode(enc.encode_label())?;
36+
("route_name", route.name()).encode(enc.encode_label())?;
37+
38+
Ok(())
39+
}
40+
}
41+
42+
impl EncodeLabelSet for RouteLabels {
43+
fn encode(&self, mut enc: LabelSetEncoder<'_>) -> std::fmt::Result {
44+
self.encode_label_set(&mut enc)
45+
}
46+
}

linkerd/app/inbound/src/policy/http.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
use super::{RoutePolicy, Routes};
22
use crate::{
3+
http::router::RouteLabels,
34
metrics::authz::HttpAuthzMetrics,
45
policy::{AllowPolicy, HttpRoutePermit},
56
};
67
use futures::{future, TryFutureExt};
78
use linkerd_app_core::{
8-
metrics::{RouteAuthzLabels, RouteLabels},
9+
metrics::RouteAuthzLabels,
910
svc::{self, ServiceExt},
1011
tls::{self, ConditionalServerTls},
1112
transport::{ClientAddr, OrigDstAddr, Remote, ServerAddr},
@@ -217,7 +218,7 @@ impl<T, N> HttpPolicyService<T, N> {
217218
let (r#match, route) =
218219
super::route::find(routes, req).ok_or_else(|| self.mk_route_not_found())?;
219220

220-
let labels = RouteLabels {
221+
let labels = linkerd_app_core::metrics::RouteLabels {
221222
route: route.meta.clone(),
222223
server: self.policy.server_label(),
223224
};
@@ -479,6 +480,6 @@ impl<T> Permitted<T> {
479480

480481
/// Returns the [`RouteLabels`] from the underlying permit.
481482
pub fn route_labels(&self) -> RouteLabels {
482-
self.permit_ref().labels.route.clone()
483+
self.permit_ref().labels.route.clone().into()
483484
}
484485
}

0 commit comments

Comments
 (0)