feat(homeserver): custom tracing layer support pubky:// urls for tenants #64

This commit is contained in:
nazeh
2025-01-22 21:56:24 +03:00
parent 2ef87f3511
commit 7ed43f0fba
4 changed files with 28 additions and 11 deletions

View File

@@ -1,4 +1,4 @@
use std::collections::HashMap; use std::{collections::HashMap, fmt::Display};
use axum::{ use axum::{
async_trait, async_trait,
@@ -21,6 +21,12 @@ impl PubkyHost {
} }
} }
impl Display for PubkyHost {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.0)
}
}
#[async_trait] #[async_trait]
impl<S> FromRequestParts<S> for PubkyHost impl<S> FromRequestParts<S> for PubkyHost
where where

View File

@@ -2,11 +2,13 @@ use std::sync::Arc;
use axum::{extract::Request, Router}; use axum::{extract::Request, Router};
use tower_http::trace::{ use tower_http::trace::{
DefaultMakeSpan, DefaultOnFailure, DefaultOnRequest, DefaultOnResponse, MakeSpan, OnFailure, DefaultOnFailure, DefaultOnRequest, DefaultOnResponse, OnFailure, OnRequest, OnResponse,
OnRequest, OnResponse, TraceLayer, TraceLayer,
}; };
use tracing::{Level, Span}; use tracing::{Level, Span};
use crate::core::extractors::PubkyHost;
pub fn with_trace_layer(router: Router, excluded_paths: &[&str]) -> Router { pub fn with_trace_layer(router: Router, excluded_paths: &[&str]) -> Router {
let excluded_paths = Arc::new( let excluded_paths = Arc::new(
excluded_paths excluded_paths
@@ -23,7 +25,20 @@ pub fn with_trace_layer(router: Router, excluded_paths: &[&str]) -> Router {
tracing::span!(Level::INFO, "request", excluded = true) tracing::span!(Level::INFO, "request", excluded = true)
} else { } else {
// Use the default span for other endpoints // Use the default span for other endpoints
DefaultMakeSpan::new().make_span(request)
let uri = if let Some(pubky_host) = request.extensions().get::<PubkyHost>() {
format!("pubky://{pubky_host}{}", request.uri())
} else {
request.uri().to_string()
};
tracing::span!(
Level::INFO,
"request",
method = %request.method(),
uri = ?uri,
version = ?request.version(),
)
} }
}) })
.on_request(|request: &Request, span: &Span| { .on_request(|request: &Request, span: &Span| {

View File

@@ -9,7 +9,7 @@ use tower_http::cors::CorsLayer;
use crate::core::AppState; use crate::core::AppState;
use super::layers::trace::with_trace_layer; use super::layers::{pubky_host::PubkyHostLayer, trace::with_trace_layer};
mod auth; mod auth;
mod feed; mod feed;
@@ -37,5 +37,5 @@ pub fn create_app(state: AppState) -> Router {
.layer(CorsLayer::very_permissive()) .layer(CorsLayer::very_permissive())
.with_state(state); .with_state(state);
with_trace_layer(app, &TRACING_EXCLUDED_PATHS) with_trace_layer(app, &TRACING_EXCLUDED_PATHS).layer(PubkyHostLayer)
} }

View File

@@ -9,10 +9,7 @@ use axum::{
Router, Router,
}; };
use crate::core::{ use crate::core::{layers::authz::AuthorizationLayer, AppState};
layers::{authz::AuthorizationLayer, pubky_host::PubkyHostLayer},
AppState,
};
pub mod read; pub mod read;
pub mod session; pub mod session;
@@ -33,5 +30,4 @@ pub fn router(state: AppState) -> Router<AppState> {
// TODO: different max size for sessions and other routes? // TODO: different max size for sessions and other routes?
.layer(DefaultBodyLimit::max(100 * 1024 * 1024)) .layer(DefaultBodyLimit::max(100 * 1024 * 1024))
.layer(AuthorizationLayer::new(state.clone())) .layer(AuthorizationLayer::new(state.clone()))
.layer(PubkyHostLayer)
} }