From adb088cadc691139d712735c2f0a7779931c1599 Mon Sep 17 00:00:00 2001 From: Lucas Colombo Date: Mon, 1 Apr 2024 14:15:54 -0300 Subject: [PATCH] =?UTF-8?q?feat:=20=E2=9C=A8=20logging?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 2 +- Cargo.lock | 16 +++++++++++-- Cargo.toml | 6 ++--- Taskfile.yaml | 2 +- app/main.rs | 11 ++++++--- entities/Cargo.toml | 1 + entities/src/lib.rs | 27 ++++++++++++++++++--- grpc/Cargo.toml | 2 +- grpc/src/server.rs | 55 ++++++++++++++++++++++++++++++------------- 9 files changed, 91 insertions(+), 31 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index c51e4b3..00de050 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -5,7 +5,7 @@ // "entities": true, // โš™๏ธ - ".env": true, + // ".env": true, "Taskfile.yaml": true, ".cocorc": true, ".task": true, diff --git a/Cargo.lock b/Cargo.lock index 5d6e975..67b1f78 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -767,6 +767,7 @@ name = "entities" version = "0.1.0" dependencies = [ "eyre", + "lool", "sea-orm", ] @@ -1095,7 +1096,7 @@ version = "0.1.0" dependencies = [ "entities", "eyre", - "log", + "lool", "prost", "tonic", "tonic-build", @@ -1467,6 +1468,17 @@ dependencies = [ "value-bag", ] +[[package]] +name = "lool" +version = "0.0.5" +source = "sparse+http://lugit.local/api/packages/lucodear/cargo/" +checksum = "c727e0c375380178e0b15f8f54f249e5e2a9e72c20475e8a7807f4c72d253106" +dependencies = [ + "bitflags 2.5.0", + "eyre", + "log", +] + [[package]] name = "matchers" version = "0.1.0" @@ -2250,7 +2262,7 @@ dependencies = [ "entities", "eyre", "grpc", - "log", + "lool", "tokio", ] diff --git a/Cargo.toml b/Cargo.toml index 1e570be..1272264 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,8 +25,8 @@ path = "app/main.rs" members = [".", "migration", "entities", "grpc"] [workspace.dependencies] -log = { version = "0.4.21" } -eyre = { version = "0.6.12" } +lool = { version = "0.0.5", registry = "lugit" } # crates: disable-check +eyre = { version = "0.6.12", default-features = false } [dependencies] # internal @@ -34,8 +34,8 @@ entities = { path = "entities" } grpc = { path = "grpc" } # workspace -log = { workspace = true } eyre = { workspace = true, default-features = false, features = ["auto-install"] } +lool = { workspace = true, features = ["logger", "macros", "cli-stylize"] } # external tokio = { version = "1.36.0", features = ["macros", "rt-multi-thread"] } diff --git a/Taskfile.yaml b/Taskfile.yaml index 08376da..8d3c82c 100644 --- a/Taskfile.yaml +++ b/Taskfile.yaml @@ -37,4 +37,4 @@ tasks: lint: desc: ๐Ÿงถ lint rustler cmds: - - cargo clippy --fix --workspace --allow-dirty \ No newline at end of file + - cargo clippy --fix --workspace --allow-staged \ No newline at end of file diff --git a/app/main.rs b/app/main.rs index 6497c6c..7997f22 100644 --- a/app/main.rs +++ b/app/main.rs @@ -1,16 +1,21 @@ -use {dotenvy::dotenv, eyre::Result, log::info}; +use { + dotenvy::dotenv, + eyre::Result, + lool::logger::{info, ConsoleLogger, Level}, +}; // TODO: here we will trigger the start of both the grpc server and the websocket gateway // look at: https://github.com/hyperium/tonic/discussions/740 #[tokio::main] async fn main() -> Result<()> { + ConsoleLogger::default_setup(Level::Trace, "rustler")?; + dotenv()?; let conn = entities::db::get_connection().await?; - info!("Starting gRPC server..."); - grpc::server::start(conn.clone()).await?; + info!("Shutting down"); Ok(()) } diff --git a/entities/Cargo.toml b/entities/Cargo.toml index e040df0..037a431 100644 --- a/entities/Cargo.toml +++ b/entities/Cargo.toml @@ -11,6 +11,7 @@ path = "src/lib.rs" [dependencies] # common eyre = { workspace = true, default-features = false } +lool = { workspace = true } # external sea-orm = { version = "0.12.15", features = [ diff --git a/entities/src/lib.rs b/entities/src/lib.rs index 60e1fe4..ad52a1e 100644 --- a/entities/src/lib.rs +++ b/entities/src/lib.rs @@ -6,13 +6,33 @@ pub use sea_orm; pub mod db { use { eyre::Result, - sea_orm::{ConnectionTrait, Database, DatabaseConnection, DbBackend, Statement}, + lool::{cli::stylize::Stylize, logger::info, s}, + sea_orm::{ + ConnectOptions, ConnectionTrait, Database, DatabaseConnection, DbBackend, Statement, + }, std::sync::Arc, }; + const RUSTLER_DATABASE: &str = "RUSTLER_DATABASE"; + + fn get_default_conn_str() -> String { + let conn_str = s!("sqlite://rustler.db?mode=rwc"); + info!( + "No `{}` env var found, using default: {}", + RUSTLER_DATABASE.italic(), + conn_str.green() + ); + conn_str + } + pub async fn get_connection() -> Result> { - let db_conn_str = std::env::var("DATABASE_URL")?; - let conn = Arc::new(Database::connect(&db_conn_str).await?); + let db_conn_str = + std::env::var(RUSTLER_DATABASE).unwrap_or_else(|_| get_default_conn_str()); + + let mut conn_opts = ConnectOptions::new(db_conn_str.to_owned()); + conn_opts.sqlx_logging(false); + + let conn = Arc::new(Database::connect(conn_opts).await?); conn.query_one(Statement::from_string( DbBackend::Sqlite, @@ -23,6 +43,7 @@ pub mod db { )) .await?; + info!("Database to {} connection established", db_conn_str.green()); Ok(conn) } } diff --git a/grpc/Cargo.toml b/grpc/Cargo.toml index 1dfca8b..acd802c 100644 --- a/grpc/Cargo.toml +++ b/grpc/Cargo.toml @@ -10,7 +10,7 @@ path = "src/lib.rs" [dependencies] # common -log = { workspace = true } +lool = { workspace = true, features = ["logger"]} eyre = { workspace = true, default-features = false } # internal diff --git a/grpc/src/server.rs b/grpc/src/server.rs index bf5a4f9..fd44659 100644 --- a/grpc/src/server.rs +++ b/grpc/src/server.rs @@ -1,7 +1,13 @@ use { + self::market_mod::Empty, entities::{market, sea_orm::DatabaseConnection}, eyre::Result, - std::{sync::Arc, time::Instant}, + lool::{cli::stylize::Stylize, logger::info}, + market_mod::{ + market_api_server::{MarketApi, MarketApiServer}, + Market, Markets, + }, + std::{net::SocketAddr, sync::Arc, time::Instant}, tonic::{transport::Server, Request, Response, Status}, }; @@ -9,12 +15,7 @@ pub mod market_mod { tonic::include_proto!("market"); } -use market_mod::{ - market_api_server::{MarketApi, MarketApiServer}, - Market, Markets, -}; - -use self::market_mod::Empty; +const RUSTLER_GRPC_API_ADDR: &str = "RUSTLER_GRPC_API_ADDR"; impl Market { fn into_model(self) -> market::Model { @@ -56,37 +57,57 @@ pub struct GrpcServer { impl MarketApi for GrpcServer { async fn get_all(&self, _: Request) -> Result, Status> { let start = Instant::now(); - if let Ok(mkts) = self.svc.get_all().await { - println!("get_all took {:?}", start.elapsed()); + let response = if let Ok(mkts) = self.svc.get_all().await { Ok(Response::new(Markets { markets: mkts.into_iter().map(Market::from_model).collect(), })) } else { - println!("get_all took {:?}", start.elapsed()); Err(Status::internal("Failed to get markets")) - } + }; + + info!("`MarketApi.get_all` took {:?}", start.elapsed()); + + response } async fn create(&self, market: Request) -> Result, Status> { let start = Instant::now(); let mkt = market.into_inner().into_model(); - if let Ok(m) = self.svc.create(mkt).await { - println!("create took {:?}", start.elapsed()); + let response = if let Ok(m) = self.svc.create(mkt).await { Ok(Response::new(Market::from_model(m))) } else { - println!("create took {:?} on err", start.elapsed()); Err(Status::internal("Failed to create market")) - } + }; + + info!("`MarketApi.create` took {:?}", start.elapsed()); + + response } } /// Starts the gRPC server pub async fn start(conn: Arc) -> Result<()> { - let addr = "0.0.0.0:50051".parse()?; - let svc = market::Service::new(conn).await; + fn get_default_addr() -> String { + let addr = "0.0.0.0:50051"; + info!( + "`{}` not set, using default {}", + RUSTLER_GRPC_API_ADDR.italic(), + addr.green() + ); + addr.to_owned() + } + let addr: SocketAddr = + std::env::var(RUSTLER_GRPC_API_ADDR).unwrap_or_else(|_| get_default_addr()).parse()?; + + let svc = market::Service::new(conn).await; let server = GrpcServer { svc }; + + info!( + "๐ŸŽ‰ gRPC server listening on {}", + addr.clone().to_string().green() + ); Server::builder().add_service(MarketApiServer::new(server)).serve(addr).await?; Ok(())