feat: Add telemetry, timing, and detailed logging across server, stub, and nvim-core

This commit is contained in:
Riz Ashraf committed 2026-09-19 04:13:07 +01:00
1 parent 26cf6cee80
commit 2fdb03c302
4 files changed
+62 -4

No files matched your search

+22 -2
View File
@@ -115,8 +115,22 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
match rx.recv().await {
Some(msg) => {
drop(rx);
tracing::info!("Forwarding message to target server (length: {}): {}", msg.len(), if msg.len() > 1000 { format!("{}...", &msg[..1000]) } else { msg.clone() });
let mut log_prefix = String::from("Message");
if let Ok(v) = serde_json::from_str::<serde_json::Value>(&msg) {
let method = v.get("method").and_then(|m| m.as_str()).unwrap_or("");
let id = v.get("id").unwrap_or(&serde_json::Value::Null);
if method == "tools/call" {
let tool = v.get("params").and_then(|p| p.get("name")).and_then(|n| n.as_str()).unwrap_or("unknown");
log_prefix = format!("ToolCall[{}] id={}", tool, id);
} else if !method.is_empty() {
log_prefix = format!("Request[{}] id={}", method, id);
} else if let Some(res_id) = v.get("id") {
log_prefix = format!("Response id={}", res_id);
}
}
tracing::info!(">>> [Stub] Forwarding {} to server (length: {}): {}", log_prefix, msg.len(), if msg.len() > 1000 { format!("{}...", &msg[..1000]) } else { msg.clone() });
if write.send(tokio_tungstenite::tungstenite::Message::Text(msg)).await.is_err() {
tracing::error!("Failed to write to websocket");
break;
}
@@ -129,7 +143,13 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut recv_task = tokio::spawn(async move {
while let Some(Ok(msg)) = read.next().await {
if let tokio_tungstenite::tungstenite::Message::Text(text) = msg {
tracing::info!("Received message from target server (length: {}): {}", text.len(), if text.len() > 1000 { format!("{}...", &text[..1000]) } else { text.clone() });
let mut log_prefix = String::from("Message");
if let Ok(v) = serde_json::from_str::<serde_json::Value>(&text) {
let id = v.get("id").unwrap_or(&serde_json::Value::Null);
let is_error = v.get("error").is_some() || v.get("result").and_then(|res| res.get("isError")).and_then(|e| e.as_bool()).unwrap_or(false);
log_prefix = format!("Response id={} [Error: {}]", id, is_error);
}
tracing::info!("<<< [Stub] Received {} from server (length: {}): {}", log_prefix, text.len(), if text.len() > 1000 { format!("{}...", &text[..1000]) } else { text.clone() });
let payload = format!("{}\n", text);
use tokio::io::AsyncWriteExt;
let mut stdout = tokio::io::stdout();