Add some internal logging
Signed-off-by: Lee Smet <lee.smet@hotmail.com>
This commit is contained in:
@@ -6,6 +6,7 @@ use serde::de::DeserializeOwned;
|
||||
use serde_json::{Map as JsonMap, Value};
|
||||
use tokio::sync::Mutex;
|
||||
|
||||
use tracing::{error, warn, info, debug, trace};
|
||||
use crate::models::{
|
||||
Actor, Context, Flow, FlowStatus, Job, JobStatus, Message, MessageStatus, Runner, TransportStatus,
|
||||
};
|
||||
@@ -52,8 +53,14 @@ impl RedisDriver {
|
||||
|
||||
// Slow path: create a new manager and cache it
|
||||
let url = format!("{}/{}", self.base_addr.trim_end_matches('/'), db);
|
||||
let client = redis::Client::open(url.as_str())?;
|
||||
let cm = client.get_connection_manager().await?;
|
||||
let client = redis::Client::open(url.as_str()).map_err(|e| {
|
||||
error!(%url, db=%db, error=%e, "Redis client open failed");
|
||||
e
|
||||
})?;
|
||||
let cm = client.get_connection_manager().await.map_err(|e| {
|
||||
error!(%url, db=%db, error=%e, "Redis connection manager init failed");
|
||||
e
|
||||
})?;
|
||||
|
||||
let mut guard = self.managers.lock().await;
|
||||
let entry = guard.entry(db).or_insert(cm);
|
||||
@@ -104,21 +111,37 @@ impl RedisDriver {
|
||||
|
||||
async fn hset_model<T: Serialize>(&self, db: u32, key: &str, model: &T) -> Result<()> {
|
||||
let mut cm = self.manager_for_db(db).await?;
|
||||
let pairs = Self::struct_to_hset_pairs(model)?;
|
||||
let pairs = Self::struct_to_hset_pairs(model).map_err(|e| {
|
||||
error!(db=%db, key=%key, error=%e, "Serialize model to HSET pairs failed");
|
||||
e
|
||||
})?;
|
||||
// Ensure no stale fields
|
||||
let _: u64 = cm.del(key).await.unwrap_or(0);
|
||||
let del_res: redis::RedisResult<u64> = cm.del(key).await;
|
||||
if let Err(e) = del_res {
|
||||
warn!(db=%db, key=%key, error=%e, "DEL before HSET failed");
|
||||
}
|
||||
// Write all fields
|
||||
let _: usize = cm.hset_multiple(key, &pairs).await?;
|
||||
let _: usize = cm.hset_multiple(key, &pairs).await.map_err(|e| {
|
||||
error!(db=%db, key=%key, error=%e, "HSET multiple failed");
|
||||
e
|
||||
})?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
async fn hget_model<T: DeserializeOwned>(&self, db: u32, key: &str) -> Result<T> {
|
||||
let mut cm = self.manager_for_db(db).await?;
|
||||
let map: StdHashMap<String, String> = cm.hgetall(key).await?;
|
||||
let map: StdHashMap<String, String> = cm.hgetall(key).await.map_err(|e| {
|
||||
error!(db=%db, key=%key, error=%e, "HGETALL failed");
|
||||
e
|
||||
})?;
|
||||
if map.is_empty() {
|
||||
// NotFound is expected in some flows; don't log as error
|
||||
return Err(format!("Key not found: {}", key).into());
|
||||
}
|
||||
Self::hmap_to_struct(map)
|
||||
Self::hmap_to_struct(map).map_err(|e| {
|
||||
error!(db=%db, key=%key, error=%e, "Deserialize model from HGETALL failed");
|
||||
e
|
||||
})
|
||||
}
|
||||
|
||||
// -----------------------------
|
||||
@@ -299,7 +322,10 @@ impl RedisDriver {
|
||||
("status".to_string(), status_str),
|
||||
("updated_at".to_string(), ts.to_string()),
|
||||
];
|
||||
let _: usize = cm.hset_multiple(key, &pairs).await?;
|
||||
let _: usize = cm.hset_multiple(&key, &pairs).await.map_err(|e| {
|
||||
error!(db=%db, key=%key, error=%e, "HSET update_job_status failed");
|
||||
e
|
||||
})?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -345,7 +371,10 @@ impl RedisDriver {
|
||||
("status".to_string(), status_str),
|
||||
("updated_at".to_string(), ts.to_string()),
|
||||
];
|
||||
let _: usize = cm.hset_multiple(key, &pairs).await?;
|
||||
let _: usize = cm.hset_multiple(&key, &pairs).await.map_err(|e| {
|
||||
error!(db=%db, key=%key, error=%e, "HSET update_flow_status failed");
|
||||
e
|
||||
})?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -370,7 +399,10 @@ impl RedisDriver {
|
||||
("status".to_string(), status_str),
|
||||
("updated_at".to_string(), ts.to_string()),
|
||||
];
|
||||
let _: usize = cm.hset_multiple(key, &pairs).await?;
|
||||
let _: usize = cm.hset_multiple(&key, &pairs).await.map_err(|e| {
|
||||
error!(db=%db, key=%key, error=%e, "HSET update_message_status failed");
|
||||
e
|
||||
})?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -404,7 +436,10 @@ impl RedisDriver {
|
||||
let ts = crate::time::current_timestamp();
|
||||
pairs.push(("updated_at".to_string(), ts.to_string()));
|
||||
|
||||
let _: usize = cm.hset_multiple(key, &pairs).await?;
|
||||
let _: usize = cm.hset_multiple(&key, &pairs).await.map_err(|e| {
|
||||
error!(db=%db, key=%key, error=%e, "HSET update_message_transport failed");
|
||||
e
|
||||
})?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -437,7 +472,10 @@ impl RedisDriver {
|
||||
("env_vars".to_string(), env_vars_str),
|
||||
("updated_at".to_string(), ts.to_string()),
|
||||
];
|
||||
let _: usize = cm.hset_multiple(key, &pairs).await?;
|
||||
let _: usize = cm.hset_multiple(&key, &pairs).await.map_err(|e| {
|
||||
error!(db=%db, key=%key, error=%e, "HSET update_flow_env_vars_merge failed");
|
||||
e
|
||||
})?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -470,7 +508,10 @@ impl RedisDriver {
|
||||
("result".to_string(), result_str),
|
||||
("updated_at".to_string(), ts.to_string()),
|
||||
];
|
||||
let _: usize = cm.hset_multiple(key, &pairs).await?;
|
||||
let _: usize = cm.hset_multiple(&key, &pairs).await.map_err(|e| {
|
||||
error!(db=%db, key=%key, error=%e, "HSET update_flow_result_merge failed");
|
||||
e
|
||||
})?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -504,7 +545,10 @@ impl RedisDriver {
|
||||
("env_vars".to_string(), env_vars_str),
|
||||
("updated_at".to_string(), ts.to_string()),
|
||||
];
|
||||
let _: usize = cm.hset_multiple(key, &pairs).await?;
|
||||
let _: usize = cm.hset_multiple(&key, &pairs).await.map_err(|e| {
|
||||
error!(db=%db, key=%key, error=%e, "HSET update_job_env_vars_merge failed");
|
||||
e
|
||||
})?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -538,7 +582,10 @@ impl RedisDriver {
|
||||
("result".to_string(), result_str),
|
||||
("updated_at".to_string(), ts.to_string()),
|
||||
];
|
||||
let _: usize = cm.hset_multiple(key, &pairs).await?;
|
||||
let _: usize = cm.hset_multiple(&key, &pairs).await.map_err(|e| {
|
||||
error!(db=%db, key=%key, error=%e, "HSET update_job_result_merge failed");
|
||||
e
|
||||
})?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -553,7 +600,10 @@ impl RedisDriver {
|
||||
("jobs".to_string(), jobs_str),
|
||||
("updated_at".to_string(), ts.to_string()),
|
||||
];
|
||||
let _: usize = cm.hset_multiple(key, &pairs).await?;
|
||||
let _: usize = cm.hset_multiple(&key, &pairs).await.map_err(|e| {
|
||||
error!(db=%db, key=%key, error=%e, "HSET update_flow_jobs_set failed");
|
||||
e
|
||||
})?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -584,7 +634,10 @@ impl RedisDriver {
|
||||
("logs".to_string(), logs_str),
|
||||
("updated_at".to_string(), ts.to_string()),
|
||||
];
|
||||
let _: usize = cm.hset_multiple(key, &pairs).await?;
|
||||
let _: usize = cm.hset_multiple(&key, &pairs).await.map_err(|e| {
|
||||
error!(db=%db, key=%key, error=%e, "HSET append_message_logs failed");
|
||||
e
|
||||
})?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -595,7 +648,10 @@ impl RedisDriver {
|
||||
/// Push a value onto a Redis list using LPUSH in the given DB.
|
||||
pub async fn lpush_list(&self, db: u32, list: &str, value: &str) -> Result<()> {
|
||||
let mut cm = self.manager_for_db(db).await?;
|
||||
let _: i64 = cm.lpush(list, value).await?;
|
||||
let _: i64 = cm.lpush(list, value).await.map_err(|e| {
|
||||
error!(db=%db, list=%list, value=%value, error=%e, "LPUSH failed");
|
||||
e
|
||||
})?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -615,7 +671,11 @@ impl RedisDriver {
|
||||
.arg("msg_out")
|
||||
.arg(timeout_secs)
|
||||
.query_async(&mut cm)
|
||||
.await?;
|
||||
.await
|
||||
.map_err(|e| {
|
||||
error!(db=%db, timeout_secs=%timeout_secs, error=%e, "BRPOP failed");
|
||||
e
|
||||
})?;
|
||||
Ok(res.map(|(_, v)| v))
|
||||
}
|
||||
|
||||
@@ -632,7 +692,11 @@ impl RedisDriver {
|
||||
.arg("COUNT")
|
||||
.arg(100)
|
||||
.query_async(&mut cm)
|
||||
.await?;
|
||||
.await
|
||||
.map_err(|e| {
|
||||
error!(db=%db, cursor=%cursor, error=%e, "SCAN failed");
|
||||
e
|
||||
})?;
|
||||
for k in keys {
|
||||
if let Ok(r) = self.hget_model::<Runner>(db, &k).await {
|
||||
out.push(r);
|
||||
@@ -653,7 +717,10 @@ impl RedisDriver {
|
||||
/// Register a context id in the global set "contexts" stored in DB 0.
|
||||
pub async fn register_context_id(&self, id: u32) -> Result<()> {
|
||||
let mut cm = self.manager_for_db(0).await?;
|
||||
let _: i64 = redis::cmd("SADD").arg("contexts").arg(id).query_async(&mut cm).await?;
|
||||
let _: i64 = redis::cmd("SADD").arg("contexts").arg(id).query_async(&mut cm).await.map_err(|e| {
|
||||
error!(db=0, context_id=%id, error=%e, "SADD contexts failed");
|
||||
e
|
||||
})?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -661,7 +728,10 @@ impl RedisDriver {
|
||||
pub async fn list_context_ids(&self) -> Result<Vec<u32>> {
|
||||
let mut cm = self.manager_for_db(0).await?;
|
||||
// Using SMEMBERS and parsing into u32
|
||||
let vals: Vec<String> = redis::cmd("SMEMBERS").arg("contexts").query_async(&mut cm).await?;
|
||||
let vals: Vec<String> = redis::cmd("SMEMBERS").arg("contexts").query_async(&mut cm).await.map_err(|e| {
|
||||
error!(db=0, error=%e, "SMEMBERS contexts failed");
|
||||
e
|
||||
})?;
|
||||
let mut out = Vec::with_capacity(vals.len());
|
||||
for v in vals {
|
||||
if let Ok(n) = v.parse::<u32>() {
|
||||
|
Reference in New Issue
Block a user