add web metrics

This commit is contained in:
boring_nick 2023-06-23 08:58:34 +03:00
parent 16f4ba3e56
commit e05d44133e
3 changed files with 196 additions and 6 deletions

186
Cargo.lock generated
View File

@ -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.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f"
dependencies = [
"cfg-if",
"once_cell",
"version_check",
]
[[package]]
name = "aide"
version = "0.11.0"
@ -119,6 +130,12 @@ version = "1.0.71"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8"
[[package]]
name = "arc-swap"
version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6"
[[package]]
name = "async-trait"
version = "0.1.68"
@ -185,6 +202,29 @@ dependencies = [
"tower-service",
]
[[package]]
name = "axum-prometheus"
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "23b9c40248cc511e9f3c00cc9938e46070460120a33e03114bec928a6bba268c"
dependencies = [
"axum",
"axum-core",
"bytes",
"futures",
"futures-core",
"http",
"http-body",
"matchit",
"metrics",
"metrics-exporter-prometheus",
"once_cell",
"pin-project",
"tokio",
"tower",
"tower-http",
]
[[package]]
name = "base64"
version = "0.13.1"
@ -316,7 +356,7 @@ dependencies = [
"futures",
"hyper",
"lz4",
"sealed",
"sealed 0.4.0",
"serde",
"static_assertions",
"thiserror",
@ -445,7 +485,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "907076dfda823b0b36d2a1bb5f90c96660a5bbcd7729e10727f07858f22c4edc"
dependencies = [
"cfg-if",
"hashbrown",
"hashbrown 0.12.3",
"lock_api",
"once_cell",
"parking_lot_core",
@ -713,6 +753,15 @@ version = "0.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
[[package]]
name = "hashbrown"
version = "0.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e"
dependencies = [
"ahash",
]
[[package]]
name = "heck"
version = "0.3.3"
@ -860,7 +909,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
dependencies = [
"autocfg",
"hashbrown",
"hashbrown 0.12.3",
"serde",
]
@ -972,6 +1021,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 = "matchers"
version = "0.1.0"
@ -1002,6 +1060,77 @@ dependencies = [
"autocfg",
]
[[package]]
name = "metrics"
version = "0.21.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aa8ebbd1a9e57bbab77b9facae7f5136aea44c356943bf9a198f647da64285d6"
dependencies = [
"ahash",
"metrics-macros",
"portable-atomic",
]
[[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",
"ipnet",
"metrics",
"metrics-util",
"quanta",
"thiserror",
"tokio",
"tracing",
]
[[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.18",
]
[[package]]
name = "metrics-prometheus"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0afd1cbdd27d6fe60bb1906c1dab8bebd0e8da9b1dcc13bb630e926c80bd65a7"
dependencies = [
"arc-swap",
"metrics",
"metrics-util",
"once_cell",
"prometheus",
"sealed 0.5.0",
"smallvec",
"thiserror",
]
[[package]]
name = "metrics-util"
version = "0.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "111cb375987443c3de8d503580b536f77dc8416d32db62d9456db5d93bd7ac47"
dependencies = [
"crossbeam-epoch",
"crossbeam-utils",
"hashbrown 0.13.2",
"metrics",
"num_cpus",
"quanta",
"sketches-ddsketch",
]
[[package]]
name = "mimalloc"
version = "0.1.37"
@ -1158,6 +1287,12 @@ version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
[[package]]
name = "portable-atomic"
version = "1.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "767eb9f07d4a5ebcb39bbf2d452058a93c011373abf6832e24194a1c3f004794"
[[package]]
name = "ppv-lite86"
version = "0.2.17"
@ -1206,6 +1341,22 @@ version = "2.28.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "106dd99e98437432fed6519dedecfade6a06a73bb7b2a1e019fdd2bee5778d94"
[[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 = "quote"
version = "1.0.28"
@ -1245,6 +1396,15 @@ dependencies = [
"getrandom",
]
[[package]]
name = "raw-cpuid"
version = "10.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6c297679cb867470fa8c9f67dbba74a78d78e3e98d7cf2b08d6d71540f797332"
dependencies = [
"bitflags",
]
[[package]]
name = "rayon"
version = "1.7.0"
@ -1436,6 +1596,7 @@ dependencies = [
"aide",
"anyhow",
"axum",
"axum-prometheus",
"chrono",
"clap",
"clickhouse",
@ -1444,6 +1605,7 @@ dependencies = [
"futures",
"indexmap",
"lazy_static",
"metrics-prometheus",
"mimalloc",
"mime_guess",
"pretty_assertions",
@ -1585,6 +1747,18 @@ dependencies = [
"syn 1.0.109",
]
[[package]]
name = "sealed"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f4a8caec23b7800fb97971a1c6ae365b6239aaeddfb934d6265f8505e795699d"
dependencies = [
"heck 0.4.1",
"proc-macro2",
"quote",
"syn 2.0.18",
]
[[package]]
name = "serde"
version = "1.0.164"
@ -1711,6 +1885,12 @@ dependencies = [
"libc",
]
[[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"

View File

@ -51,6 +51,8 @@ twitch_api2 = { version = "0.6.1", features = [
"twitch_oauth2",
] }
twitch = { git = "https://github.com/jprochazk/twitch-rs", features = ["simd"] }
axum-prometheus = "0.3.3"
metrics-prometheus = "0.4.1"
[dev-dependencies]
pretty_assertions = "1.3.0"

View File

@ -15,6 +15,7 @@ use aide::{
redoc::Redoc,
};
use axum::{middleware, response::IntoResponse, Extension, Json, ServiceExt};
use axum_prometheus::PrometheusMetricLayerBuilder;
use prometheus::TextEncoder;
use std::{
net::{AddrParseError, SocketAddr},
@ -32,6 +33,8 @@ pub async fn run(app: App, mut shutdown_rx: ShutdownRx, bot_tx: Sender<BotMessag
aide::gen::infer_responses(true);
aide::gen::extract_schemas(true);
metrics_prometheus::install();
let listen_address =
parse_listen_addr(&app.config.listen_address).expect("Invalid listen address");
@ -123,18 +126,23 @@ pub async fn run(app: App, mut shutdown_rx: ShutdownRx, bot_tx: Sender<BotMessag
)
.api_route("/optout", post(handlers::optout))
.route("/docs", Redoc::new("/openapi.json").axum_route())
.route("/openapi.json", get(serve_openapi))
.route("/assets/*asset", get(frontend::static_asset))
.fallback(frontend::static_asset)
.layer(
TraceLayer::new_for_http()
.make_span_with(trace_layer::make_span_with)
.on_response(trace_layer::on_response),
)
.route("/openapi.json", get(serve_openapi))
.layer(
PrometheusMetricLayerBuilder::new()
.with_prefix("rustlog")
.build(),
)
.route("/metrics", get(metrics))
.route("/assets/*asset", get(frontend::static_asset))
.finish_api(&mut api)
.layer(Extension(Arc::new(api)))
.with_state(app)
.fallback(frontend::static_asset)
.layer(cors);
let app = NormalizePath::trim_trailing_slash(app);