count users script and stat
This commit is contained in:
parent
5d368bfd1d
commit
80dfe8b7f2
@ -21,6 +21,7 @@ use chrono::Utc;
|
|||||||
use deferred_rate_limiter::DeferredRateLimiter;
|
use deferred_rate_limiter::DeferredRateLimiter;
|
||||||
use derive_more::From;
|
use derive_more::From;
|
||||||
use entities::sea_orm_active_enums::LogLevel;
|
use entities::sea_orm_active_enums::LogLevel;
|
||||||
|
use entities::user;
|
||||||
use ethers::core::utils::keccak256;
|
use ethers::core::utils::keccak256;
|
||||||
use ethers::prelude::{Address, Block, Bytes, Transaction, TxHash, H256, U64};
|
use ethers::prelude::{Address, Block, Bytes, Transaction, TxHash, H256, U64};
|
||||||
use ethers::utils::rlp::{Decodable, Rlp};
|
use ethers::utils::rlp::{Decodable, Rlp};
|
||||||
@ -30,7 +31,9 @@ use hashbrown::{HashMap, HashSet};
|
|||||||
use ipnet::IpNet;
|
use ipnet::IpNet;
|
||||||
use log::{debug, error, info, trace, warn, Level};
|
use log::{debug, error, info, trace, warn, Level};
|
||||||
use metered::{metered, ErrorCount, HitCount, ResponseTime, Throughput};
|
use metered::{metered, ErrorCount, HitCount, ResponseTime, Throughput};
|
||||||
use migration::sea_orm::{self, ConnectionTrait, Database, DatabaseConnection};
|
use migration::sea_orm::{
|
||||||
|
self, ConnectionTrait, Database, DatabaseConnection, EntityTrait, PaginatorTrait,
|
||||||
|
};
|
||||||
use migration::sea_query::table::ColumnDef;
|
use migration::sea_query::table::ColumnDef;
|
||||||
use migration::{Alias, DbErr, Migrator, MigratorTrait, Table};
|
use migration::{Alias, DbErr, Migrator, MigratorTrait, Table};
|
||||||
use moka::future::Cache;
|
use moka::future::Cache;
|
||||||
@ -710,6 +713,21 @@ impl Web3ProxyApp {
|
|||||||
// TODO: what globals? should this be the hostname or what?
|
// TODO: what globals? should this be the hostname or what?
|
||||||
// globals.insert("service", "web3_proxy");
|
// globals.insert("service", "web3_proxy");
|
||||||
|
|
||||||
|
#[derive(Default, Serialize)]
|
||||||
|
struct UserCount(i64);
|
||||||
|
|
||||||
|
let user_count: UserCount = if let Some(db) = self.db_conn() {
|
||||||
|
match user::Entity::find().count(&db).await {
|
||||||
|
Ok(user_count) => UserCount(user_count as i64),
|
||||||
|
Err(err) => {
|
||||||
|
warn!("unable to count users: {:?}", err);
|
||||||
|
UserCount(-1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
UserCount(-1)
|
||||||
|
};
|
||||||
|
|
||||||
#[derive(Default, Serialize)]
|
#[derive(Default, Serialize)]
|
||||||
struct RecentCounts {
|
struct RecentCounts {
|
||||||
one_week: i64,
|
one_week: i64,
|
||||||
@ -846,6 +864,7 @@ impl Web3ProxyApp {
|
|||||||
recent_ip_counts: RecentCounts,
|
recent_ip_counts: RecentCounts,
|
||||||
recent_user_id_counts: RecentCounts,
|
recent_user_id_counts: RecentCounts,
|
||||||
recent_tx_counts: RecentCounts,
|
recent_tx_counts: RecentCounts,
|
||||||
|
user_count: UserCount,
|
||||||
}
|
}
|
||||||
|
|
||||||
let metrics = CombinedMetrics {
|
let metrics = CombinedMetrics {
|
||||||
@ -854,6 +873,7 @@ impl Web3ProxyApp {
|
|||||||
recent_ip_counts,
|
recent_ip_counts,
|
||||||
recent_user_id_counts,
|
recent_user_id_counts,
|
||||||
recent_tx_counts,
|
recent_tx_counts,
|
||||||
|
user_count,
|
||||||
};
|
};
|
||||||
|
|
||||||
serde_prometheus::to_string(&metrics, Some("web3_proxy"), globals)
|
serde_prometheus::to_string(&metrics, Some("web3_proxy"), globals)
|
||||||
|
@ -11,7 +11,7 @@ use migration::sea_orm::{
|
|||||||
/// change a user's address.
|
/// change a user's address.
|
||||||
#[derive(FromArgs, PartialEq, Eq, Debug)]
|
#[derive(FromArgs, PartialEq, Eq, Debug)]
|
||||||
#[argh(subcommand, name = "change_user_address")]
|
#[argh(subcommand, name = "change_user_address")]
|
||||||
pub struct ChangeUserAddressCommand {
|
pub struct ChangeUserAddressSubCommand {
|
||||||
/// the address of the user you want to change
|
/// the address of the user you want to change
|
||||||
#[argh(positional)]
|
#[argh(positional)]
|
||||||
old_address: String,
|
old_address: String,
|
||||||
@ -21,7 +21,7 @@ pub struct ChangeUserAddressCommand {
|
|||||||
new_address: String,
|
new_address: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ChangeUserAddressCommand {
|
impl ChangeUserAddressSubCommand {
|
||||||
pub async fn main(self, db_conn: &DatabaseConnection) -> anyhow::Result<()> {
|
pub async fn main(self, db_conn: &DatabaseConnection) -> anyhow::Result<()> {
|
||||||
let old_address: Address = self.old_address.parse()?;
|
let old_address: Address = self.old_address.parse()?;
|
||||||
let new_address: Address = self.new_address.parse()?;
|
let new_address: Address = self.new_address.parse()?;
|
||||||
|
@ -13,7 +13,7 @@ use web3_proxy::frontend::authorization::RpcSecretKey;
|
|||||||
/// change a user's tier.
|
/// change a user's tier.
|
||||||
#[derive(FromArgs, PartialEq, Eq, Debug)]
|
#[derive(FromArgs, PartialEq, Eq, Debug)]
|
||||||
#[argh(subcommand, name = "change_user_address_by_key")]
|
#[argh(subcommand, name = "change_user_address_by_key")]
|
||||||
pub struct ChangeUserAddressByKeyCommand {
|
pub struct ChangeUserAddressByKeySubCommand {
|
||||||
#[argh(positional)]
|
#[argh(positional)]
|
||||||
/// the RPC key owned by the user you want to change.
|
/// the RPC key owned by the user you want to change.
|
||||||
rpc_secret_key: RpcSecretKey,
|
rpc_secret_key: RpcSecretKey,
|
||||||
@ -23,7 +23,7 @@ pub struct ChangeUserAddressByKeyCommand {
|
|||||||
new_address: String,
|
new_address: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ChangeUserAddressByKeyCommand {
|
impl ChangeUserAddressByKeySubCommand {
|
||||||
pub async fn main(self, db_conn: &DatabaseConnection) -> anyhow::Result<()> {
|
pub async fn main(self, db_conn: &DatabaseConnection) -> anyhow::Result<()> {
|
||||||
let rpc_secret_key: Uuid = self.rpc_secret_key.into();
|
let rpc_secret_key: Uuid = self.rpc_secret_key.into();
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@ use migration::sea_orm::{
|
|||||||
/// change a user's tier.
|
/// change a user's tier.
|
||||||
#[derive(FromArgs, PartialEq, Eq, Debug)]
|
#[derive(FromArgs, PartialEq, Eq, Debug)]
|
||||||
#[argh(subcommand, name = "change_user_tier")]
|
#[argh(subcommand, name = "change_user_tier")]
|
||||||
pub struct ChangeUserTierCommand {
|
pub struct ChangeUserTierSubCommand {
|
||||||
/// the title of the user tier you are going to modify.
|
/// the title of the user tier you are going to modify.
|
||||||
#[argh(positional)]
|
#[argh(positional)]
|
||||||
user_tier_title: String,
|
user_tier_title: String,
|
||||||
@ -24,7 +24,7 @@ pub struct ChangeUserTierCommand {
|
|||||||
max_concurrent_requests: Option<u32>,
|
max_concurrent_requests: Option<u32>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ChangeUserTierCommand {
|
impl ChangeUserTierSubCommand {
|
||||||
// TODO: don't expose the RpcSecretKeys at all. Better to take a user/key id. this is definitely most convenient
|
// TODO: don't expose the RpcSecretKeys at all. Better to take a user/key id. this is definitely most convenient
|
||||||
|
|
||||||
pub async fn main(self, db_conn: &DatabaseConnection) -> anyhow::Result<()> {
|
pub async fn main(self, db_conn: &DatabaseConnection) -> anyhow::Result<()> {
|
||||||
|
@ -11,7 +11,7 @@ use migration::sea_orm::{
|
|||||||
/// change a user's tier.
|
/// change a user's tier.
|
||||||
#[derive(FromArgs, PartialEq, Eq, Debug)]
|
#[derive(FromArgs, PartialEq, Eq, Debug)]
|
||||||
#[argh(subcommand, name = "change_user_tier_by_address")]
|
#[argh(subcommand, name = "change_user_tier_by_address")]
|
||||||
pub struct ChangeUserTierByAddressCommand {
|
pub struct ChangeUserTierByAddressSubCommand {
|
||||||
#[argh(positional)]
|
#[argh(positional)]
|
||||||
/// the address of the user you want to change.
|
/// the address of the user you want to change.
|
||||||
user_address: Address,
|
user_address: Address,
|
||||||
@ -21,7 +21,7 @@ pub struct ChangeUserTierByAddressCommand {
|
|||||||
user_tier_title: String,
|
user_tier_title: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ChangeUserTierByAddressCommand {
|
impl ChangeUserTierByAddressSubCommand {
|
||||||
pub async fn main(self, db_conn: &DatabaseConnection) -> anyhow::Result<()> {
|
pub async fn main(self, db_conn: &DatabaseConnection) -> anyhow::Result<()> {
|
||||||
let address: Vec<u8> = self.user_address.to_fixed_bytes().into();
|
let address: Vec<u8> = self.user_address.to_fixed_bytes().into();
|
||||||
|
|
||||||
|
@ -12,7 +12,7 @@ use web3_proxy::frontend::authorization::RpcSecretKey;
|
|||||||
/// change a user's tier.
|
/// change a user's tier.
|
||||||
#[derive(FromArgs, PartialEq, Eq, Debug)]
|
#[derive(FromArgs, PartialEq, Eq, Debug)]
|
||||||
#[argh(subcommand, name = "change_user_tier_by_key")]
|
#[argh(subcommand, name = "change_user_tier_by_key")]
|
||||||
pub struct ChangeUserTierByKeyCommand {
|
pub struct ChangeUserTierByKeySubCommand {
|
||||||
#[argh(positional)]
|
#[argh(positional)]
|
||||||
/// the RPC key owned by the user you want to change.
|
/// the RPC key owned by the user you want to change.
|
||||||
rpc_secret_key: RpcSecretKey,
|
rpc_secret_key: RpcSecretKey,
|
||||||
@ -22,7 +22,7 @@ pub struct ChangeUserTierByKeyCommand {
|
|||||||
user_tier_title: String,
|
user_tier_title: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ChangeUserTierByKeyCommand {
|
impl ChangeUserTierByKeySubCommand {
|
||||||
// TODO: don't expose the RpcSecretKeys at all. Better to take a user/key id. this is definitely most convenient
|
// TODO: don't expose the RpcSecretKeys at all. Better to take a user/key id. this is definitely most convenient
|
||||||
|
|
||||||
pub async fn main(self, db_conn: &DatabaseConnection) -> anyhow::Result<()> {
|
pub async fn main(self, db_conn: &DatabaseConnection) -> anyhow::Result<()> {
|
||||||
|
@ -45,7 +45,7 @@ impl FromStr for TimeFrame {
|
|||||||
/// calculate costs
|
/// calculate costs
|
||||||
#[derive(FromArgs, PartialEq, Debug, Eq)]
|
#[derive(FromArgs, PartialEq, Debug, Eq)]
|
||||||
#[argh(subcommand, name = "cost_calculator")]
|
#[argh(subcommand, name = "cost_calculator")]
|
||||||
pub struct CostCalculatorCommand {
|
pub struct CostCalculatorSubCommand {
|
||||||
/// dollar cost of running web3-proxy
|
/// dollar cost of running web3-proxy
|
||||||
#[argh(positional)]
|
#[argh(positional)]
|
||||||
cost: Decimal,
|
cost: Decimal,
|
||||||
@ -65,7 +65,7 @@ pub struct CostCalculatorCommand {
|
|||||||
// TODO: goal price
|
// TODO: goal price
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CostCalculatorCommand {
|
impl CostCalculatorSubCommand {
|
||||||
pub async fn main(self, db_conn: &DatabaseConnection) -> anyhow::Result<()> {
|
pub async fn main(self, db_conn: &DatabaseConnection) -> anyhow::Result<()> {
|
||||||
#[derive(Debug, FromQueryResult)]
|
#[derive(Debug, FromQueryResult)]
|
||||||
struct SelectResult {
|
struct SelectResult {
|
||||||
|
@ -5,6 +5,7 @@ mod change_user_tier_by_address;
|
|||||||
mod change_user_tier_by_key;
|
mod change_user_tier_by_key;
|
||||||
mod check_config;
|
mod check_config;
|
||||||
mod cost_calculator;
|
mod cost_calculator;
|
||||||
|
mod count_users;
|
||||||
mod create_user;
|
mod create_user;
|
||||||
mod drop_migration_lock;
|
mod drop_migration_lock;
|
||||||
mod health_compass;
|
mod health_compass;
|
||||||
@ -41,13 +42,14 @@ pub struct CliConfig {
|
|||||||
#[derive(FromArgs, PartialEq, Debug)]
|
#[derive(FromArgs, PartialEq, Debug)]
|
||||||
#[argh(subcommand)]
|
#[argh(subcommand)]
|
||||||
enum SubCommand {
|
enum SubCommand {
|
||||||
ChangeUserAddress(change_user_address::ChangeUserAddressCommand),
|
ChangeUserAddress(change_user_address::ChangeUserAddressSubCommand),
|
||||||
ChangeUserAddressByKey(change_user_address_by_key::ChangeUserAddressByKeyCommand),
|
ChangeUserAddressByKey(change_user_address_by_key::ChangeUserAddressByKeySubCommand),
|
||||||
ChangeUserTier(change_user_tier::ChangeUserTierCommand),
|
ChangeUserTier(change_user_tier::ChangeUserTierSubCommand),
|
||||||
ChangeUserTierByAddress(change_user_tier_by_address::ChangeUserTierByAddressCommand),
|
ChangeUserTierByAddress(change_user_tier_by_address::ChangeUserTierByAddressSubCommand),
|
||||||
ChangeUserTierByKey(change_user_tier_by_key::ChangeUserTierByKeyCommand),
|
ChangeUserTierByKey(change_user_tier_by_key::ChangeUserTierByKeySubCommand),
|
||||||
CheckConfig(check_config::CheckConfigSubCommand),
|
CheckConfig(check_config::CheckConfigSubCommand),
|
||||||
CostCalculatorCommand(cost_calculator::CostCalculatorCommand),
|
CostCalculator(cost_calculator::CostCalculatorSubCommand),
|
||||||
|
CountUsers(count_users::CountUsersSubCommand),
|
||||||
CreateUser(create_user::CreateUserSubCommand),
|
CreateUser(create_user::CreateUserSubCommand),
|
||||||
DropMigrationLock(drop_migration_lock::DropMigrationLockSubCommand),
|
DropMigrationLock(drop_migration_lock::DropMigrationLockSubCommand),
|
||||||
HealthCompass(health_compass::HealthCompassSubCommand),
|
HealthCompass(health_compass::HealthCompassSubCommand),
|
||||||
@ -119,7 +121,12 @@ async fn main() -> anyhow::Result<()> {
|
|||||||
|
|
||||||
x.main(&db_conn).await
|
x.main(&db_conn).await
|
||||||
}
|
}
|
||||||
SubCommand::CostCalculatorCommand(x) => {
|
SubCommand::CostCalculator(x) => {
|
||||||
|
let db_conn = get_db(cli_config.db_url, 1, 1).await?;
|
||||||
|
|
||||||
|
x.main(&db_conn).await
|
||||||
|
}
|
||||||
|
SubCommand::CountUsers(x) => {
|
||||||
let db_conn = get_db(cli_config.db_url, 1, 1).await?;
|
let db_conn = get_db(cli_config.db_url, 1, 1).await?;
|
||||||
|
|
||||||
x.main(&db_conn).await
|
x.main(&db_conn).await
|
||||||
|
Loading…
Reference in New Issue
Block a user