openbook-candles/src/server/main.rs

107 lines
3.1 KiB
Rust
Raw Normal View History

use actix_web::{
http::StatusCode,
middleware::Logger,
2023-05-29 10:37:03 -07:00
rt::System,
web::{self, Data},
App, HttpServer,
};
2023-05-29 10:37:03 -07:00
use actix_web_prom::PrometheusMetricsBuilder;
2023-03-13 09:51:30 -07:00
use candles::get_candles;
2023-05-29 10:37:03 -07:00
use prometheus::Registry;
2023-05-19 17:16:37 -07:00
2023-03-13 22:45:29 -07:00
use markets::get_markets;
2023-03-13 09:51:30 -07:00
use openbook_candles::{
database::initialize::connect_to_database,
2023-03-13 23:21:15 -07:00
structs::markets::{fetch_market_infos, load_markets},
2023-03-13 09:51:30 -07:00
utils::{Config, WebContext},
};
2023-03-14 18:46:49 -07:00
use std::env;
2023-05-29 10:37:03 -07:00
use std::thread;
use traders::{get_top_traders_by_base_volume, get_top_traders_by_quote_volume};
2023-03-12 22:03:37 -07:00
mod candles;
mod coingecko;
2023-03-13 22:45:29 -07:00
mod markets;
2023-03-12 22:03:37 -07:00
mod server_error;
2023-03-13 09:51:30 -07:00
mod traders;
2023-03-05 23:11:15 -08:00
#[actix_web::main]
2023-03-12 22:03:37 -07:00
async fn main() -> std::io::Result<()> {
dotenv::dotenv().ok();
env_logger::init();
2023-03-14 18:46:49 -07:00
let args: Vec<String> = env::args().collect();
assert!(args.len() == 2);
let path_to_markets_json = &args[1];
2023-03-12 22:03:37 -07:00
let rpc_url: String = dotenv::var("RPC_URL").unwrap();
let bind_addr: String = dotenv::var("SERVER_BIND_ADDR").expect("reading bind addr from env");
2023-03-12 22:03:37 -07:00
let config = Config {
rpc_url: rpc_url.clone(),
};
2023-03-05 23:11:15 -08:00
2023-03-14 18:46:49 -07:00
let markets = load_markets(path_to_markets_json);
2023-03-12 22:03:37 -07:00
let market_infos = fetch_market_infos(&config, markets).await.unwrap();
let pool = connect_to_database().await.unwrap();
2023-03-12 22:03:37 -07:00
2023-05-29 10:37:03 -07:00
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")
2023-06-08 20:56:49 -07:00
.registry(registry)
2023-05-29 10:37:03 -07:00
.exclude_status(StatusCode::NOT_FOUND)
.build()
.unwrap();
2023-03-12 22:03:37 -07:00
let context = Data::new(WebContext {
rpc_url,
2023-03-12 22:03:37 -07:00
pool,
markets: market_infos,
});
2023-03-05 23:11:15 -08:00
2023-03-13 09:51:30 -07:00
println!("Starting server");
2023-05-29 10:37:03 -07:00
// Thread to serve public API
let public_server = thread::spawn(move || {
let sys = System::new();
let srv = HttpServer::new(move || {
App::new()
.wrap(Logger::default())
.wrap(public_metrics.clone())
.app_data(context.clone())
.service(
web::scope("/api")
.service(get_candles)
.service(get_top_traders_by_base_volume)
.service(get_top_traders_by_quote_volume)
.service(get_markets)
.service(coingecko::service()),
)
})
.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();
2023-05-29 10:37:03 -07:00
sys.block_on(srv).unwrap();
});
private_server.join().unwrap();
public_server.join().unwrap();
Ok(())
2023-03-05 22:52:42 -08:00
}