Update README.md
This commit is contained in:
52
README.md
52
README.md
@@ -1,6 +1,6 @@
|
||||
# axum-app-wrapper
|
||||
|
||||
A small plugin layer for `axum` applications, inspired by [fastify](https://fastify.dev/) from the Node/JS ecossytem.
|
||||
A small plugin layer for `axum` applications, inspired by [fastify](https://fastify.dev/) from the Node/JS ecosystem.
|
||||
|
||||
Plugins can:
|
||||
|
||||
@@ -27,12 +27,14 @@ use std::{net::SocketAddr, sync::Arc};
|
||||
use axum::{
|
||||
extract::State,
|
||||
routing::get,
|
||||
Extension,
|
||||
};
|
||||
use axum_app_wrapper::{AdHocPlugin, App, AppState};
|
||||
|
||||
#[derive(Clone, AppState)]
|
||||
struct AppState {
|
||||
config: Arc<Config>,
|
||||
metrics: Arc<Metrics>,
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
@@ -40,30 +42,64 @@ struct Config {
|
||||
service_name: String,
|
||||
}
|
||||
|
||||
struct Metrics;
|
||||
|
||||
impl Metrics {
|
||||
fn new() -> Self {
|
||||
Self
|
||||
}
|
||||
|
||||
async fn flush(&self) {
|
||||
tracing::info!("flushed metrics");
|
||||
}
|
||||
}
|
||||
|
||||
async fn health(State(state): State<AppState>) -> String {
|
||||
format!("{}:ok", state.config.service_name)
|
||||
}
|
||||
|
||||
async fn metrics_handler(Extension(metrics): Extension<Arc<Metrics>>) -> &'static str {
|
||||
let _metrics = metrics;
|
||||
"metrics:ok"
|
||||
}
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() -> anyhow::Result<()> {
|
||||
let config = Arc::new(Config {
|
||||
service_name: "api".to_owned(),
|
||||
});
|
||||
let metrics_registry = Arc::new(Metrics::new());
|
||||
|
||||
let app = App::<AppState>::new().register(
|
||||
AdHocPlugin::<AppState>::new()
|
||||
let config_plugin = AdHocPlugin::<AppState>::new()
|
||||
.on_init(async move |mut state| {
|
||||
state.insert(config);
|
||||
Ok(state)
|
||||
})
|
||||
.on_setup(|router, _state| Ok(router.route("/health", get(health))))
|
||||
.on_setup(|router, state| {
|
||||
tracing::info!(service = %state.config.service_name, "configuring routes");
|
||||
Ok(router.route("/health", get(health)))
|
||||
});
|
||||
|
||||
let metrics_plugin = AdHocPlugin::<AppState>::new()
|
||||
.on_init(async move |mut state| {
|
||||
state.insert(metrics_registry);
|
||||
Ok(state)
|
||||
})
|
||||
.on_setup(|router, state| {
|
||||
Ok(router
|
||||
.route("/metrics", get(metrics_handler))
|
||||
.layer(Extension(Arc::clone(&state.metrics))))
|
||||
})
|
||||
.on_shutdown(|state| {
|
||||
let service_name = state.config.service_name.clone();
|
||||
let metrics = Arc::clone(&state.metrics);
|
||||
async move {
|
||||
tracing::info!(%service_name, "shutting down");
|
||||
metrics.flush().await;
|
||||
}
|
||||
}),
|
||||
);
|
||||
});
|
||||
|
||||
let app = App::<AppState>::new()
|
||||
.register(config_plugin)
|
||||
.register(metrics_plugin);
|
||||
|
||||
let (router, state, on_shutdown) = app.init().await?;
|
||||
let router = router.with_state(state);
|
||||
|
||||
Reference in New Issue
Block a user