Skip to content

Commit 41752e9

Browse files
committed
add debugging for x5_camera
1 parent bc4bed8 commit 41752e9

5 files changed

Lines changed: 127 additions & 5 deletions

File tree

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

booster_sdk/src/dds/rpc.rs

Lines changed: 85 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ pub struct RpcClient {
5454
request_writer: rustdds::no_key::DataWriter<RpcReqMsg>,
5555
response_reader: Arc<Mutex<DataReader<RpcRespMsg>>>,
5656
default_timeout: Duration,
57+
service_topic: String,
5758
}
5859

5960
#[derive(Debug, Deserialize, Default)]
@@ -99,6 +100,33 @@ fn normalize_service_topic(service_topic: &str) -> String {
99100
trimmed.to_owned()
100101
}
101102

103+
fn rpc_debug_enabled() -> bool {
104+
std::env::var("BOOSTER_RPC_DEBUG")
105+
.map(|value| {
106+
let value = value.trim();
107+
value == "1"
108+
|| value.eq_ignore_ascii_case("true")
109+
|| value.eq_ignore_ascii_case("yes")
110+
|| value.eq_ignore_ascii_case("on")
111+
})
112+
.unwrap_or(false)
113+
}
114+
115+
fn preview_for_log(value: &str, max_chars: usize) -> String {
116+
let mut preview = String::new();
117+
let mut chars = value.chars();
118+
for _ in 0..max_chars {
119+
match chars.next() {
120+
Some(ch) => preview.push(ch),
121+
None => return preview.replace('\n', "\\n"),
122+
}
123+
}
124+
if chars.next().is_some() {
125+
preview.push_str("...");
126+
}
127+
preview.replace('\n', "\\n")
128+
}
129+
102130
impl RpcClient {
103131
pub fn for_topic(options: RpcClientOptions, service_topic: impl Into<String>) -> Result<Self> {
104132
Self::new(options.with_service_topic(service_topic))
@@ -120,6 +148,7 @@ impl RpcClient {
120148
request_writer: request_writer.into_inner(),
121149
response_reader: Arc::new(Mutex::new(response_reader)),
122150
default_timeout: options.default_timeout,
151+
service_topic,
123152
})
124153
}
125154

@@ -199,9 +228,23 @@ impl RpcClient {
199228
where
200229
R: DeserializeOwned + Send + 'static,
201230
{
231+
let debug_enabled = rpc_debug_enabled();
202232
let request_id = Uuid::new_v4().to_string();
203233
let body = body.into();
204234
let header = serde_json::json!({ "api_id": api_id }).to_string();
235+
let service_topic = self.service_topic.clone();
236+
237+
if debug_enabled {
238+
tracing::debug!(
239+
target: "booster_sdk::rpc",
240+
service_topic = %service_topic,
241+
api_id,
242+
request_uuid = %request_id,
243+
header = %preview_for_log(&header, 200),
244+
body = %preview_for_log(&body, 300),
245+
"send rpc request"
246+
);
247+
}
205248

206249
let request = RpcReqMsg {
207250
uuid: request_id.clone(),
@@ -224,19 +267,48 @@ impl RpcClient {
224267
.map_err(|err| DdsError::ReceiveFailed(err.to_string()))?;
225268
loop {
226269
if Instant::now() >= deadline {
270+
if debug_enabled {
271+
tracing::warn!(
272+
target: "booster_sdk::rpc",
273+
service_topic = %service_topic,
274+
api_id,
275+
request_uuid = %request_id,
276+
timeout_ms = timeout.as_millis(),
277+
"rpc timeout"
278+
);
279+
}
227280
return Err(RpcError::Timeout { timeout }.into());
228281
}
229282

230283
match reader.take_next_sample() {
231284
Ok(Some(sample)) => {
232285
let response = sample.into_value();
233-
if response.uuid != request_id {
234-
continue;
235-
}
236286

237287
let status_code = parse_status_from_header(&response.header).unwrap_or(0);
288+
if debug_enabled {
289+
tracing::debug!(
290+
target: "booster_sdk::rpc",
291+
service_topic = %service_topic,
292+
api_id,
293+
request_uuid = %request_id,
294+
response_uuid = %response.uuid,
295+
status_code,
296+
header = %preview_for_log(&response.header, 200),
297+
body = %preview_for_log(&response.body, 300),
298+
"recv rpc response"
299+
);
300+
}
238301

239302
if status_code == -1 {
303+
if debug_enabled {
304+
tracing::debug!(
305+
target: "booster_sdk::rpc",
306+
service_topic = %service_topic,
307+
api_id,
308+
request_uuid = %request_id,
309+
"ignoring intermediate status=-1"
310+
);
311+
}
240312
continue;
241313
}
242314

@@ -260,6 +332,16 @@ impl RpcClient {
260332
}
261333
Ok(None) => std::thread::sleep(Duration::from_millis(5)),
262334
Err(err) => {
335+
if debug_enabled {
336+
tracing::warn!(
337+
target: "booster_sdk::rpc",
338+
service_topic = %service_topic,
339+
api_id,
340+
request_uuid = %request_id,
341+
error = %err,
342+
"rpc receive error"
343+
);
344+
}
263345
return Err(DdsError::ReceiveFailed(err.to_string()).into());
264346
}
265347
}

booster_sdk/src/dds/topics.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ pub fn rpc_request_topic(service_topic: &str) -> TopicSpec {
5353
TopicSpec {
5454
name: format!("{service_topic}Req"),
5555
type_name: TYPE_RPC_REQ,
56-
qos: qos_reliable_keep_last(10),
56+
qos: qos_best_effort_keep_last(10),
5757
kind: TopicKind::NoKey,
5858
}
5959
}
@@ -62,7 +62,7 @@ pub fn rpc_response_topic(service_topic: &str) -> TopicSpec {
6262
TopicSpec {
6363
name: format!("{service_topic}Resp"),
6464
type_name: TYPE_RPC_RESP,
65-
qos: qos_reliable_keep_last(10),
65+
qos: qos_best_effort_keep_last(10),
6666
kind: TopicKind::NoKey,
6767
}
6868
}

booster_sdk_py/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,4 @@ booster_sdk = { workspace = true }
1616
pyo3 = { workspace = true }
1717
tokio = { workspace = true }
1818
tracing = { workspace = true }
19+
tracing-subscriber = { workspace = true }

booster_sdk_py/src/lib.rs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,55 @@
11
mod client;
22
mod runtime;
33

4+
use std::sync::OnceLock;
5+
46
use booster_sdk::{client::ai::BOOSTER_ROBOT_USER_ID, types::BoosterError};
57
use pyo3::{exceptions::PyException, prelude::*, types::PyModule};
8+
use tracing_subscriber::{EnvFilter, fmt};
69

710
pyo3::create_exception!(booster_sdk_bindings, BoosterSdkError, PyException);
811

912
pub(crate) fn to_py_err(err: BoosterError) -> PyErr {
1013
BoosterSdkError::new_err(err.to_string())
1114
}
1215

16+
fn rpc_debug_enabled() -> bool {
17+
std::env::var("BOOSTER_RPC_DEBUG")
18+
.map(|value| {
19+
let value = value.trim();
20+
value == "1"
21+
|| value.eq_ignore_ascii_case("true")
22+
|| value.eq_ignore_ascii_case("yes")
23+
|| value.eq_ignore_ascii_case("on")
24+
})
25+
.unwrap_or(false)
26+
}
27+
28+
fn init_tracing_for_python() {
29+
static INIT: OnceLock<()> = OnceLock::new();
30+
INIT.get_or_init(|| {
31+
if !rpc_debug_enabled() {
32+
return;
33+
}
34+
35+
let env_filter = std::env::var("RUST_LOG")
36+
.ok()
37+
.and_then(|value| EnvFilter::try_new(value).ok())
38+
.unwrap_or_else(|| EnvFilter::new("booster_sdk::rpc=debug"));
39+
40+
let _ = fmt()
41+
.with_env_filter(env_filter)
42+
.with_target(true)
43+
.with_thread_ids(true)
44+
.with_writer(std::io::stderr)
45+
.try_init();
46+
});
47+
}
48+
1349
#[pymodule]
1450
fn booster_sdk_bindings(py: Python<'_>, m: &Bound<'_, PyModule>) -> PyResult<()> {
51+
init_tracing_for_python();
52+
1553
m.add("BoosterSdkError", py.get_type::<BoosterSdkError>())?;
1654
m.add("BOOSTER_ROBOT_USER_ID", BOOSTER_ROBOT_USER_ID)?;
1755

0 commit comments

Comments
 (0)