1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// Copyright Materialize, Inc. and contributors. All rights reserved.
//
// Use of this software is governed by the Business Source License
// included in the LICENSE file.
//
// As of the Change Date specified in that file, in accordance with
// the Business Source License, use of this software will be governed
// by the Apache License, Version 2.0.

use axum::{extract::Request, middleware::Next, response::Response};
use mz_ore::instrument;
use std::time::Instant;

#[instrument]
pub async fn logging_middleware(request: Request, next: Next) -> Response {
    let start: Instant = Instant::now();
    let method: hyper::Method = request.method().clone();
    let uri = request.uri().clone();

    let response = next.run(request).await;

    let latency = start.elapsed();
    let status = response.status();

    tracing::info!(
        method = %method,
        uri = %uri,
        status = %status,
        latency = ?latency,
        "Request completed"
    );

    response
}