Skip to content

Commit 093384c

Browse files
committed
fix CDN invalidation queue metric when the queue is empty
1 parent 97e3ad7 commit 093384c

File tree

3 files changed

+48
-10
lines changed

3 files changed

+48
-10
lines changed

src/cdn.rs

Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -470,9 +470,19 @@ pub(crate) fn queued_or_active_crate_invalidations(
470470
/// Return the count of queued or active invalidations, per distribution id
471471
pub(crate) fn queued_or_active_crate_invalidation_count_by_distribution(
472472
conn: &mut impl postgres::GenericClient,
473+
config: &Config,
473474
) -> Result<HashMap<String, i64>> {
474-
Ok(conn
475-
.query(
475+
let mut result: HashMap<String, i64> = HashMap::from_iter(
476+
config
477+
.cloudfront_distribution_id_web
478+
.iter()
479+
.chain(config.cloudfront_distribution_id_static.iter())
480+
.cloned()
481+
.map(|id| (id, 0)),
482+
);
483+
484+
result.extend(
485+
conn.query(
476486
r#"
477487
SELECT
478488
cdn_distribution_id,
@@ -482,8 +492,10 @@ pub(crate) fn queued_or_active_crate_invalidation_count_by_distribution(
482492
&[],
483493
)?
484494
.iter()
485-
.map(|row| (row.get(0), row.get(1)))
486-
.collect())
495+
.map(|row| (row.get(0), row.get(1))),
496+
);
497+
498+
Ok(result)
487499
}
488500

489501
#[cfg(test)]
@@ -527,6 +539,27 @@ mod tests {
527539
})
528540
}
529541

542+
#[test]
543+
fn invalidation_counts_are_zero_with_empty_queue() {
544+
crate::test::wrapper(|env| {
545+
env.override_config(|config| {
546+
config.cloudfront_distribution_id_web = Some("distribution_id_web".into());
547+
config.cloudfront_distribution_id_static = Some("distribution_id_static".into());
548+
});
549+
550+
let config = env.config();
551+
let mut conn = env.db().conn();
552+
assert!(queued_or_active_crate_invalidations(&mut *conn)?.is_empty());
553+
554+
let counts =
555+
queued_or_active_crate_invalidation_count_by_distribution(&mut *conn, &config)?;
556+
assert_eq!(counts.len(), 2);
557+
assert_eq!(*counts.get("distribution_id_web").unwrap(), 0);
558+
assert_eq!(*counts.get("distribution_id_static").unwrap(), 0);
559+
Ok(())
560+
})
561+
}
562+
530563
#[test]
531564
fn invalidate_a_crate() {
532565
crate::test::wrapper(|env| {
@@ -536,6 +569,7 @@ mod tests {
536569
});
537570

538571
let cdn = env.cdn();
572+
let config = env.config();
539573
let mut conn = env.db().conn();
540574
assert!(queued_or_active_crate_invalidations(&mut *conn)?.is_empty());
541575

@@ -574,7 +608,8 @@ mod tests {
574608
]
575609
);
576610

577-
let counts = queued_or_active_crate_invalidation_count_by_distribution(&mut *conn)?;
611+
let counts =
612+
queued_or_active_crate_invalidation_count_by_distribution(&mut *conn, &config)?;
578613
assert_eq!(counts.len(), 2);
579614
assert_eq!(*counts.get("distribution_id_web").unwrap(), 2);
580615
assert_eq!(*counts.get("distribution_id_static").unwrap(), 1);

src/metrics/mod.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
mod macros;
33

44
use self::macros::MetricFromOpts;
5-
use crate::{cdn, db::Pool, target::TargetAtom, BuildQueue};
5+
use crate::{cdn, db::Pool, target::TargetAtom, BuildQueue, Config};
66
use anyhow::Error;
77
use dashmap::DashMap;
88
use prometheus::proto::MetricFamily;
@@ -185,6 +185,7 @@ impl Metrics {
185185
&self,
186186
pool: &Pool,
187187
queue: &BuildQueue,
188+
config: &Config,
188189
) -> Result<Vec<MetricFamily>, Error> {
189190
self.idle_db_connections.set(pool.idle_connections() as i64);
190191
self.used_db_connections.set(pool.used_connections() as i64);
@@ -205,7 +206,7 @@ impl Metrics {
205206

206207
let mut conn = pool.get()?;
207208
for (distribution_id, count) in
208-
cdn::queued_or_active_crate_invalidation_count_by_distribution(&mut *conn)?
209+
cdn::queued_or_active_crate_invalidation_count_by_distribution(&mut *conn, config)?
209210
{
210211
self.queued_cdn_invalidations_by_distribution
211212
.with_label_values(&[&distribution_id])

src/web/metrics.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::{
22
db::Pool, metrics::duration_to_seconds, utils::spawn_blocking, web::error::AxumResult,
3-
BuildQueue, Metrics,
3+
BuildQueue, Config, Metrics,
44
};
55
use anyhow::Context as _;
66
use axum::{
@@ -21,10 +21,11 @@ use tracing::debug;
2121

2222
pub(super) async fn metrics_handler(
2323
Extension(pool): Extension<Pool>,
24+
Extension(config): Extension<Arc<Config>>,
2425
Extension(metrics): Extension<Arc<Metrics>>,
2526
Extension(queue): Extension<Arc<BuildQueue>>,
2627
) -> AxumResult<impl IntoResponse> {
27-
let families = spawn_blocking(move || metrics.gather(&pool, &queue)).await?;
28+
let families = spawn_blocking(move || metrics.gather(&pool, &queue, &config)).await?;
2829

2930
let mut buffer = Vec::new();
3031
TextEncoder::new()
@@ -199,7 +200,8 @@ mod tests {
199200
}
200201

201202
// this shows what the routes were *actually* recorded as, making it easier to update ROUTES if the name changes.
202-
let metrics_serialized = metrics.gather(&env.pool()?, &env.build_queue())?;
203+
let metrics_serialized =
204+
metrics.gather(&env.pool()?, &env.build_queue(), &env.config())?;
203205
let all_routes_visited = metrics_serialized
204206
.iter()
205207
.find(|x| x.get_name() == "docsrs_routes_visited")

0 commit comments

Comments
 (0)