timing slow fuck
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
use anyhow::{Context, Result};
|
use anyhow::{Context, Result};
|
||||||
use futures_util::{SinkExt, StreamExt};
|
use futures_util::{SinkExt, StreamExt};
|
||||||
|
use std::time::Instant;
|
||||||
use tokio::time::{Duration, MissedTickBehavior, interval, sleep};
|
use tokio::time::{Duration, MissedTickBehavior, interval, sleep};
|
||||||
use tokio_tungstenite::{connect_async, tungstenite::Message};
|
use tokio_tungstenite::{connect_async, tungstenite::Message};
|
||||||
use tracing::{debug, error, info, info_span, warn};
|
use tracing::{debug, error, info, info_span, warn};
|
||||||
@@ -38,9 +39,15 @@ async fn run_once(config: &AgentConfig) -> Result<()> {
|
|||||||
|
|
||||||
let ws_url = websocket_url(&config.server_url)?;
|
let ws_url = websocket_url(&config.server_url)?;
|
||||||
info!(%ws_url, agent_id = %config.agent_id, "connecting agent websocket");
|
info!(%ws_url, agent_id = %config.agent_id, "connecting agent websocket");
|
||||||
|
let connect_started = Instant::now();
|
||||||
let (stream, _) = connect_async(ws_url.as_str())
|
let (stream, _) = connect_async(ws_url.as_str())
|
||||||
.await
|
.await
|
||||||
.context("failed to connect websocket")?;
|
.context("failed to connect websocket")?;
|
||||||
|
let ws_connect_ms = connect_started.elapsed().as_millis() as u64;
|
||||||
|
info!(%ws_url, agent_id = %config.agent_id, ws_connect_ms, "agent websocket connected");
|
||||||
|
if ws_connect_ms > 10_000 {
|
||||||
|
warn!(%ws_url, agent_id = %config.agent_id, ws_connect_ms, "agent websocket connect was slow");
|
||||||
|
}
|
||||||
let (mut sink, mut source) = stream.split();
|
let (mut sink, mut source) = stream.split();
|
||||||
|
|
||||||
send_json(&mut sink, &ClientMessage::Hello {
|
send_json(&mut sink, &ClientMessage::Hello {
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ use axum::extract::ws::{Message, WebSocket, WebSocketUpgrade};
|
|||||||
use axum::response::IntoResponse;
|
use axum::response::IntoResponse;
|
||||||
use futures_util::{SinkExt, StreamExt};
|
use futures_util::{SinkExt, StreamExt};
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
|
use std::time::Instant;
|
||||||
use tokio::sync::mpsc;
|
use tokio::sync::mpsc;
|
||||||
use tracing::{debug, info, info_span, warn};
|
use tracing::{debug, info, info_span, warn};
|
||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
@@ -44,6 +45,7 @@ async fn handle_agent_socket(state: AppState, socket: WebSocket) {
|
|||||||
let span = info_span!("agent_ws_connection", connection_id = %connection_id);
|
let span = info_span!("agent_ws_connection", connection_id = %connection_id);
|
||||||
let _span_guard = span.enter();
|
let _span_guard = span.enter();
|
||||||
info!("agent websocket upgraded");
|
info!("agent websocket upgraded");
|
||||||
|
let connected_at = Instant::now();
|
||||||
|
|
||||||
let (mut write, mut read) = socket.split();
|
let (mut write, mut read) = socket.split();
|
||||||
let (tx, mut rx) = mpsc::unbounded_channel::<ServerMessage>();
|
let (tx, mut rx) = mpsc::unbounded_channel::<ServerMessage>();
|
||||||
@@ -66,6 +68,7 @@ async fn handle_agent_socket(state: AppState, socket: WebSocket) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
let mut authed_agent_id: Option<String> = None;
|
let mut authed_agent_id: Option<String> = None;
|
||||||
|
let mut hello_at: Option<Instant> = None;
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
let frame = read.next().await;
|
let frame = read.next().await;
|
||||||
@@ -83,7 +86,15 @@ async fn handle_agent_socket(state: AppState, socket: WebSocket) {
|
|||||||
|
|
||||||
match msg {
|
match msg {
|
||||||
Message::Text(text) => {
|
Message::Text(text) => {
|
||||||
if let Err(err) = process_agent_text(&state, &tx, &mut authed_agent_id, &text).await
|
if let Err(err) = process_agent_text(
|
||||||
|
&state,
|
||||||
|
&tx,
|
||||||
|
&mut authed_agent_id,
|
||||||
|
&mut hello_at,
|
||||||
|
connected_at,
|
||||||
|
&text,
|
||||||
|
)
|
||||||
|
.await
|
||||||
{
|
{
|
||||||
warn!(error = %err, "closing agent websocket due to protocol/auth error");
|
warn!(error = %err, "closing agent websocket due to protocol/auth error");
|
||||||
break;
|
break;
|
||||||
@@ -131,6 +142,8 @@ async fn process_agent_text(
|
|||||||
state: &AppState,
|
state: &AppState,
|
||||||
tx: &mpsc::UnboundedSender<ServerMessage>,
|
tx: &mpsc::UnboundedSender<ServerMessage>,
|
||||||
authed_agent_id: &mut Option<String>,
|
authed_agent_id: &mut Option<String>,
|
||||||
|
hello_at: &mut Option<Instant>,
|
||||||
|
connected_at: Instant,
|
||||||
text: &str,
|
text: &str,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
let message: IncomingClientMessage =
|
let message: IncomingClientMessage =
|
||||||
@@ -138,12 +151,19 @@ async fn process_agent_text(
|
|||||||
|
|
||||||
match message {
|
match message {
|
||||||
IncomingClientMessage::Hello { agent_id } => {
|
IncomingClientMessage::Hello { agent_id } => {
|
||||||
debug!(agent_id = %agent_id, "agent hello received");
|
let now = Instant::now();
|
||||||
|
if hello_at.is_none() {
|
||||||
|
*hello_at = Some(now);
|
||||||
|
}
|
||||||
|
let connect_to_hello_ms = connected_at.elapsed().as_millis() as u64;
|
||||||
|
info!(agent_id = %agent_id, connect_to_hello_ms, "agent hello received");
|
||||||
}
|
}
|
||||||
IncomingClientMessage::Auth {
|
IncomingClientMessage::Auth {
|
||||||
agent_id,
|
agent_id,
|
||||||
agent_token,
|
agent_token,
|
||||||
} => {
|
} => {
|
||||||
|
let connect_to_auth_ms = connected_at.elapsed().as_millis() as u64;
|
||||||
|
let hello_to_auth_ms = hello_at.map(|t| now_duration_ms(t.elapsed()));
|
||||||
if !state
|
if !state
|
||||||
.store
|
.store
|
||||||
.verify_agent_token(&agent_id, &agent_token)
|
.verify_agent_token(&agent_id, &agent_token)
|
||||||
@@ -159,9 +179,12 @@ async fn process_agent_text(
|
|||||||
request_id: None,
|
request_id: None,
|
||||||
event_type: "agent_ws_auth".into(),
|
event_type: "agent_ws_auth".into(),
|
||||||
outcome: "rejected".into(),
|
outcome: "rejected".into(),
|
||||||
latency_ms: None,
|
latency_ms: Some(connect_to_auth_ms),
|
||||||
message: "agent auth rejected".into(),
|
message: "agent auth rejected".into(),
|
||||||
metadata: serde_json::json!({}),
|
metadata: serde_json::json!({
|
||||||
|
"connect_to_auth_ms": connect_to_auth_ms,
|
||||||
|
"hello_to_auth_ms": hello_to_auth_ms,
|
||||||
|
}),
|
||||||
})
|
})
|
||||||
.await
|
.await
|
||||||
{
|
{
|
||||||
@@ -175,7 +198,7 @@ async fn process_agent_text(
|
|||||||
.await
|
.await
|
||||||
.insert(agent_id.clone(), tx.clone());
|
.insert(agent_id.clone(), tx.clone());
|
||||||
*authed_agent_id = Some(agent_id.clone());
|
*authed_agent_id = Some(agent_id.clone());
|
||||||
info!(agent_id = %agent_id, "agent authenticated");
|
info!(agent_id = %agent_id, connect_to_auth_ms, hello_to_auth_ms = hello_to_auth_ms.unwrap_or(0), "agent authenticated");
|
||||||
if let Err(err) = state
|
if let Err(err) = state
|
||||||
.store
|
.store
|
||||||
.append_audit_event(AuditEventInput {
|
.append_audit_event(AuditEventInput {
|
||||||
@@ -185,9 +208,12 @@ async fn process_agent_text(
|
|||||||
request_id: None,
|
request_id: None,
|
||||||
event_type: "agent_ws_auth".into(),
|
event_type: "agent_ws_auth".into(),
|
||||||
outcome: "ok".into(),
|
outcome: "ok".into(),
|
||||||
latency_ms: None,
|
latency_ms: Some(connect_to_auth_ms),
|
||||||
message: "agent websocket authenticated".into(),
|
message: "agent websocket authenticated".into(),
|
||||||
metadata: serde_json::json!({}),
|
metadata: serde_json::json!({
|
||||||
|
"connect_to_auth_ms": connect_to_auth_ms,
|
||||||
|
"hello_to_auth_ms": hello_to_auth_ms,
|
||||||
|
}),
|
||||||
})
|
})
|
||||||
.await
|
.await
|
||||||
{
|
{
|
||||||
@@ -226,3 +252,7 @@ async fn process_agent_text(
|
|||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn now_duration_ms(duration: std::time::Duration) -> u64 {
|
||||||
|
duration.as_millis() as u64
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user