diff --git a/Cargo.lock b/Cargo.lock index 2a5cd04..7751506 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -190,6 +190,29 @@ dependencies = [ "tower-service", ] +[[package]] +name = "axum-prometheus" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ab3e59a8cf89cddb1c8272c7849d6d22b056d7ed4c125422b5d012983d2aa9e" +dependencies = [ + "axum", + "axum-core", + "bytes", + "futures", + "futures-core", + "http", + "http-body", + "matchit", + "metrics 0.21.1", + "metrics-exporter-prometheus 0.12.1", + "once_cell", + "pin-project", + "tokio", + "tower", + "tower-http", +] + [[package]] name = "backtrace" version = "0.3.68" @@ -344,7 +367,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4114279215a005bc675e386011e594e1d9b800918cea18fcadadcce864a2046b" dependencies = [ "borsh-derive", - "hashbrown 0.13.2", + "hashbrown 0.12.3", ] [[package]] @@ -1385,9 +1408,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.13.2" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +checksum = "33ff8ae62cd3a9102e5637afc8452c55acf3844001bd5374e0b0bd7b6616c038" dependencies = [ "ahash 0.8.3", ] @@ -1917,6 +1940,15 @@ dependencies = [ "libc", ] +[[package]] +name = "mach2" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d0d1830bcd151a6fc4aea1369af235b36c1528fe976b8ff678683c9995eade8" +dependencies = [ + "libc", +] + [[package]] name = "match_cfg" version = "0.1.0" @@ -1981,7 +2013,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2e52eb6380b6d2a10eb3434aec0885374490f5b82c8aaf5cd487a183c98be834" dependencies = [ "ahash 0.7.6", - "metrics-macros", + "metrics-macros 0.5.1", ] [[package]] @@ -1991,7 +2023,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "142c53885123b68d94108295a09d4afe1a1388ed95b54d5dacd9a454753030f2" dependencies = [ "ahash 0.7.6", - "metrics-macros", + "metrics-macros 0.5.1", +] + +[[package]] +name = "metrics" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fde3af1a009ed76a778cb84fdef9e7dbbdf5775ae3e4cc1f434a6a307f6f76c5" +dependencies = [ + "ahash 0.8.3", + "metrics-macros 0.7.0", + "portable-atomic", ] [[package]] @@ -2006,7 +2049,25 @@ dependencies = [ "metrics 0.19.0", "metrics-util 0.13.0", "parking_lot 0.11.2", - "quanta", + "quanta 0.9.3", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "metrics-exporter-prometheus" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a4964177ddfdab1e3a2b37aec7cf320e14169abb0ed73999f558136409178d5" +dependencies = [ + "base64 0.21.2", + "hyper", + "indexmap 1.9.3", + "ipnet", + "metrics 0.21.1", + "metrics-util 0.15.1", + "quanta 0.11.1", "thiserror", "tokio", "tracing", @@ -2023,6 +2084,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "metrics-macros" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddece26afd34c31585c74a4db0630c376df271c285d682d1e55012197830b6df" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.27", +] + [[package]] name = "metrics-util" version = "0.12.1" @@ -2039,9 +2111,9 @@ dependencies = [ "num_cpus", "ordered-float", "parking_lot 0.11.2", - "quanta", + "quanta 0.9.3", "radix_trie", - "sketches-ddsketch", + "sketches-ddsketch 0.1.3", ] [[package]] @@ -2057,8 +2129,23 @@ dependencies = [ "metrics 0.19.0", "num_cpus", "parking_lot 0.11.2", - "quanta", - "sketches-ddsketch", + "quanta 0.9.3", + "sketches-ddsketch 0.1.3", +] + +[[package]] +name = "metrics-util" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4de2ed6e491ed114b40b732e4d1659a9d53992ebd87490c44a6ffe23739d973e" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", + "hashbrown 0.13.1", + "metrics 0.21.1", + "num_cpus", + "quanta 0.11.1", + "sketches-ddsketch 0.2.1", ] [[package]] @@ -2842,6 +2929,12 @@ version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" +[[package]] +name = "portable-atomic" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edc55135a600d700580e406b4de0d59cb9ad25e344a3a091a97ded2622ec4ec6" + [[package]] name = "postgres-native-tls" version = "0.5.0" @@ -3163,6 +3256,22 @@ dependencies = [ "winapi", ] +[[package]] +name = "quanta" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a17e662a7a8291a865152364c20c7abc5e60486ab2001e8ec10b24862de0b9ab" +dependencies = [ + "crossbeam-utils", + "libc", + "mach2", + "once_cell", + "raw-cpuid", + "wasi 0.11.0+wasi-snapshot-preview1", + "web-sys", + "winapi", +] + [[package]] name = "query-connector" version = "0.1.0" @@ -3235,7 +3344,7 @@ version = "0.1.0" source = "git+https://github.com/Brendonovich/prisma-engines?tag=pcr-0.6.5#7cc20cc54a7ab0b5e38c81901826939a91a17ba0" dependencies = [ "metrics 0.18.1", - "metrics-exporter-prometheus", + "metrics-exporter-prometheus 0.10.0", "metrics-util 0.12.1", "once_cell", "parking_lot 0.12.1", @@ -4118,6 +4227,12 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04d2ecae5fcf33b122e2e6bd520a57ccf152d2dde3b38c71039df1a6867264ee" +[[package]] +name = "sketches-ddsketch" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68a406c1882ed7f29cd5e248c9848a80e7cb6ae0fea82346d2746f2f941c07e1" + [[package]] name = "slab" version = "0.4.8" @@ -4969,6 +5084,7 @@ name = "users_settings_server" version = "0.1.0" dependencies = [ "axum", + "axum-prometheus", "chrono", "once_cell", "prisma-client-rust", diff --git a/Cargo.toml b/Cargo.toml index 48cf82a..5501246 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,6 +19,7 @@ serde = { version = "1.0.163", features = ["derive"] } tokio = { version = "1.28.2", features = ["full"] } axum = { version = "0.6.18", features = ["json"] } +axum-prometheus = "0.3.4" chrono = "0.4.26" sentry = "0.31.5" diff --git a/src/views/mod.rs b/src/views/mod.rs index 90e84d5..598cb87 100644 --- a/src/views/mod.rs +++ b/src/views/mod.rs @@ -1,4 +1,5 @@ -use axum::{Router, response::Response, http::{StatusCode, self, Request}, middleware::{Next, self}, Extension}; +use axum::{Router, response::Response, http::{StatusCode, self, Request}, middleware::{Next, self}, Extension, routing::get}; +use axum_prometheus::PrometheusMetricLayer; use tower_http::trace::{TraceLayer, self}; use tracing::Level; use std::sync::Arc; @@ -36,11 +37,22 @@ async fn auth(req: Request, next: Next) -> Result pub async fn get_router() -> Router { let client = Arc::new(get_prisma_client().await); - Router::new() + let (prometheus_layer, metric_handle) = PrometheusMetricLayer::pair(); + + let app_router = Router::new() .nest("/users/", users::get_router()) .nest("/languages/", languages::get_router()) .nest("/donate_notifications/", donate_notifications::get_router()) .layer(middleware::from_fn(auth)) + .layer(Extension(client)) + .layer(prometheus_layer); + + let metric_router = Router::new() + .route("/metrics", get(|| async move { metric_handle.render() })); + + Router::new() + .nest("/", app_router) + .nest("/", metric_router) .layer( TraceLayer::new_for_http() .make_span_with(trace::DefaultMakeSpan::new() @@ -48,5 +60,4 @@ pub async fn get_router() -> Router { .on_response(trace::DefaultOnResponse::new() .level(Level::INFO)), ) - .layer(Extension(client)) }