Add request metrics to server
This commit is contained in:
parent
9b69e380c3
commit
0591f5b3ab
|
@ -191,6 +191,18 @@ dependencies = [
|
||||||
"syn 1.0.109",
|
"syn 1.0.109",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "actix-web-prom"
|
||||||
|
version = "0.6.0"
|
||||||
|
source = "git+https://github.com/riordanp/actix-web-prom.git?branch=exclude-paths#614434270cbcfdffa2b3a854aff4c1e49c4973fd"
|
||||||
|
dependencies = [
|
||||||
|
"actix-web",
|
||||||
|
"futures-core",
|
||||||
|
"pin-project-lite",
|
||||||
|
"prometheus",
|
||||||
|
"regex",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "adler"
|
name = "adler"
|
||||||
version = "1.0.2"
|
version = "1.0.2"
|
||||||
|
@ -3423,6 +3435,7 @@ name = "openbook-candles"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"actix-web",
|
"actix-web",
|
||||||
|
"actix-web-prom",
|
||||||
"anchor-client",
|
"anchor-client",
|
||||||
"anchor-lang",
|
"anchor-lang",
|
||||||
"anyhow",
|
"anyhow",
|
||||||
|
@ -3443,6 +3456,7 @@ dependencies = [
|
||||||
"num-traits",
|
"num-traits",
|
||||||
"num_enum 0.6.1",
|
"num_enum 0.6.1",
|
||||||
"postgres-native-tls",
|
"postgres-native-tls",
|
||||||
|
"prometheus",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_derive",
|
"serde_derive",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
|
@ -3966,6 +3980,21 @@ dependencies = [
|
||||||
"yansi",
|
"yansi",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "prometheus"
|
||||||
|
version = "0.13.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "449811d15fbdf5ceb5c1144416066429cf82316e2ec8ce0c1f6f8a02e7bbcf8c"
|
||||||
|
dependencies = [
|
||||||
|
"cfg-if 1.0.0",
|
||||||
|
"fnv",
|
||||||
|
"lazy_static",
|
||||||
|
"memchr",
|
||||||
|
"parking_lot 0.12.1",
|
||||||
|
"protobuf",
|
||||||
|
"thiserror",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "prost"
|
name = "prost"
|
||||||
version = "0.11.6"
|
version = "0.11.6"
|
||||||
|
@ -4021,6 +4050,12 @@ dependencies = [
|
||||||
"prost",
|
"prost",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "protobuf"
|
||||||
|
version = "2.28.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "106dd99e98437432fed6519dedecfade6a06a73bb7b2a1e019fdd2bee5778d94"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "protobuf-src"
|
name = "protobuf-src"
|
||||||
version = "1.1.0+21.5"
|
version = "1.1.0+21.5"
|
||||||
|
|
|
@ -62,9 +62,11 @@ serum_dex = { version = "0.5.10", git = "https://github.com/openbook-dex/program
|
||||||
anchor-lang = ">=0.25.0"
|
anchor-lang = ">=0.25.0"
|
||||||
|
|
||||||
actix-web = "4"
|
actix-web = "4"
|
||||||
|
actix-web-prom = { version = "0.6.0", git = "https://github.com/riordanp/actix-web-prom.git", branch = "exclude-paths" }
|
||||||
|
|
||||||
arrayref = "0.3.6"
|
arrayref = "0.3.6"
|
||||||
bytemuck = "1.12.3"
|
bytemuck = "1.12.3"
|
||||||
num_enum = "0.6.1"
|
num_enum = "0.6.1"
|
||||||
|
|
||||||
config = "0.13.1"
|
config = "0.13.1"
|
||||||
|
prometheus = "0.13.3"
|
||||||
|
|
|
@ -1,9 +1,12 @@
|
||||||
use actix_web::{
|
use actix_web::{
|
||||||
middleware::Logger,
|
middleware::Logger,
|
||||||
|
rt::System,
|
||||||
web::{self, Data},
|
web::{self, Data},
|
||||||
App, HttpServer,
|
App, HttpServer, http::StatusCode,
|
||||||
};
|
};
|
||||||
|
use actix_web_prom::PrometheusMetricsBuilder;
|
||||||
use candles::get_candles;
|
use candles::get_candles;
|
||||||
|
use prometheus::Registry;
|
||||||
|
|
||||||
use markets::get_markets;
|
use markets::get_markets;
|
||||||
use openbook_candles::{
|
use openbook_candles::{
|
||||||
|
@ -12,6 +15,7 @@ use openbook_candles::{
|
||||||
utils::{Config, WebContext},
|
utils::{Config, WebContext},
|
||||||
};
|
};
|
||||||
use std::env;
|
use std::env;
|
||||||
|
use std::thread;
|
||||||
use traders::{get_top_traders_by_base_volume, get_top_traders_by_quote_volume};
|
use traders::{get_top_traders_by_base_volume, get_top_traders_by_quote_volume};
|
||||||
|
|
||||||
mod candles;
|
mod candles;
|
||||||
|
@ -39,6 +43,22 @@ async fn main() -> std::io::Result<()> {
|
||||||
let market_infos = fetch_market_infos(&config, markets).await.unwrap();
|
let market_infos = fetch_market_infos(&config, markets).await.unwrap();
|
||||||
let pool = connect_to_database().await.unwrap();
|
let pool = connect_to_database().await.unwrap();
|
||||||
|
|
||||||
|
let registry = Registry::new();
|
||||||
|
// For serving metrics on a private port
|
||||||
|
let private_metrics = PrometheusMetricsBuilder::new("openbook_candles_server_private")
|
||||||
|
.registry(registry.clone())
|
||||||
|
.exclude("/metrics")
|
||||||
|
.exclude_status(StatusCode::NOT_FOUND)
|
||||||
|
.endpoint("/metrics")
|
||||||
|
.build()
|
||||||
|
.unwrap();
|
||||||
|
// For collecting metrics on the public api, excluding 404s
|
||||||
|
let public_metrics = PrometheusMetricsBuilder::new("openbook_candles_server")
|
||||||
|
.registry(registry.clone())
|
||||||
|
.exclude_status(StatusCode::NOT_FOUND)
|
||||||
|
.build()
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
let context = Data::new(WebContext {
|
let context = Data::new(WebContext {
|
||||||
rpc_url,
|
rpc_url,
|
||||||
pool,
|
pool,
|
||||||
|
@ -46,20 +66,43 @@ async fn main() -> std::io::Result<()> {
|
||||||
});
|
});
|
||||||
|
|
||||||
println!("Starting server");
|
println!("Starting server");
|
||||||
HttpServer::new(move || {
|
// Thread to serve public API
|
||||||
App::new()
|
let public_server = thread::spawn(move || {
|
||||||
.wrap(Logger::default())
|
let sys = System::new();
|
||||||
.app_data(context.clone())
|
let srv = HttpServer::new(move || {
|
||||||
.service(
|
App::new()
|
||||||
web::scope("/api")
|
.wrap(Logger::default())
|
||||||
.service(get_candles)
|
.wrap(public_metrics.clone())
|
||||||
.service(get_top_traders_by_base_volume)
|
.app_data(context.clone())
|
||||||
.service(get_top_traders_by_quote_volume)
|
.service(
|
||||||
.service(get_markets)
|
web::scope("/api")
|
||||||
.service(coingecko::service()),
|
.service(get_candles)
|
||||||
)
|
.service(get_top_traders_by_base_volume)
|
||||||
})
|
.service(get_top_traders_by_quote_volume)
|
||||||
.bind(&bind_addr)?
|
.service(get_markets)
|
||||||
.run()
|
.service(coingecko::service()),
|
||||||
.await
|
)
|
||||||
|
})
|
||||||
|
.bind(&bind_addr)
|
||||||
|
.unwrap()
|
||||||
|
.run();
|
||||||
|
sys.block_on(srv).unwrap();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Thread to serve metrics endpoint privately
|
||||||
|
let private_server = thread::spawn(move || {
|
||||||
|
let sys = System::new();
|
||||||
|
let srv = HttpServer::new(move || {
|
||||||
|
App::new()
|
||||||
|
.wrap(private_metrics.clone())
|
||||||
|
})
|
||||||
|
.bind("0.0.0.0:9091")
|
||||||
|
.unwrap()
|
||||||
|
.run();
|
||||||
|
sys.block_on(srv).unwrap();
|
||||||
|
});
|
||||||
|
|
||||||
|
private_server.join().unwrap();
|
||||||
|
public_server.join().unwrap();
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue