/
envoy.istio
/
qdrant
Обзор
Документация
Войти
/
envoy.istio
/
qdrant
Код
Запросы
0
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/common/stacktrace.rs
86 строк
3 KB
Luis Cossío
add target_os flag for rstack-self dependency (#2555)
04 сен 2023, 17:44
04 сен 2023, 17:44
e16b363
Код
Авторство
О чём код?
use schemars::JsonSchema; use serde::{Deserialize, Serialize}; #[derive(Deserialize, Serialize, JsonSchema, Debug)] struct StackTraceSymbol { name: Option<String>, file: Option<String>, line: Option<u32>, } #[derive(Deserialize, Serialize, JsonSchema, Debug)] struct StackTraceFrame { symbols: Vec<StackTraceSymbol>, } impl StackTraceFrame { pub fn render(&self) -> String { let mut result = String::new(); for symbol in &self.symbols { let symbol_string = format!( "{}:{} - {} ", symbol.file.as_deref().unwrap_or_default(), symbol.line.unwrap_or_default(), symbol.name.as_deref().unwrap_or_default(), ); result.push_str(&symbol_string); } result } } #[derive(Deserialize, Serialize, JsonSchema, Debug)] pub struct ThreadStackTrace { id: u32, name: String, frames: Vec<String>, } #[derive(Deserialize, Serialize, JsonSchema, Debug)] pub struct StackTrace { threads: Vec<ThreadStackTrace>, } pub fn get_stack_trace() -> StackTrace { #[cfg(not(all(target_os = "linux", feature = "stacktrace")))] { StackTrace { threads: vec![] } } #[cfg(all(target_os = "linux", feature = "stacktrace"))] { let exe = std::env::current_exe().unwrap(); let trace = rstack_self::trace(std::process::Command::new(exe).arg("--stacktrace")).unwrap(); StackTrace { threads: trace .threads() .iter() .map(|thread| ThreadStackTrace { id: thread.id(), name: thread.name().to_string(), frames: thread .frames() .iter() .map(|frame| { let frame = StackTraceFrame { symbols: frame .symbols() .iter() .map(|symbol| StackTraceSymbol { name: symbol.name().map(|name| name.to_string()), file: symbol.file().map(|file| { file.to_str().unwrap_or_default().to_string() }), line: symbol.line(), }) .collect(), }; frame.render() }) .collect(), }) .collect(), } } }