From 3e0b88b460d924e56e2a5faffe153a38befd210a Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Sat, 31 May 2025 04:28:25 +0000 Subject: [PATCH] fix(pegboard): continue exporting metrics even if fetching actor fails --- packages/edge/api/actor/src/assert.rs | 1 + packages/edge/api/actor/src/route/actors.rs | 3 +++ .../edge/services/pegboard/src/ops/actor/get.rs | 13 +++++++++++++ .../standalone/usage-metrics-publish/src/lib.rs | 1 + 4 files changed, 18 insertions(+) diff --git a/packages/edge/api/actor/src/assert.rs b/packages/edge/api/actor/src/assert.rs index 6f636e1afc..16cec752f2 100644 --- a/packages/edge/api/actor/src/assert.rs +++ b/packages/edge/api/actor/src/assert.rs @@ -16,6 +16,7 @@ pub async fn actor_for_env( .op(pegboard::ops::actor::get::Input { actor_ids: vec![actor_id], endpoint_type, + allow_errors: false, }) .await?; let actor = unwrap_with!(actors_res.actors.into_iter().next(), ACTOR_NOT_FOUND); diff --git a/packages/edge/api/actor/src/route/actors.rs b/packages/edge/api/actor/src/route/actors.rs index f07d0b6e8a..94b420541b 100644 --- a/packages/edge/api/actor/src/route/actors.rs +++ b/packages/edge/api/actor/src/route/actors.rs @@ -56,6 +56,7 @@ async fn get_inner( .op(pegboard::ops::actor::get::Input { actor_ids: vec![actor_id], endpoint_type: query.endpoint_type.map(ApiInto::api_into), + allow_errors: false, }) .await?; let actor = unwrap_with!(actors_res.actors.first(), ACTOR_NOT_FOUND); @@ -255,6 +256,7 @@ pub async fn create( .op(pegboard::ops::actor::get::Input { actor_ids: vec![actor_id], endpoint_type: query.endpoint_type.map(ApiInto::api_into), + allow_errors: false, }) .await?; let actor = unwrap_with!(actors_res.actors.first(), ACTOR_NOT_FOUND); @@ -584,6 +586,7 @@ async fn list_actors_inner( .global_endpoint_type .endpoint_type .map(ApiInto::api_into), + allow_errors: false, }) .await?; actors_res.actors.sort_by_key(|x| -x.create_ts); diff --git a/packages/edge/services/pegboard/src/ops/actor/get.rs b/packages/edge/services/pegboard/src/ops/actor/get.rs index 5be0e2e5af..6d6300f5d6 100644 --- a/packages/edge/services/pegboard/src/ops/actor/get.rs +++ b/packages/edge/services/pegboard/src/ops/actor/get.rs @@ -72,6 +72,8 @@ pub struct Input { /// If the datacenter has a parent hostname, will use hostname endpoint. Otherwise, will use /// path endpoint. pub endpoint_type: Option, + + pub allow_errors: bool, } #[derive(Debug)] @@ -192,6 +194,17 @@ pub async fn pegboard_actor_get(ctx: &OperationCtx, input: &Input) -> GlobalResu })) }) .buffer_unordered(1024) + .map(|x| match x { + Ok(x) => Ok(x), + Err(err) => { + if input.allow_errors { + tracing::warn!(?err, "failed to fetch actor"); + Ok(None) + } else { + Err(err) + } + } + }) .try_filter_map(|x| std::future::ready(Ok(x))) .try_collect::>() .await?; diff --git a/packages/edge/services/pegboard/standalone/usage-metrics-publish/src/lib.rs b/packages/edge/services/pegboard/standalone/usage-metrics-publish/src/lib.rs index 42fe753f29..3cb3184a5f 100644 --- a/packages/edge/services/pegboard/standalone/usage-metrics-publish/src/lib.rs +++ b/packages/edge/services/pegboard/standalone/usage-metrics-publish/src/lib.rs @@ -75,6 +75,7 @@ pub async fn run_from_env( .op(pegboard::ops::actor::get::Input { actor_ids, endpoint_type: None, + allow_errors: true, }) .await?;