Added basic prometheus metrics
							parent
							
								
									358b1c3fc3
								
							
						
					
					
						commit
						a3cf021fc6
					
				|  | @ -8,6 +8,17 @@ version = "1.0.2" | |||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "ahash" | ||||
| version = "0.7.6" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" | ||||
| dependencies = [ | ||||
|  "getrandom", | ||||
|  "once_cell", | ||||
|  "version_check", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "ansi_term" | ||||
| version = "0.12.1" | ||||
|  | @ -28,6 +39,15 @@ dependencies = [ | |||
|  "syn", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "atomic-shim" | ||||
| version = "0.2.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "67cd4b51d303cf3501c301e8125df442128d3c6d7c69f71b27833d253de47e77" | ||||
| dependencies = [ | ||||
|  "crossbeam-utils", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "autocfg" | ||||
| version = "1.1.0" | ||||
|  | @ -91,6 +111,12 @@ version = "1.3.2" | |||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "bumpalo" | ||||
| version = "3.9.1" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "a4a45a46ab1f2412e53d3a0ade76ffad2025804294569aae387231a0cd6e0899" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "bytes" | ||||
| version = "1.1.0" | ||||
|  | @ -112,6 +138,30 @@ dependencies = [ | |||
|  "cfg-if", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "crossbeam-epoch" | ||||
| version = "0.9.8" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "1145cf131a2c6ba0615079ab6a638f7e1973ac9c2634fcbeaaad6114246efe8c" | ||||
| dependencies = [ | ||||
|  "autocfg", | ||||
|  "cfg-if", | ||||
|  "crossbeam-utils", | ||||
|  "lazy_static", | ||||
|  "memoffset", | ||||
|  "scopeguard", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "crossbeam-utils" | ||||
| version = "0.8.8" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "0bf124c720b7686e3c2663cf54062ab0f68a88af2fb6a030e87e30bf721fcb38" | ||||
| dependencies = [ | ||||
|  "cfg-if", | ||||
|  "lazy_static", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "filetime" | ||||
| version = "0.2.15" | ||||
|  | @ -239,6 +289,9 @@ name = "hashbrown" | |||
| version = "0.11.2" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" | ||||
| dependencies = [ | ||||
|  "ahash", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "hermit-abi" | ||||
|  | @ -323,12 +376,36 @@ dependencies = [ | |||
|  "hashbrown", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "instant" | ||||
| version = "0.1.12" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" | ||||
| dependencies = [ | ||||
|  "cfg-if", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "ipnet" | ||||
| version = "2.4.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "35e70ee094dc02fd9c13fdad4940090f22dbd6ac7c9e7094a46cf0232a50bc7c" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "itoa" | ||||
| version = "1.0.1" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "js-sys" | ||||
| version = "0.3.56" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "a38fc24e30fd564ce974c02bf1d337caddff65be6cc4735a1f7eab22a7440f04" | ||||
| dependencies = [ | ||||
|  "wasm-bindgen", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "lazy_static" | ||||
| version = "1.4.0" | ||||
|  | @ -360,6 +437,15 @@ dependencies = [ | |||
|  "cfg-if", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "mach" | ||||
| version = "0.3.2" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" | ||||
| dependencies = [ | ||||
|  "libc", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "matchers" | ||||
| version = "0.1.0" | ||||
|  | @ -387,6 +473,71 @@ version = "2.4.1" | |||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "memoffset" | ||||
| version = "0.6.5" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" | ||||
| dependencies = [ | ||||
|  "autocfg", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "metrics" | ||||
| version = "0.18.1" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "2e52eb6380b6d2a10eb3434aec0885374490f5b82c8aaf5cd487a183c98be834" | ||||
| dependencies = [ | ||||
|  "ahash", | ||||
|  "metrics-macros", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "metrics-exporter-prometheus" | ||||
| version = "0.9.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "8b93b470b04c005178058e18ac8bb2eb3fda562cf87af5ea05ba8d44190d458c" | ||||
| dependencies = [ | ||||
|  "hyper", | ||||
|  "indexmap", | ||||
|  "ipnet", | ||||
|  "metrics", | ||||
|  "metrics-util", | ||||
|  "parking_lot 0.11.2", | ||||
|  "quanta", | ||||
|  "thiserror", | ||||
|  "tokio", | ||||
|  "tracing", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "metrics-macros" | ||||
| version = "0.5.1" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "49e30813093f757be5cf21e50389a24dc7dbb22c49f23b7e8f51d69b508a5ffa" | ||||
| dependencies = [ | ||||
|  "proc-macro2", | ||||
|  "quote", | ||||
|  "syn", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "metrics-util" | ||||
| version = "0.12.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "107a38013e91c04ddf31826b0d0dcc2e0d4ebedded8234cc0dc2b7bbd0c121e8" | ||||
| dependencies = [ | ||||
|  "atomic-shim", | ||||
|  "crossbeam-epoch", | ||||
|  "crossbeam-utils", | ||||
|  "hashbrown", | ||||
|  "metrics", | ||||
|  "num_cpus", | ||||
|  "parking_lot 0.11.2", | ||||
|  "quanta", | ||||
|  "sketches-ddsketch", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "mime" | ||||
| version = "0.3.16" | ||||
|  | @ -461,6 +612,17 @@ version = "1.10.0" | |||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "parking_lot" | ||||
| version = "0.11.2" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" | ||||
| dependencies = [ | ||||
|  "instant", | ||||
|  "lock_api", | ||||
|  "parking_lot_core 0.8.5", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "parking_lot" | ||||
| version = "0.12.0" | ||||
|  | @ -468,7 +630,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" | |||
| checksum = "87f5ec2493a61ac0506c0f4199f99070cbe83857b0337006a30f3e6719b8ef58" | ||||
| dependencies = [ | ||||
|  "lock_api", | ||||
|  "parking_lot_core", | ||||
|  "parking_lot_core 0.9.2", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "parking_lot_core" | ||||
| version = "0.8.5" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" | ||||
| dependencies = [ | ||||
|  "cfg-if", | ||||
|  "instant", | ||||
|  "libc", | ||||
|  "redox_syscall", | ||||
|  "smallvec", | ||||
|  "winapi", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
|  | @ -531,6 +707,22 @@ dependencies = [ | |||
|  "unicode-xid", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "quanta" | ||||
| version = "0.9.3" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "20afe714292d5e879d8b12740aa223c6a88f118af41870e8b6196e39a02238a8" | ||||
| dependencies = [ | ||||
|  "crossbeam-utils", | ||||
|  "libc", | ||||
|  "mach", | ||||
|  "once_cell", | ||||
|  "raw-cpuid", | ||||
|  "wasi 0.10.2+wasi-snapshot-preview1", | ||||
|  "web-sys", | ||||
|  "winapi", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "quote" | ||||
| version = "1.0.17" | ||||
|  | @ -540,6 +732,15 @@ dependencies = [ | |||
|  "proc-macro2", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "raw-cpuid" | ||||
| version = "10.3.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "738bc47119e3eeccc7e94c4a506901aea5e7b4944ecd0829cbebf4af04ceda12" | ||||
| dependencies = [ | ||||
|  "bitflags", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "redox_syscall" | ||||
| version = "0.2.13" | ||||
|  | @ -634,12 +835,14 @@ dependencies = [ | |||
| 
 | ||||
| [[package]] | ||||
| name = "site-backend" | ||||
| version = "0.1.2" | ||||
| version = "0.1.3" | ||||
| dependencies = [ | ||||
|  "axum", | ||||
|  "flate2", | ||||
|  "futures-util", | ||||
|  "hyper", | ||||
|  "metrics", | ||||
|  "metrics-exporter-prometheus", | ||||
|  "serde_json", | ||||
|  "tar", | ||||
|  "tokio", | ||||
|  | @ -650,6 +853,12 @@ dependencies = [ | |||
|  "uuid", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "sketches-ddsketch" | ||||
| version = "0.1.2" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "76a77a8fd93886010f05e7ea0720e569d6d16c65329dbe3ec033bbbccccb017b" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "slab" | ||||
| version = "0.4.5" | ||||
|  | @ -700,6 +909,26 @@ dependencies = [ | |||
|  "xattr", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "thiserror" | ||||
| version = "1.0.30" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417" | ||||
| dependencies = [ | ||||
|  "thiserror-impl", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "thiserror-impl" | ||||
| version = "1.0.30" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" | ||||
| dependencies = [ | ||||
|  "proc-macro2", | ||||
|  "quote", | ||||
|  "syn", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "thread_local" | ||||
| version = "1.1.4" | ||||
|  | @ -721,7 +950,7 @@ dependencies = [ | |||
|  "mio", | ||||
|  "num_cpus", | ||||
|  "once_cell", | ||||
|  "parking_lot", | ||||
|  "parking_lot 0.12.0", | ||||
|  "pin-project-lite", | ||||
|  "signal-hook-registry", | ||||
|  "socket2", | ||||
|  | @ -937,6 +1166,70 @@ version = "0.11.0+wasi-snapshot-preview1" | |||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "wasm-bindgen" | ||||
| version = "0.2.79" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "25f1af7423d8588a3d840681122e72e6a24ddbcb3f0ec385cac0d12d24256c06" | ||||
| dependencies = [ | ||||
|  "cfg-if", | ||||
|  "wasm-bindgen-macro", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "wasm-bindgen-backend" | ||||
| version = "0.2.79" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "8b21c0df030f5a177f3cba22e9bc4322695ec43e7257d865302900290bcdedca" | ||||
| dependencies = [ | ||||
|  "bumpalo", | ||||
|  "lazy_static", | ||||
|  "log", | ||||
|  "proc-macro2", | ||||
|  "quote", | ||||
|  "syn", | ||||
|  "wasm-bindgen-shared", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "wasm-bindgen-macro" | ||||
| version = "0.2.79" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "2f4203d69e40a52ee523b2529a773d5ffc1dc0071801c87b3d270b471b80ed01" | ||||
| dependencies = [ | ||||
|  "quote", | ||||
|  "wasm-bindgen-macro-support", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "wasm-bindgen-macro-support" | ||||
| version = "0.2.79" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "bfa8a30d46208db204854cadbb5d4baf5fcf8071ba5bf48190c3e59937962ebc" | ||||
| dependencies = [ | ||||
|  "proc-macro2", | ||||
|  "quote", | ||||
|  "syn", | ||||
|  "wasm-bindgen-backend", | ||||
|  "wasm-bindgen-shared", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "wasm-bindgen-shared" | ||||
| version = "0.2.79" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "3d958d035c4438e28c70e4321a2911302f10135ce78a9c7834c0cab4123d06a2" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "web-sys" | ||||
| version = "0.3.56" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "c060b319f29dd25724f09a2ba1418f142f539b2be99fbf4d2d5a8f7330afb8eb" | ||||
| dependencies = [ | ||||
|  "js-sys", | ||||
|  "wasm-bindgen", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "winapi" | ||||
| version = "0.3.9" | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| [package] | ||||
| name = "site-backend" | ||||
| version = "0.1.2" | ||||
| version = "0.1.3" | ||||
| edition = "2021" | ||||
| publish = false | ||||
| 
 | ||||
|  | @ -23,3 +23,5 @@ tokio-util = { version = "0.7.1", features = ["io"] } | |||
| futures-util = "0.3.21" | ||||
| uuid = { version = "1.0.0-alpha.1", features = ["v4"] } | ||||
| serde_json = "1.0.79" | ||||
| metrics = "0.18.1" | ||||
| metrics-exporter-prometheus = "0.9.0" | ||||
|  |  | |||
							
								
								
									
										19
									
								
								src/main.rs
								
								
								
								
							
							
						
						
									
										19
									
								
								src/main.rs
								
								
								
								
							|  | @ -1,11 +1,18 @@ | |||
| use std::net::SocketAddr; | ||||
| use std::{future::ready, net::SocketAddr}; | ||||
| 
 | ||||
| use axum::{extract::Extension, http::StatusCode, routing::get_service, Router}; | ||||
| use axum::{ | ||||
|     extract::Extension, | ||||
|     http::StatusCode, | ||||
|     middleware, | ||||
|     routing::{get, get_service}, | ||||
|     Router, | ||||
| }; | ||||
| use tower_http::{auth::RequireAuthorizationLayer, services::ServeDir, trace::TraceLayer}; | ||||
| use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt}; | ||||
| 
 | ||||
| mod api; | ||||
| mod matrix; | ||||
| mod metrics; | ||||
| 
 | ||||
| const STATIC_DIR_NAME: &str = "static"; | ||||
| 
 | ||||
|  | @ -27,6 +34,8 @@ async fn main() | |||
| 
 | ||||
|     std::fs::create_dir_all(&static_dir); | ||||
| 
 | ||||
|     let recorder_handle = metrics::setup_metrics_recorder(); | ||||
| 
 | ||||
|     let app = Router::new() | ||||
|         // Handle Matrix .well-known files
 | ||||
|         .nest("/", matrix::router()) | ||||
|  | @ -35,6 +44,7 @@ async fn main() | |||
|             "/api", | ||||
|             api::router().layer(RequireAuthorizationLayer::bearer(&api_key)), | ||||
|         ) | ||||
|         .route("/metrics", get(move || ready(recorder_handle.render()))) | ||||
|         // The fallback option is to serve the actual static files
 | ||||
|         .fallback(get_service(ServeDir::new(static_dir)).handle_error( | ||||
|             |error: std::io::Error| async move { | ||||
|  | @ -44,8 +54,9 @@ async fn main() | |||
|                 ) | ||||
|             }, | ||||
|         )) | ||||
|         .layer(TraceLayer::new_for_http()) | ||||
|         .layer(Extension(data_dir)); | ||||
|         .layer(middleware::from_fn(metrics::track_metrics)) | ||||
|         .layer(Extension(data_dir)) | ||||
|         .layer(TraceLayer::new_for_http()); | ||||
| 
 | ||||
|     let addr = SocketAddr::from(([0, 0, 0, 0], 3000)); | ||||
|     tracing::debug!("listening on {}", addr); | ||||
|  |  | |||
|  | @ -0,0 +1,48 @@ | |||
| use std::time::Instant; | ||||
| 
 | ||||
| use axum::{extract::MatchedPath, http::Request, middleware::Next, response::IntoResponse}; | ||||
| use metrics_exporter_prometheus::{Matcher, PrometheusBuilder, PrometheusHandle}; | ||||
| 
 | ||||
| pub fn setup_metrics_recorder() -> PrometheusHandle | ||||
| { | ||||
|     const EXPONENTIAL_SECONDS: &[f64] = &[ | ||||
|         0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0, 10.0, | ||||
|     ]; | ||||
| 
 | ||||
|     PrometheusBuilder::new() | ||||
|         .set_buckets_for_metric( | ||||
|             Matcher::Full("http_requests_duration_seconds".to_string()), | ||||
|             EXPONENTIAL_SECONDS, | ||||
|         ) | ||||
|         .unwrap() | ||||
|         .install_recorder() | ||||
|         .unwrap() | ||||
| } | ||||
| 
 | ||||
| // Taken from the examples section
 | ||||
| pub async fn track_metrics<B>(req: Request<B>, next: Next<B>) -> impl IntoResponse | ||||
| { | ||||
|     let start = Instant::now(); | ||||
|     let path = if let Some(matched_path) = req.extensions().get::<MatchedPath>() { | ||||
|         matched_path.as_str().to_owned() | ||||
|     } else { | ||||
|         req.uri().path().to_owned() | ||||
|     }; | ||||
|     let method = req.method().clone(); | ||||
| 
 | ||||
|     let response = next.run(req).await; | ||||
| 
 | ||||
|     let latency = start.elapsed().as_secs_f64(); | ||||
|     let status = response.status().as_u16().to_string(); | ||||
| 
 | ||||
|     let labels = [ | ||||
|         ("method", method.to_string()), | ||||
|         ("path", path), | ||||
|         ("status", status), | ||||
|     ]; | ||||
| 
 | ||||
|     metrics::increment_counter!("http_requests_total", &labels); | ||||
|     metrics::histogram!("http_requests_duration_seconds", latency, &labels); | ||||
| 
 | ||||
|     response | ||||
| } | ||||
		Loading…
	
		Reference in New Issue