2023-01-11 23:05:13 -08:00
|
|
|
use log::{info, warn};
|
2023-01-10 06:56:41 -08:00
|
|
|
use solana_transaction_status::TransactionConfirmationStatus;
|
|
|
|
use tokio::{sync::RwLock, task::JoinHandle};
|
|
|
|
|
2023-01-27 12:35:29 -08:00
|
|
|
use crate::postgres::Postgres;
|
|
|
|
|
2023-01-10 06:56:41 -08:00
|
|
|
use super::TxSender;
|
|
|
|
use serde::{Deserialize, Serialize};
|
|
|
|
|
|
|
|
/// Background worker which captures metrics
|
|
|
|
pub struct MetricsCapture {
|
|
|
|
tx_sender: TxSender,
|
2023-01-27 12:35:29 -08:00
|
|
|
metrics: RwLock<Metrics>,
|
2023-01-10 06:56:41 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Clone, Default, Debug, Serialize, Deserialize)]
|
|
|
|
pub struct Metrics {
|
|
|
|
pub txs_sent: usize,
|
|
|
|
pub txs_confirmed: usize,
|
|
|
|
pub txs_finalized: usize,
|
|
|
|
pub txs_ps: usize,
|
|
|
|
pub txs_confirmed_ps: usize,
|
|
|
|
pub txs_finalized_ps: usize,
|
2023-01-11 23:05:13 -08:00
|
|
|
pub mem_used: Option<usize>,
|
2023-01-10 06:56:41 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
impl MetricsCapture {
|
|
|
|
pub fn new(tx_sender: TxSender) -> Self {
|
|
|
|
Self {
|
|
|
|
tx_sender,
|
|
|
|
metrics: Default::default(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-01-10 07:04:40 -08:00
|
|
|
pub async fn get_metrics(&self) -> Metrics {
|
|
|
|
self.metrics.read().await.to_owned()
|
|
|
|
}
|
|
|
|
|
2023-01-27 12:35:29 -08:00
|
|
|
pub fn capture(self, postgres: Option<Postgres>) -> JoinHandle<anyhow::Result<()>> {
|
2023-01-10 06:56:41 -08:00
|
|
|
let mut one_second = tokio::time::interval(std::time::Duration::from_secs(1));
|
|
|
|
|
|
|
|
tokio::spawn(async move {
|
|
|
|
info!("Capturing Metrics");
|
|
|
|
|
|
|
|
loop {
|
|
|
|
one_second.tick().await;
|
|
|
|
|
|
|
|
let txs_sent = self.tx_sender.txs_sent.len();
|
|
|
|
let mut txs_confirmed: usize = 0;
|
|
|
|
let mut txs_finalized: usize = 0;
|
|
|
|
|
|
|
|
for tx in self.tx_sender.txs_sent.iter() {
|
|
|
|
if let Some(tx) = &tx.value().status {
|
|
|
|
match tx.confirmation_status() {
|
|
|
|
TransactionConfirmationStatus::Confirmed => txs_confirmed += 1,
|
|
|
|
TransactionConfirmationStatus::Finalized => {
|
|
|
|
txs_confirmed += 1;
|
|
|
|
txs_finalized += 1;
|
|
|
|
}
|
|
|
|
_ => (),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
let mut metrics = self.metrics.write().await;
|
|
|
|
|
2023-01-10 07:14:55 -08:00
|
|
|
metrics.txs_ps = txs_sent.checked_sub(metrics.txs_sent).unwrap_or_default();
|
2023-01-10 07:14:25 -08:00
|
|
|
metrics.txs_confirmed_ps = txs_confirmed
|
|
|
|
.checked_sub(metrics.txs_confirmed)
|
|
|
|
.unwrap_or_default();
|
|
|
|
metrics.txs_finalized_ps = txs_finalized
|
|
|
|
.checked_sub(metrics.txs_finalized)
|
|
|
|
.unwrap_or_default();
|
2023-01-10 06:56:41 -08:00
|
|
|
|
|
|
|
metrics.txs_sent = txs_sent;
|
|
|
|
metrics.txs_confirmed = txs_confirmed;
|
|
|
|
metrics.txs_finalized = txs_finalized;
|
|
|
|
|
2023-01-11 23:05:13 -08:00
|
|
|
metrics.mem_used = match procinfo::pid::statm_self() {
|
|
|
|
Ok(statm) => Some(statm.size),
|
|
|
|
Err(err) => {
|
|
|
|
warn!("Error capturing memory consumption {err}");
|
|
|
|
None
|
|
|
|
}
|
|
|
|
};
|
2023-01-27 12:35:29 -08:00
|
|
|
|
|
|
|
if let Some(_postgres) = &postgres {
|
|
|
|
// postgres.send_metrics(metrics.clone()).await?;
|
|
|
|
}
|
2023-01-10 06:56:41 -08:00
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|