2023-03-07 22:45:37 -08:00
|
|
|
use actix_web::{
|
2023-05-30 10:01:47 -07:00
|
|
|
http::StatusCode,
|
2023-03-07 22:45:37 -08:00
|
|
|
middleware::Logger,
|
2023-05-29 10:37:03 -07:00
|
|
|
rt::System,
|
2023-03-07 22:45:37 -08:00
|
|
|
web::{self, Data},
|
2023-05-30 10:01:47 -07:00
|
|
|
App, HttpServer,
|
2023-03-07 22:45:37 -08:00
|
|
|
};
|
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;
|
2023-05-05 18:41:17 -07:00
|
|
|
use traders::{get_top_traders_by_base_volume, get_top_traders_by_quote_volume};
|
2023-03-13 14:18:18 -07:00
|
|
|
|
2023-03-12 22:03:37 -07:00
|
|
|
mod candles;
|
2023-05-05 18:41:17 -07:00
|
|
|
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<()> {
|
2023-03-07 22:45:37 -08:00
|
|
|
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();
|
2023-05-17 09:11:17 -07:00
|
|
|
let bind_addr: String = dotenv::var("SERVER_BIND_ADDR").expect("reading bind addr from env");
|
2023-03-07 22:45:37 -08:00
|
|
|
|
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();
|
2023-05-17 09:11:17 -07:00
|
|
|
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 {
|
2023-05-05 18:41:17 -07:00
|
|
|
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();
|
2023-05-30 10:01:47 -07:00
|
|
|
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
|
|
|
}
|