Open7

axumに関するところのメモ

うぽぽんうぽぽん

直接関係ないけどtracingのメモ

cargo.toml
[dependencies]
anyhow = "1.0.51"
axum = "0.4.2"
lambda-web = { version = "0.1.8", features=["hyper"] }
tokio = { version = "1", features = ["full"] }
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = [ "std", "env-filter" ] }

env-filterのfeaturesを追加しておくと、RUST_LOG変数からログの設定を読み込める

うぽぽんうぽぽん

mainの上の方にtracing_subscriber::fmt::init()をするとRUST_LOG変数からログの設定を読み込みます。
しかし、tracing_subscriber::fmt().init()しても環境変数から読み込まない。ということでEnvFilterを使います。
with_span_eventsをセットすると #[tracing::instrument(level="trace"] を設定したような関数で処理時間などのを表示可能

    tracing_subscriber::fmt().with_env_filter(EnvFilter::from_default_env()).with_span_events(FmtSpan::CLOSE).init();
    
    tracing::info!("kkkkk");
    tracing::debug!("fsadfa");
#[tracing::instrument(level="info")]
fn x() -> () {
    todo!()
}
うぽぽんうぽぽん

axumをaws lambdaで実行させる方法
lambda-webのドキュメントからほぼコピペ

cargo.toml
[dependencies]
anyhow = "1.0.51"
axum = "0.4.2"
lambda-web = { version = "0.1.8", features=["hyper"] }
tokio = { version = "1", features = ["full"] }
main.rs
#[tokio::main]
async fn main() -> Result<(), LambdaError> {
    tracing_subscriber::fmt().with_span_events(FmtSpan::CLOSE).init();

    // build our application with a route
    let app = Router::new()
        // `GET /` goes to `root`
        .route("/", get(root))

    if is_running_on_lambda() {
        // Run app on AWS Lambda
        run_hyper_on_lambda(app).await?;
    } else {
        // Run app on local server
        let addr = SocketAddr::from(([127, 0, 0, 1], 8080));
        axum::Server::bind(&addr).serve(app.into_make_service()).await?;
    }
    Ok(())
}
うぽぽんうぽぽん

Middlewareを作るとき( ..)φ
基本的に
https://docs.rs/axum/latest/axum/#writing-your-own-middleware
の通りでやればOK

なんで self.inner.clone() だけではだめで、 std::mem::replace(&mut self.inner, clone); しているのかが謎。
ぶっちゃけ self.inner.clone()だけして inner.call(req) してみたけどエラーも何も出ない。。。

req.extensions_mut().insert("あああああああああああ".to_string());

とかしてあげてハンドラー?側で

async fn hogehoge_handler(Extension(yyy): Extension<String>) -> String { 
  todo!()
}

とかすると yyyy には あああああああああああ が入ります。
MiddleWare側からデータを渡したいときに便利!

うぽぽんうぽぽん

Middlewareの処理順番

    let app = Router::new()
        // `GET /` goes to `root`
        .route("/", get(root))
        .route( "/count", get( shared_count))
        .layer(layer_fn(|inner| MyMiddleware { inner }))
        .layer(AddExtensionLayer::new(sample))
        .layer(AddExtensionLayer::new("sfsafa".to_string()));
        

基本的にLayerの処理順は下から上に。
req.extensions().get::<String>()とか使ってデータを取る時は下で先に定義されてないととれませんよという話