Skip to content

Commit 161dba0

Browse files
committed
new metric "queued crates by priority"
to be able to query by priority in grafana
1 parent a43b0fb commit 161dba0

File tree

2 files changed

+57
-7
lines changed

2 files changed

+57
-7
lines changed

src/build_queue.rs

Lines changed: 46 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use anyhow::Context;
1010
use crates_index_diff::Change;
1111
use tracing::{debug, info, warn};
1212

13+
use std::collections::HashMap;
1314
use std::sync::Arc;
1415
use std::thread;
1516
use std::time::Duration;
@@ -93,19 +94,32 @@ impl BuildQueue {
9394
}
9495

9596
pub(crate) fn pending_count(&self) -> Result<usize> {
96-
let res = self.db.get()?.query(
97-
"SELECT COUNT(*) FROM queue WHERE attempt < $1;",
98-
&[&self.max_attempts],
99-
)?;
100-
Ok(res[0].get::<_, i64>(0) as usize)
97+
Ok(self.pending_count_by_priority()?.values().sum::<usize>())
10198
}
10299

103100
pub(crate) fn prioritized_count(&self) -> Result<usize> {
101+
Ok(self
102+
.pending_count_by_priority()?
103+
.iter()
104+
.filter(|(&priority, _)| priority <= 0)
105+
.map(|(_, count)| count)
106+
.sum::<usize>())
107+
}
108+
109+
pub(crate) fn pending_count_by_priority(&self) -> Result<HashMap<i32, usize>> {
104110
let res = self.db.get()?.query(
105-
"SELECT COUNT(*) FROM queue WHERE attempt < $1 AND priority <= 0;",
111+
"SELECT
112+
priority,
113+
COUNT(*)
114+
FROM queue
115+
WHERE attempt < $1
116+
GROUP BY priority",
106117
&[&self.max_attempts],
107118
)?;
108-
Ok(res[0].get::<_, i64>(0) as usize)
119+
Ok(res
120+
.iter()
121+
.map(|row| (row.get::<_, i32>(0), row.get::<_, i64>(1) as usize))
122+
.collect())
109123
}
110124

111125
pub(crate) fn failed_count(&self) -> Result<usize> {
@@ -656,6 +670,31 @@ mod tests {
656670
});
657671
}
658672

673+
#[test]
674+
fn test_count_by_priority() {
675+
crate::test::wrapper(|env| {
676+
let queue = env.build_queue();
677+
678+
assert!(queue.pending_count_by_priority()?.is_empty());
679+
680+
queue.add_crate("one", "1.0.0", 1, None)?;
681+
queue.add_crate("two", "2.0.0", 2, None)?;
682+
queue.add_crate("two_more", "2.0.0", 2, None)?;
683+
684+
assert_eq!(
685+
queue.pending_count_by_priority()?,
686+
HashMap::from_iter(vec![(1, 1), (2, 2)])
687+
);
688+
689+
while queue.pending_count()? > 0 {
690+
queue.process_next_crate(|_| Ok(()))?;
691+
}
692+
assert!(queue.pending_count_by_priority()?.is_empty());
693+
694+
Ok(())
695+
});
696+
}
697+
659698
#[test]
660699
fn test_failed_count() {
661700
const MAX_ATTEMPTS: u16 = 3;

src/metrics/mod.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ metrics! {
2626
failed_crates_count: IntGauge,
2727
/// Whether the build queue is locked
2828
queue_is_locked: IntGauge,
29+
/// queued crates by priority
30+
queued_crates_count_by_priority: IntGaugeVec["priority"],
2931

3032
/// The number of idle database connections
3133
idle_db_connections: IntGauge,
@@ -163,6 +165,15 @@ impl Metrics {
163165
self.queued_crates_count.set(queue.pending_count()? as i64);
164166
self.prioritized_crates_count
165167
.set(queue.prioritized_count()? as i64);
168+
169+
let queue_pending_count = queue.pending_count_by_priority()?;
170+
171+
for (priority, count) in queue_pending_count.iter() {
172+
self.queued_crates_count_by_priority
173+
.with_label_values(&[&priority.to_string()])
174+
.set(*count as i64);
175+
}
176+
166177
self.failed_crates_count.set(queue.failed_count()? as i64);
167178

168179
self.recently_accessed_releases.gather(self);

0 commit comments

Comments
 (0)