Skip to content

Commit d3694bb

Browse files
authored
fix(uptime): add better logging for check config failures (#485)
We've seen an instance of a badly-formed assert make it into production, somehow. Add some logging to help us find the subscription, when this happens.
1 parent 17e86e8 commit d3694bb

File tree

1 file changed

+34
-26
lines changed

1 file changed

+34
-26
lines changed

src/check_config_provider/redis_config_provider.rs

Lines changed: 34 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
1-
use anyhow::Result;
2-
use std::sync::Arc;
3-
use std::{collections::HashSet, time::Instant};
4-
use tokio::task::JoinHandle;
5-
use tokio_util::sync::CancellationToken;
6-
71
use crate::{
82
app::config::Config, manager::Manager, redis::RedisClient, types::check_config::CheckConfig,
93
};
10-
4+
use anyhow::Result;
115
use serde::{Deserialize, Serialize};
126
use serde_with::serde_as;
7+
use std::sync::Arc;
138
use std::time::Duration;
9+
use std::{collections::HashSet, time::Instant};
10+
use tokio::task::JoinHandle;
1411
use tokio::time::interval;
12+
use tokio_util::sync::CancellationToken;
1513
use uuid::Uuid;
1614

1715
#[derive(Debug)]
@@ -73,6 +71,20 @@ pub struct RedisConfigProvider {
7371
check_interval: Duration,
7472
}
7573

74+
fn deserialize_rmp(config_payload: &[u8]) -> Option<CheckConfig> {
75+
match rmp_serde::from_slice::<CheckConfig>(config_payload) {
76+
Ok(config) => Some(config),
77+
Err(err) => {
78+
if let Ok(config) = rmp_serde::from_slice::<serde_json::Value>(config_payload) {
79+
tracing::error!(?err, ?config, "config_consumer.invalid_config_message");
80+
} else {
81+
tracing::error!(?err, "config_consumer.invalid_config_message");
82+
}
83+
None
84+
}
85+
}
86+
}
87+
7688
impl RedisConfigProvider {
7789
pub fn new(
7890
redis_url: &str,
@@ -158,14 +170,13 @@ impl RedisConfigProvider {
158170
.set(config_payloads.len() as f64);
159171

160172
for config_payload in config_payloads {
161-
match rmp_serde::from_slice(&config_payload) {
162-
Ok(config) => manager
173+
if let Some(config) = deserialize_rmp(&config_payload) {
174+
manager
163175
.get_service(partition.number)
164176
.get_config_store()
165177
.write()
166178
.expect("lock not poisoned")
167-
.add_config(config),
168-
Err(err) => tracing::error!(?err, "config_consumer.invalid_config_message"),
179+
.add_config(config);
169180
}
170181
}
171182
let partition_loading_time = partition_start_loading.elapsed().as_secs_f64();
@@ -250,21 +261,18 @@ impl RedisConfigProvider {
250261
.await;
251262

252263
for config_payload in config_payloads {
253-
match rmp_serde::from_slice::<CheckConfig>(&config_payload) {
254-
Ok(config) => {
255-
tracing::debug!(
256-
partition = partition.number,
257-
subscription_id = %config.subscription_id,
258-
"redis_config_provider.upserting_config"
259-
);
260-
manager
261-
.get_service(partition.number)
262-
.get_config_store()
263-
.write()
264-
.expect("lock not poisoned")
265-
.add_config(config);
266-
}
267-
Err(err) => tracing::error!(?err, "config_consumer.invalid_config_message"),
264+
if let Some(config) = deserialize_rmp(&config_payload) {
265+
tracing::debug!(
266+
partition = partition.number,
267+
subscription_id = %config.subscription_id,
268+
"redis_config_provider.upserting_config"
269+
);
270+
manager
271+
.get_service(partition.number)
272+
.get_config_store()
273+
.write()
274+
.expect("lock not poisoned")
275+
.add_config(config);
268276
}
269277
}
270278
let partition_update_duration = partition_update_start.elapsed().as_secs_f64();

0 commit comments

Comments
 (0)