Add metrics setup
This commit is contained in:
parent
ba70b1b4d4
commit
0edc2a3ac3
|
@ -1050,6 +1050,7 @@ dependencies = [
|
||||||
"julianday",
|
"julianday",
|
||||||
"lox-library",
|
"lox-library",
|
||||||
"lox_utils",
|
"lox_utils",
|
||||||
|
"prometheus",
|
||||||
"rand 0.8.5",
|
"rand 0.8.5",
|
||||||
"rdsys_backend",
|
"rdsys_backend",
|
||||||
"reqwest",
|
"reqwest",
|
||||||
|
|
|
@ -28,6 +28,7 @@ lox_utils = { path = "../lox-utils", version = "0.1.0"}
|
||||||
rdsys_backend = { path = "../rdsys-backend-api", version = "0.2"}
|
rdsys_backend = { path = "../rdsys-backend-api", version = "0.2"}
|
||||||
clap = { version = "4.4.7", features = ["derive"] }
|
clap = { version = "4.4.7", features = ["derive"] }
|
||||||
serde_json = "1.0.108"
|
serde_json = "1.0.108"
|
||||||
|
prometheus = "0.13.3"
|
||||||
sled = "0.34.7"
|
sled = "0.34.7"
|
||||||
|
|
||||||
[dependencies.chrono]
|
[dependencies.chrono]
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
use std::sync::{Arc, Mutex};
|
use std::sync::{Arc, Mutex};
|
||||||
|
|
||||||
|
use crate::metrics::Metrics;
|
||||||
use crate::{lox_context, DbConfig};
|
use crate::{lox_context, DbConfig};
|
||||||
use chrono::{naive::Days, DateTime, Local, NaiveDateTime, Utc};
|
use chrono::{naive::Days, DateTime, Local, NaiveDateTime, Utc};
|
||||||
use lox_library::{BridgeAuth, BridgeDb};
|
use lox_library::{BridgeAuth, BridgeDb};
|
||||||
|
@ -31,12 +32,13 @@ impl DB {
|
||||||
db_config: DbConfig,
|
db_config: DbConfig,
|
||||||
roll_back_date: Option<String>,
|
roll_back_date: Option<String>,
|
||||||
) -> Result<(DB, lox_context::LoxServerContext), sled::Error> {
|
) -> Result<(DB, lox_context::LoxServerContext), sled::Error> {
|
||||||
let context: lox_context::LoxServerContext;
|
let mut context: lox_context::LoxServerContext;
|
||||||
let (lox_db, context) = match sled::open(db_config.db_path) {
|
let (lox_db, context) = match sled::open(db_config.db_path) {
|
||||||
Ok(lox_db) => {
|
Ok(lox_db) => {
|
||||||
// Check if the lox_db already exists
|
// Check if the lox_db already exists
|
||||||
if lox_db.was_recovered() {
|
if lox_db.was_recovered() {
|
||||||
context = read_lox_context_from_db(lox_db.clone(), roll_back_date);
|
context = read_lox_context_from_db(lox_db.clone(), roll_back_date);
|
||||||
|
context.metrics = Metrics::default();
|
||||||
//Otherwise, create a new Lox context
|
//Otherwise, create a new Lox context
|
||||||
} else {
|
} else {
|
||||||
let new_db = BridgeDb::new();
|
let new_db = BridgeDb::new();
|
||||||
|
@ -46,6 +48,7 @@ impl DB {
|
||||||
ba: Arc::new(Mutex::new(new_ba)),
|
ba: Arc::new(Mutex::new(new_ba)),
|
||||||
extra_bridges: Arc::new(Mutex::new(Vec::new())),
|
extra_bridges: Arc::new(Mutex::new(Vec::new())),
|
||||||
to_be_replaced_bridges: Arc::new(Mutex::new(Vec::new())),
|
to_be_replaced_bridges: Arc::new(Mutex::new(Vec::new())),
|
||||||
|
metrics: Metrics::default(),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
(DB { db: lox_db }, context)
|
(DB { db: lox_db }, context)
|
||||||
|
@ -123,13 +126,12 @@ fn use_last_context(lox_db: sled::Db) -> lox_context::LoxServerContext {
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::lox_context::LoxServerContext;
|
use super::lox_context::LoxServerContext;
|
||||||
use super::DbConfig;
|
|
||||||
use super::DB;
|
use super::DB;
|
||||||
|
use super::DbConfig;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_write_context() {
|
fn test_write_context() {
|
||||||
let (mut lox_db, _context) =
|
let (mut lox_db, _context) = DB::open_new_or_existing_db(DbConfig::default(), None).unwrap();
|
||||||
DB::open_new_or_existing_db(DbConfig::default(), None).unwrap();
|
|
||||||
assert!(
|
assert!(
|
||||||
lox_db.db.is_empty(),
|
lox_db.db.is_empty(),
|
||||||
"db read from context that shouldn't exist"
|
"db read from context that shouldn't exist"
|
||||||
|
|
|
@ -6,7 +6,7 @@ use lox_library::{
|
||||||
blockage_migration, check_blockage, issue_invite, level_up, migration, open_invite,
|
blockage_migration, check_blockage, issue_invite, level_up, migration, open_invite,
|
||||||
redeem_invite, trust_promotion,
|
redeem_invite, trust_promotion,
|
||||||
},
|
},
|
||||||
BridgeAuth, BridgeDb, ExceededMaxBridgesError, IssuerPubKey,
|
BridgeAuth, BridgeDb, ExceededMaxBridgesError, IssuerPubKey, MAX_DAILY_BRIDGES,
|
||||||
};
|
};
|
||||||
use rdsys_backend::proto::{Resource, ResourceState};
|
use rdsys_backend::proto::{Resource, ResourceState};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
@ -19,6 +19,7 @@ use std::{
|
||||||
use zkp::ProofError;
|
use zkp::ProofError;
|
||||||
|
|
||||||
use crate::resource_parser::{parse_into_bridgelines, sort_for_parsing};
|
use crate::resource_parser::{parse_into_bridgelines, sort_for_parsing};
|
||||||
|
use crate::metrics::Metrics;
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||||
pub struct LoxServerContext {
|
pub struct LoxServerContext {
|
||||||
|
@ -26,6 +27,8 @@ pub struct LoxServerContext {
|
||||||
pub ba: Arc<Mutex<BridgeAuth>>,
|
pub ba: Arc<Mutex<BridgeAuth>>,
|
||||||
pub extra_bridges: Arc<Mutex<Vec<BridgeLine>>>,
|
pub extra_bridges: Arc<Mutex<Vec<BridgeLine>>>,
|
||||||
pub to_be_replaced_bridges: Arc<Mutex<Vec<BridgeLine>>>,
|
pub to_be_replaced_bridges: Arc<Mutex<Vec<BridgeLine>>>,
|
||||||
|
#[serde(skip)]
|
||||||
|
pub metrics: Metrics,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl LoxServerContext {
|
impl LoxServerContext {
|
||||||
|
@ -320,7 +323,16 @@ impl LoxServerContext {
|
||||||
fn gen_invite(&self) -> Result<lox_utils::Invite, ExceededMaxBridgesError> {
|
fn gen_invite(&self) -> Result<lox_utils::Invite, ExceededMaxBridgesError> {
|
||||||
let mut obj = self.db.lock().unwrap();
|
let mut obj = self.db.lock().unwrap();
|
||||||
match obj.invite() {
|
match obj.invite() {
|
||||||
Ok(invite) => Ok(lox_utils::Invite { invite }),
|
Ok(invite) => {
|
||||||
|
if obj.current_k == 1 {
|
||||||
|
self.metrics.k_reset_count.inc();
|
||||||
|
}
|
||||||
|
// Count the number of total bridge requests
|
||||||
|
if obj.daily_bridges_distributed <= MAX_DAILY_BRIDGES {
|
||||||
|
self.metrics.buckets_requested_today.inc();
|
||||||
|
}
|
||||||
|
Ok(lox_utils::Invite { invite })
|
||||||
|
}
|
||||||
Err(e) => Err(e),
|
Err(e) => Err(e),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -431,6 +443,7 @@ impl LoxServerContext {
|
||||||
match self.open_inv(req) {
|
match self.open_inv(req) {
|
||||||
Ok(resp) => {
|
Ok(resp) => {
|
||||||
let response = serde_json::to_string(&resp).unwrap();
|
let response = serde_json::to_string(&resp).unwrap();
|
||||||
|
self.metrics.open_inv_count.inc();
|
||||||
prepare_header(response)
|
prepare_header(response)
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
|
@ -448,6 +461,7 @@ impl LoxServerContext {
|
||||||
match self.trust_promo(req) {
|
match self.trust_promo(req) {
|
||||||
Ok(resp) => {
|
Ok(resp) => {
|
||||||
let response = serde_json::to_string(&resp).unwrap();
|
let response = serde_json::to_string(&resp).unwrap();
|
||||||
|
self.metrics.trust_promo_count.inc();
|
||||||
prepare_header(response)
|
prepare_header(response)
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
|
@ -465,6 +479,7 @@ impl LoxServerContext {
|
||||||
match self.trust_migration(req) {
|
match self.trust_migration(req) {
|
||||||
Ok(resp) => {
|
Ok(resp) => {
|
||||||
let response = serde_json::to_string(&resp).unwrap();
|
let response = serde_json::to_string(&resp).unwrap();
|
||||||
|
self.metrics.trust_mig_count.inc();
|
||||||
prepare_header(response)
|
prepare_header(response)
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
|
@ -482,6 +497,7 @@ impl LoxServerContext {
|
||||||
match self.level_up(req) {
|
match self.level_up(req) {
|
||||||
Ok(resp) => {
|
Ok(resp) => {
|
||||||
let response = serde_json::to_string(&resp).unwrap();
|
let response = serde_json::to_string(&resp).unwrap();
|
||||||
|
self.metrics.level_up_count.inc();
|
||||||
prepare_header(response)
|
prepare_header(response)
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
|
@ -499,6 +515,7 @@ impl LoxServerContext {
|
||||||
match self.issue_invite(req) {
|
match self.issue_invite(req) {
|
||||||
Ok(resp) => {
|
Ok(resp) => {
|
||||||
let response = serde_json::to_string(&resp).unwrap();
|
let response = serde_json::to_string(&resp).unwrap();
|
||||||
|
self.metrics.issue_invite_count.inc();
|
||||||
prepare_header(response)
|
prepare_header(response)
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
|
@ -516,6 +533,7 @@ impl LoxServerContext {
|
||||||
match self.redeem_invite(req) {
|
match self.redeem_invite(req) {
|
||||||
Ok(resp) => {
|
Ok(resp) => {
|
||||||
let response = serde_json::to_string(&resp).unwrap();
|
let response = serde_json::to_string(&resp).unwrap();
|
||||||
|
self.metrics.redeem_invite_count.inc();
|
||||||
prepare_header(response)
|
prepare_header(response)
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
|
@ -533,6 +551,7 @@ impl LoxServerContext {
|
||||||
match self.check_blockage(req) {
|
match self.check_blockage(req) {
|
||||||
Ok(resp) => {
|
Ok(resp) => {
|
||||||
let response = serde_json::to_string(&resp).unwrap();
|
let response = serde_json::to_string(&resp).unwrap();
|
||||||
|
self.metrics.check_blockage_count.inc();
|
||||||
prepare_header(response)
|
prepare_header(response)
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
|
@ -550,6 +569,7 @@ impl LoxServerContext {
|
||||||
match self.blockage_migration(req) {
|
match self.blockage_migration(req) {
|
||||||
Ok(resp) => {
|
Ok(resp) => {
|
||||||
let response = serde_json::to_string(&resp).unwrap();
|
let response = serde_json::to_string(&resp).unwrap();
|
||||||
|
self.metrics.blockage_migration_count.inc();
|
||||||
prepare_header(response)
|
prepare_header(response)
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
|
|
|
@ -16,6 +16,7 @@ use std::{
|
||||||
mod db_handler;
|
mod db_handler;
|
||||||
use db_handler::DB;
|
use db_handler::DB;
|
||||||
mod lox_context;
|
mod lox_context;
|
||||||
|
mod metrics;
|
||||||
mod request_handler;
|
mod request_handler;
|
||||||
use request_handler::handle;
|
use request_handler::handle;
|
||||||
mod resource_parser;
|
mod resource_parser;
|
||||||
|
|
|
@ -0,0 +1,103 @@
|
||||||
|
use futures::executor::block_on;
|
||||||
|
use prometheus::{Counter, Encoder, Opts, Registry, TextEncoder};
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub struct Metrics {
|
||||||
|
pub open_inv_count: Counter,
|
||||||
|
pub trust_promo_count: Counter,
|
||||||
|
pub trust_mig_count: Counter,
|
||||||
|
pub level_up_count: Counter,
|
||||||
|
pub issue_invite_count: Counter,
|
||||||
|
pub redeem_invite_count: Counter,
|
||||||
|
pub check_blockage_count: Counter,
|
||||||
|
pub blockage_migration_count: Counter,
|
||||||
|
pub k_reset_count: Counter,
|
||||||
|
pub buckets_requested_today: Counter,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for Metrics {
|
||||||
|
fn default() -> Self {
|
||||||
|
// Create counters.
|
||||||
|
let open_inv_count = Counter::with_opts(Opts::new(
|
||||||
|
"open_inv_counter",
|
||||||
|
"number of open invitations distributed",
|
||||||
|
))
|
||||||
|
.unwrap();
|
||||||
|
let trust_promo_count = Counter::with_opts(Opts::new(
|
||||||
|
"trust_promo_counter",
|
||||||
|
"number of trust promotions requests",
|
||||||
|
))
|
||||||
|
.unwrap();
|
||||||
|
let trust_mig_count = Counter::with_opts(Opts::new(
|
||||||
|
"trust_mig_counter",
|
||||||
|
"number of trust migrations requests",
|
||||||
|
))
|
||||||
|
.unwrap();
|
||||||
|
let level_up_count =
|
||||||
|
Counter::with_opts(Opts::new("level_up_counter", "number of level up requests"))
|
||||||
|
.unwrap();
|
||||||
|
let issue_invite_count = Counter::with_opts(Opts::new(
|
||||||
|
"issue_invite_counter",
|
||||||
|
"number of issue invite requests",
|
||||||
|
))
|
||||||
|
.unwrap();
|
||||||
|
let redeem_invite_count =
|
||||||
|
Counter::with_opts(Opts::new("redeem_invite_counter", "number of level up requests"))
|
||||||
|
.unwrap();
|
||||||
|
let check_blockage_count = Counter::with_opts(Opts::new(
|
||||||
|
"check_blockage_counter",
|
||||||
|
"number of check blockage requests",
|
||||||
|
))
|
||||||
|
.unwrap();
|
||||||
|
let blockage_migration_count = Counter::with_opts(Opts::new(
|
||||||
|
"blockage_migration_counter",
|
||||||
|
"number of blockage migration requests",
|
||||||
|
))
|
||||||
|
.unwrap();
|
||||||
|
let k_reset_count = Counter::with_opts(Opts::new(
|
||||||
|
"k_reset_counter",
|
||||||
|
"number of times k has reset to 0",
|
||||||
|
))
|
||||||
|
.unwrap();
|
||||||
|
let buckets_requested_today = Counter::with_opts(Opts::new(
|
||||||
|
"buckets_requested_today",
|
||||||
|
"number of buckets used today",
|
||||||
|
))
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
// Create a Registry and register Counter.
|
||||||
|
let r = Registry::new();
|
||||||
|
r.register(Box::new(open_inv_count.clone())).unwrap();
|
||||||
|
r.register(Box::new(trust_promo_count.clone())).unwrap();
|
||||||
|
r.register(Box::new(trust_mig_count.clone())).unwrap();
|
||||||
|
r.register(Box::new(level_up_count.clone())).unwrap();
|
||||||
|
r.register(Box::new(issue_invite_count.clone())).unwrap();
|
||||||
|
r.register(Box::new(redeem_invite_count.clone())).unwrap();
|
||||||
|
r.register(Box::new(check_blockage_count.clone())).unwrap();
|
||||||
|
r.register(Box::new(blockage_migration_count.clone())).unwrap();
|
||||||
|
r.register(Box::new(k_reset_count.clone())).unwrap();
|
||||||
|
r.register(Box::new(buckets_requested_today.clone())).unwrap();
|
||||||
|
|
||||||
|
// Gather the metrics.
|
||||||
|
/* let mut buffer = vec![];
|
||||||
|
let encoder = TextEncoder::new();
|
||||||
|
let metric_families = r.gather();
|
||||||
|
encoder.encode(&metric_families, &mut buffer).unwrap();
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Output to the standard output.
|
||||||
|
// println!("{}", String::from_utf8(buffer).unwrap());
|
||||||
|
Metrics {
|
||||||
|
open_inv_count,
|
||||||
|
trust_promo_count,
|
||||||
|
trust_mig_count,
|
||||||
|
level_up_count,
|
||||||
|
issue_invite_count,
|
||||||
|
redeem_invite_count,
|
||||||
|
check_blockage_count,
|
||||||
|
blockage_migration_count,
|
||||||
|
k_reset_count,
|
||||||
|
buckets_requested_today,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -68,6 +68,7 @@ pub async fn handle(
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use crate::lox_context;
|
use crate::lox_context;
|
||||||
|
use crate::metrics::Metrics;
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
|
@ -230,6 +231,7 @@ mod tests {
|
||||||
ba: Arc::new(Mutex::new(lox_auth)),
|
ba: Arc::new(Mutex::new(lox_auth)),
|
||||||
extra_bridges: Arc::new(Mutex::new(Vec::new())),
|
extra_bridges: Arc::new(Mutex::new(Vec::new())),
|
||||||
to_be_replaced_bridges: Arc::new(Mutex::new(Vec::new())),
|
to_be_replaced_bridges: Arc::new(Mutex::new(Vec::new())),
|
||||||
|
metrics: Metrics::default(),
|
||||||
};
|
};
|
||||||
Self { context }
|
Self { context }
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue