fix: bound fleet rebuilds and enable OTLP exporter retries
This commit is contained in:
10 files changed
+271
-64
No files matched your search
@@ -51,6 +51,21 @@ async fn fleet_view(state: &AppState) -> anyhow::Result<std::sync::Arc<Vec<Fleet
|
||||
|
||||
const REFRESH_CONCURRENCY: usize = 8;
|
||||
|
||||
fn fleet_error(err: anyhow::Error, fallback_code: &str) -> ApiError {
|
||||
if err.is::<crate::runtime::view_cache::RebuildLimit>() {
|
||||
return ApiError::new(
|
||||
StatusCode::SERVICE_UNAVAILABLE,
|
||||
"fleet_busy",
|
||||
err.to_string(),
|
||||
);
|
||||
}
|
||||
ApiError::new(
|
||||
StatusCode::INTERNAL_SERVER_ERROR,
|
||||
fallback_code,
|
||||
err.to_string(),
|
||||
)
|
||||
}
|
||||
|
||||
#[tracing::instrument(name = "fleet_list", skip_all)]
|
||||
pub async fn list_fleet_devices(
|
||||
State(state): State<AppState>,
|
||||
@@ -60,11 +75,7 @@ pub async fn list_fleet_devices(
|
||||
Ok(devices) => Ok((StatusCode::OK, Json(devices))),
|
||||
Err(err) => {
|
||||
warn!(error = %err, "failed to list fleet devices");
|
||||
Err(ApiError::new(
|
||||
StatusCode::INTERNAL_SERVER_ERROR,
|
||||
"list_fleet_devices_failed",
|
||||
err.to_string(),
|
||||
))
|
||||
Err(fleet_error(err, "list_fleet_devices_failed"))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -226,11 +237,7 @@ pub async fn wake_fleet_device(
|
||||
};
|
||||
let devices = load_fleet_devices(&state, &query).await.map_err(|err| {
|
||||
warn!(error = %err, "failed loading fleet devices for wake");
|
||||
ApiError::new(
|
||||
StatusCode::INTERNAL_SERVER_ERROR,
|
||||
"load_fleet_devices_failed",
|
||||
err.to_string(),
|
||||
)
|
||||
fleet_error(err, "load_fleet_devices_failed")
|
||||
})?;
|
||||
|
||||
let device = devices
|
||||
|
||||
@@ -12,6 +12,22 @@ use super::normalize_refresh_agent_ids;
|
||||
use super::types::ListFleetDevicesQuery;
|
||||
use crate::state::{AgentDeviceRow, AgentDeviceWithChildren, DeviceIdentifier, KnownDevice};
|
||||
|
||||
#[test]
|
||||
fn cache_rebuild_limit_is_retryable_but_db_failures_keep_their_error_code() {
|
||||
let busy = super::fleet_error(
|
||||
crate::runtime::view_cache::RebuildLimit.into(),
|
||||
"list_fleet_devices_failed",
|
||||
);
|
||||
assert_eq!(busy.status, axum::http::StatusCode::SERVICE_UNAVAILABLE);
|
||||
assert_eq!(busy.code, "fleet_busy");
|
||||
let failed = super::fleet_error(
|
||||
anyhow::anyhow!("database failed"),
|
||||
"list_fleet_devices_failed",
|
||||
);
|
||||
assert_eq!(failed.status, axum::http::StatusCode::INTERNAL_SERVER_ERROR);
|
||||
assert_eq!(failed.code, "list_fleet_devices_failed");
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn fleet_cache_tracks_store_edits_and_connections_without_caching_filters() {
|
||||
use crate::runtime::{AgentSession, AppState};
|
||||
|
||||
Reference in new issue
Block a user