Skip to content

Commit fc928b6

Browse files
authored
feat(inbound): include srv_port label in server metrics (#3725)
We include a group/version/kind for inbound server resources, but we do not indicate which specific port the server is applied to. This is important context to understand the inbound proxy's behavior, especially when using the default servers. This change adds a `srv_port` label to inbound server metrics to definitively and consistently indicate the server port used for inbound policy.
1 parent 9f5a6cc commit fc928b6

File tree

7 files changed

+90
-48
lines changed

7 files changed

+90
-48
lines changed

linkerd/app/core/src/metrics.rs

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use crate::{
1515
use linkerd_addr::Addr;
1616
pub use linkerd_metrics::*;
1717
use linkerd_proxy_server_policy as policy;
18-
use prometheus_client::encoding::EncodeLabelValue;
18+
use prometheus_client::encoding::{EncodeLabelSet, EncodeLabelValue};
1919
use std::{
2020
fmt::{self, Write},
2121
net::SocketAddr,
@@ -72,7 +72,7 @@ pub struct InboundEndpointLabels {
7272

7373
/// A label referencing an inbound `Server` (i.e. for policy).
7474
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
75-
pub struct ServerLabel(pub Arc<policy::Meta>);
75+
pub struct ServerLabel(pub Arc<policy::Meta>, pub u16);
7676

7777
/// Labels referencing an inbound server and authorization.
7878
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
@@ -330,14 +330,32 @@ impl FmtLabels for ServerLabel {
330330
fn fmt_labels(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
331331
write!(
332332
f,
333-
"srv_group=\"{}\",srv_kind=\"{}\",srv_name=\"{}\"",
333+
"srv_group=\"{}\",srv_kind=\"{}\",srv_name=\"{}\",srv_port=\"{}\"",
334334
self.0.group(),
335335
self.0.kind(),
336-
self.0.name()
336+
self.0.name(),
337+
self.1
337338
)
338339
}
339340
}
340341

342+
impl EncodeLabelSet for ServerLabel {
343+
fn encode(&self, mut enc: prometheus_client::encoding::LabelSetEncoder<'_>) -> fmt::Result {
344+
prom::EncodeLabelSetMut::encode_label_set(self, &mut enc)
345+
}
346+
}
347+
348+
impl prom::EncodeLabelSetMut for ServerLabel {
349+
fn encode_label_set(&self, enc: &mut prom::encoding::LabelSetEncoder<'_>) -> fmt::Result {
350+
use prometheus_client::encoding::EncodeLabel;
351+
("srv_group", self.0.group()).encode(enc.encode_label())?;
352+
("srv_kind", self.0.kind()).encode(enc.encode_label())?;
353+
("srv_name", self.0.name()).encode(enc.encode_label())?;
354+
("srv_port", self.1).encode(enc.encode_label())?;
355+
Ok(())
356+
}
357+
}
358+
341359
impl FmtLabels for ServerAuthzLabels {
342360
fn fmt_labels(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
343361
self.server.fmt_labels(f)?;

linkerd/app/core/src/transport/labels.rs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -199,18 +199,21 @@ mod tests {
199199
negotiated_protocol: None,
200200
}),
201201
([192, 0, 2, 4], 40000).into(),
202-
PolicyServerLabel(Arc::new(Meta::Resource {
203-
group: "policy.linkerd.io".into(),
204-
kind: "server".into(),
205-
name: "testserver".into(),
206-
})),
202+
PolicyServerLabel(
203+
Arc::new(Meta::Resource {
204+
group: "policy.linkerd.io".into(),
205+
kind: "server".into(),
206+
name: "testserver".into(),
207+
}),
208+
40000,
209+
),
207210
);
208211
assert_eq!(
209212
labels.to_string(),
210213
"direction=\"inbound\",peer=\"src\",\
211214
target_addr=\"192.0.2.4:40000\",target_ip=\"192.0.2.4\",target_port=\"40000\",\
212215
tls=\"true\",client_id=\"foo.id.example.com\",\
213-
srv_group=\"policy.linkerd.io\",srv_kind=\"server\",srv_name=\"testserver\""
216+
srv_group=\"policy.linkerd.io\",srv_kind=\"server\",srv_name=\"testserver\",srv_port=\"40000\""
214217
);
215218
}
216219
}

linkerd/app/gateway/src/http/tests.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ async fn upgraded_request_remains_relative_form() {
6262

6363
impl svc::Param<ServerLabel> for Target {
6464
fn param(&self) -> ServerLabel {
65-
ServerLabel(policy::Meta::new_default("test"))
65+
ServerLabel(policy::Meta::new_default("test"), 4143)
6666
}
6767
}
6868

linkerd/app/inbound/src/http.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -238,11 +238,14 @@ pub mod fuzz {
238238

239239
impl svc::Param<policy::ServerLabel> for Target {
240240
fn param(&self) -> policy::ServerLabel {
241-
policy::ServerLabel(Arc::new(policy::Meta::Resource {
242-
group: "policy.linkerd.io".into(),
243-
kind: "server".into(),
244-
name: "testsrv".into(),
245-
}))
241+
policy::ServerLabel(
242+
Arc::new(policy::Meta::Resource {
243+
group: "policy.linkerd.io".into(),
244+
kind: "server".into(),
245+
name: "testsrv".into(),
246+
}),
247+
1000,
248+
)
246249
}
247250
}
248251

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

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -655,11 +655,14 @@ async fn grpc_response_class() {
655655
target_addr: "127.0.0.1:80".parse().unwrap(),
656656
policy: metrics::RouteAuthzLabels {
657657
route: metrics::RouteLabels {
658-
server: metrics::ServerLabel(Arc::new(policy::Meta::Resource {
659-
group: "policy.linkerd.io".into(),
660-
kind: "server".into(),
661-
name: "testsrv".into(),
662-
})),
658+
server: metrics::ServerLabel(
659+
Arc::new(policy::Meta::Resource {
660+
group: "policy.linkerd.io".into(),
661+
kind: "server".into(),
662+
name: "testsrv".into(),
663+
}),
664+
80,
665+
),
663666
route: policy::Meta::new_default("default"),
664667
},
665668
authz: Arc::new(policy::Meta::Resource {
@@ -889,11 +892,14 @@ impl svc::Param<policy::AllowPolicy> for Target {
889892

890893
impl svc::Param<policy::ServerLabel> for Target {
891894
fn param(&self) -> policy::ServerLabel {
892-
policy::ServerLabel(Arc::new(policy::Meta::Resource {
893-
group: "policy.linkerd.io".into(),
894-
kind: "server".into(),
895-
name: "testsrv".into(),
896-
}))
895+
policy::ServerLabel(
896+
Arc::new(policy::Meta::Resource {
897+
group: "policy.linkerd.io".into(),
898+
kind: "server".into(),
899+
name: "testsrv".into(),
900+
}),
901+
80,
902+
)
897903
}
898904
}
899905

linkerd/app/inbound/src/policy.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ impl AllowPolicy {
133133

134134
#[inline]
135135
pub fn server_label(&self) -> ServerLabel {
136-
ServerLabel(self.server.borrow().meta.clone())
136+
ServerLabel(self.server.borrow().meta.clone(), self.dst.port())
137137
}
138138

139139
pub fn ratelimit_label(&self, error: &RateLimitError) -> HTTPLocalRateLimitLabels {
@@ -220,7 +220,7 @@ impl ServerPermit {
220220
protocol: server.protocol.clone(),
221221
labels: ServerAuthzLabels {
222222
authz: authz.meta.clone(),
223-
server: ServerLabel(server.meta.clone()),
223+
server: ServerLabel(server.meta.clone(), dst.port()),
224224
},
225225
}
226226
}

linkerd/app/inbound/src/policy/tcp/tests.rs

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,14 @@ async fn unauthenticated_allowed() {
4343
kind: "serverauthorization".into(),
4444
name: "unauth".into()
4545
}),
46-
server: ServerLabel(Arc::new(Meta::Resource {
47-
group: "policy.linkerd.io".into(),
48-
kind: "server".into(),
49-
name: "test".into()
50-
}))
46+
server: ServerLabel(
47+
Arc::new(Meta::Resource {
48+
group: "policy.linkerd.io".into(),
49+
kind: "server".into(),
50+
name: "test".into()
51+
}),
52+
1000
53+
)
5154
},
5255
}
5356
);
@@ -96,11 +99,14 @@ async fn authenticated_identity() {
9699
kind: "serverauthorization".into(),
97100
name: "tls-auth".into()
98101
}),
99-
server: ServerLabel(Arc::new(Meta::Resource {
100-
group: "policy.linkerd.io".into(),
101-
kind: "server".into(),
102-
name: "test".into()
103-
}))
102+
server: ServerLabel(
103+
Arc::new(Meta::Resource {
104+
group: "policy.linkerd.io".into(),
105+
kind: "server".into(),
106+
name: "test".into()
107+
}),
108+
1000
109+
)
104110
}
105111
}
106112
);
@@ -159,11 +165,14 @@ async fn authenticated_suffix() {
159165
kind: "serverauthorization".into(),
160166
name: "tls-auth".into()
161167
}),
162-
server: ServerLabel(Arc::new(Meta::Resource {
163-
group: "policy.linkerd.io".into(),
164-
kind: "server".into(),
165-
name: "test".into()
166-
})),
168+
server: ServerLabel(
169+
Arc::new(Meta::Resource {
170+
group: "policy.linkerd.io".into(),
171+
kind: "server".into(),
172+
name: "test".into()
173+
}),
174+
1000
175+
),
167176
}
168177
}
169178
);
@@ -219,11 +228,14 @@ async fn tls_unauthenticated() {
219228
kind: "serverauthorization".into(),
220229
name: "tls-unauth".into()
221230
}),
222-
server: ServerLabel(Arc::new(Meta::Resource {
223-
group: "policy.linkerd.io".into(),
224-
kind: "server".into(),
225-
name: "test".into()
226-
})),
231+
server: ServerLabel(
232+
Arc::new(Meta::Resource {
233+
group: "policy.linkerd.io".into(),
234+
kind: "server".into(),
235+
name: "test".into()
236+
}),
237+
1000
238+
),
227239
}
228240
}
229241
);

0 commit comments

Comments
 (0)