Skip to content

Commit 4993d2a

Browse files
authored
chore: add a metric for how many times a limit has been reached when creating an ingress payload (#9283)
This could be useful to decide whether we should bump limits on the payload sizes
1 parent 48578ab commit 4993d2a

File tree

2 files changed

+29
-7
lines changed

2 files changed

+29
-7
lines changed

rs/ingress_manager/src/ingress_selector.rs

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,10 @@ impl IngressSelector for IngressManager {
196196
Ok(()) => (),
197197
Err(ValidationError::InvalidArtifact(
198198
InvalidIngressPayloadReason::IngressPayloadTooManyMessages(_, _),
199-
)) => break 'outer,
199+
)) => {
200+
self.metrics.observe_limit_reached("messages_count_limit");
201+
break 'outer;
202+
}
200203
_ => {
201204
queue.msgs.pop();
202205
continue;
@@ -206,9 +209,12 @@ impl IngressSelector for IngressManager {
206209
let size_estimates = self.message_size_estimates(&ingress.signed_ingress);
207210

208211
// Break criterion #1: global byte limit
209-
if accumulated_wire_size + size_estimates.wire > wire_byte_limit
210-
|| accumulated_memory_size + size_estimates.memory > memory_byte_limit
211-
{
212+
if accumulated_wire_size + size_estimates.wire > wire_byte_limit {
213+
self.metrics.observe_limit_reached("wire_byte_limit");
214+
break 'outer;
215+
}
216+
if accumulated_memory_size + size_estimates.memory > memory_byte_limit {
217+
self.metrics.observe_limit_reached("memory_byte_limit");
212218
break 'outer;
213219
}
214220

@@ -247,9 +253,12 @@ impl IngressSelector for IngressManager {
247253
}
248254
}
249255

250-
if wire_byte_limit <= accumulated_wire_size
251-
|| memory_byte_limit <= accumulated_memory_size
252-
{
256+
if wire_byte_limit <= accumulated_wire_size {
257+
self.metrics.observe_limit_reached("wire_byte_limit");
258+
// No remaining quota means the block is full. No more iterations needed.
259+
break;
260+
} else if memory_byte_limit <= accumulated_memory_size {
261+
self.metrics.observe_limit_reached("memory_byte_limit");
253262
// No remaining quota means the block is full. No more iterations needed.
254263
break;
255264
} else {
@@ -291,6 +300,7 @@ impl IngressSelector for IngressManager {
291300
wire_byte_limit.get()
292301
);
293302
messages_in_payload.pop();
303+
self.metrics.observe_limit_reached("serialized");
294304
if messages_in_payload.is_empty() {
295305
break IngressPayload::default();
296306
}
@@ -305,6 +315,7 @@ impl IngressSelector for IngressManager {
305315

306316
debug_assert!(size_estimates.wire <= wire_byte_limit);
307317
debug_assert!(size_estimates.memory <= memory_byte_limit);
318+
debug_assert!(payload.payload.message_count() <= settings.max_ingress_messages_per_block);
308319
payload
309320
}
310321

rs/ingress_manager/src/metrics.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ pub(crate) struct IngressManagerMetrics {
99
pub(crate) ingress_selector_get_payload_time: Histogram,
1010
pub(crate) ingress_selector_validate_payload_time: Histogram,
1111
pub(crate) ingress_payload_cache_size: IntGauge,
12+
limit_reached: IntCounterVec,
1213

1314
validated_ingress_message_size: Histogram,
1415
validated_ingress_message_field_size: HistogramVec,
@@ -62,6 +63,12 @@ impl IngressManagerMetrics {
6263
"The number of invalidated ingress messages, partitioned by the reason",
6364
&["reason"],
6465
),
66+
limit_reached: metrics_registry.int_counter_vec(
67+
"ingress_selector_limit_reached_total",
68+
"The total number of times we reached a limit while creating an ingress payload, \
69+
labeled by a type of the limit",
70+
&["limit_type"],
71+
),
6572
}
6673
}
6774

@@ -104,4 +111,8 @@ impl IngressManagerMetrics {
104111
.with_label_values(&["remainder"])
105112
.observe(everything_else_size as f64);
106113
}
114+
115+
pub(crate) fn observe_limit_reached(&self, limit_type: &str) {
116+
self.limit_reached.with_label_values(&[limit_type]).inc();
117+
}
107118
}

0 commit comments

Comments
 (0)