Compare commits

..

4 Commits

Author SHA1 Message Date
f4ddd2f6df
fix: metrics prometheus format 2025-04-17 22:13:12 +00:00
a200818518
feat: HTTP endpoint for metrics
actix server integrated for http
monitor app and VM contracts in /metrics
updated tokio version
2025-04-17 22:09:20 +00:00
eb9a89d1c5 Merge pull request 'fix: app node cron' (#2) from fix_app-cron into staging
Reviewed-on: #2
2025-04-17 22:08:43 +00:00
9f22c8fb14
fix: app node cron
fix validating app node online status on cron
fix deadlock on app contract cron
2025-04-16 00:21:40 +00:00
2 changed files with 43 additions and 9 deletions

@ -1452,7 +1452,7 @@ impl BrainData {
let mut nodes = self.app_nodes.write().unwrap();
let mut app_contracts = self.app_contracts.write().unwrap();
for node in nodes.iter_mut() {
if self.daemon_tx.contains_key(&node.node_pubkey) {
if self.app_daemon_tx.contains_key(&node.node_pubkey) {
node.offline_minutes = 0;
continue;
}
@ -1501,8 +1501,17 @@ impl BrainData {
log::debug!("Running app contracts cron...");
{
let mut app_contracts = self.app_contracts.write().unwrap();
let app_nodes = self.app_nodes.read().unwrap();
app_contracts.retain_mut(|c| {
let node = self.find_app_node_by_pubkey(&c.node_pubkey).unwrap();
let node = match app_nodes
.iter()
.find(|n| n.node_pubkey == c.node_pubkey)
.cloned()
{
Some(n) => n,
None => return c.locked_nano > 0,
};
if node.offline_minutes == 0 {
let operator_wallet = node.operator_wallet.clone();
let minutes_to_collect = (Utc::now() - c.collected_at).num_minutes() as u64;
@ -1724,3 +1733,32 @@ impl BrainData {
self.app_contracts.write().unwrap().push(app_contracts);
}
}
impl BrainData {
pub fn metrics(&self) -> Result<String, Error> {
let app_nodes_read = self.app_nodes.read().unwrap();
let app_node_no = app_nodes_read.len();
drop(app_nodes_read);
let vm_nodes_read = self.vm_nodes.read().unwrap();
let vm_node_no = vm_nodes_read.len();
drop(vm_nodes_read);
let app_contract_no = self.list_all_app_contracts().len();
let vm_contract_no = self.list_all_contracts().len();
let account_no = self.list_accounts().len();
let operator_no = self.list_operators().len();
let locations = String::from("wip");
let metrics = vec![
format!("app_nodes {app_node_no}"),
format!("vm_nodes {vm_node_no}"),
format!("app_contracts {app_contract_no}"),
format!("vm_contracts {vm_contract_no}"),
format!("operators {operator_no}"),
format!("accounts {account_no}"),
format!("locations {locations}"),
]
.join("\n");
Ok(metrics)
}
}

@ -20,11 +20,7 @@ pub async fn http_metrics_server(listen_address: SocketAddr, state: Arc<BrainDat
#[get("/metrics")]
async fn homepage(data: web::Data<Arc<BrainData>>) -> impl Responder {
let vm_contracts = data.get_ref().list_all_contracts();
let app_contracts = data.get_ref().list_all_app_contracts();
let text = format!(
"App contracts: {:#?}\n\nVM contracts: {:#?}",
app_contracts, vm_contracts
);
HttpResponse::Ok().body(text)
let metrics_data = data.get_ref().metrics().unwrap_or_default();
HttpResponse::Ok().body(metrics_data)
}