Add request tracing, debug /v1/keys/list endpoint

- TraceLayer logs every HTTP request (method, path, status, duration)
- Default log level info, tower_http=debug (no RUST_LOG needed)
- GET /v1/keys/list shows all registered fingerprints
- Helps debug key registration and lookup issues

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Siavash Sameni
2026-03-26 22:43:54 +04:00
parent 8dd45b1bfe
commit bc64afcb05
2 changed files with 23 additions and 1 deletions

View File

@@ -20,7 +20,12 @@ struct Cli {
#[tokio::main]
async fn main() -> anyhow::Result<()> {
tracing_subscriber::fmt::init();
tracing_subscriber::fmt()
.with_env_filter(
tracing_subscriber::EnvFilter::try_from_default_env()
.unwrap_or_else(|_| "info,tower_http=debug".parse().unwrap()),
)
.init();
let cli = Cli::parse();
tracing::info!("Warzone server starting on {}", cli.bind);
@@ -30,6 +35,7 @@ async fn main() -> anyhow::Result<()> {
let app = axum::Router::new()
.merge(routes::web_router())
.nest("/v1", routes::router())
.layer(tower_http::trace::TraceLayer::new_for_http())
.with_state(state);
let listener = tokio::net::TcpListener::bind(&cli.bind).await?;

View File

@@ -10,9 +10,25 @@ use crate::state::AppState;
pub fn routes() -> Router<AppState> {
Router::new()
.route("/keys/register", post(register_keys))
.route("/keys/list", get(list_keys))
.route("/keys/{fingerprint}", get(get_bundle))
}
/// Debug endpoint: list all registered fingerprints.
async fn list_keys(State(state): State<AppState>) -> Json<serde_json::Value> {
let keys: Vec<String> = state
.db
.keys
.iter()
.filter_map(|item| {
item.ok()
.and_then(|(k, _)| String::from_utf8(k.to_vec()).ok())
})
.collect();
tracing::info!("Listed {} registered keys", keys.len());
Json(serde_json::json!({ "keys": keys, "count": keys.len() }))
}
/// Normalize fingerprint: strip colons, lowercase.
fn normalize_fp(fp: &str) -> String {
fp.chars()