added metrics
Signed-off-by: Valentyn Faychuk <valy@detee.ltd>
This commit is contained in:
parent
f448bf790d
commit
ad2c5a7f6c
23
Cargo.lock
generated
23
Cargo.lock
generated
@ -2031,6 +2031,8 @@ dependencies = [
|
|||||||
"hyper 1.4.1",
|
"hyper 1.4.1",
|
||||||
"hyper-rustls 0.27.3",
|
"hyper-rustls 0.27.3",
|
||||||
"hyper-util",
|
"hyper-util",
|
||||||
|
"once_cell",
|
||||||
|
"prometheus",
|
||||||
"prost",
|
"prost",
|
||||||
"prost-types",
|
"prost-types",
|
||||||
"rand 0.8.5",
|
"rand 0.8.5",
|
||||||
@ -3226,6 +3228,21 @@ dependencies = [
|
|||||||
"unicode-ident",
|
"unicode-ident",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "prometheus"
|
||||||
|
version = "0.13.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3d33c28a30771f7f96db69893f78b857f7450d7e0237e9c8fc6427a81bae7ed1"
|
||||||
|
dependencies = [
|
||||||
|
"cfg-if",
|
||||||
|
"fnv",
|
||||||
|
"lazy_static",
|
||||||
|
"memchr",
|
||||||
|
"parking_lot",
|
||||||
|
"protobuf",
|
||||||
|
"thiserror",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "prost"
|
name = "prost"
|
||||||
version = "0.13.3"
|
version = "0.13.3"
|
||||||
@ -3279,6 +3296,12 @@ dependencies = [
|
|||||||
"prost",
|
"prost",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "protobuf"
|
||||||
|
version = "2.28.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "106dd99e98437432fed6519dedecfade6a06a73bb7b2a1e019fdd2bee5778d94"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "qstring"
|
name = "qstring"
|
||||||
version = "0.7.2"
|
version = "0.7.2"
|
||||||
|
@ -2,7 +2,7 @@ use crate::persistence::{Logfile, SealError, SealedFile};
|
|||||||
use dashmap::{DashMap, DashSet};
|
use dashmap::{DashMap, DashSet};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use serde_with::{serde_as, TimestampSeconds};
|
use serde_with::{serde_as, TimestampSeconds};
|
||||||
use std::time::{Duration, SystemTime};
|
use std::time::{Duration, SystemTime, UNIX_EPOCH};
|
||||||
|
|
||||||
type IP = String;
|
type IP = String;
|
||||||
pub const LOCALHOST: &str = "localhost";
|
pub const LOCALHOST: &str = "localhost";
|
||||||
@ -34,6 +34,23 @@ impl NodeInfo {
|
|||||||
serde_json::to_string(self).unwrap() // can fail only if time goes backwards :D
|
serde_json::to_string(self).unwrap() // can fail only if time goes backwards :D
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn to_metrics(&self, ip: &str) -> String {
|
||||||
|
let started_at = self.started_at.duration_since(UNIX_EPOCH).unwrap_or(Duration::ZERO);
|
||||||
|
let keepalive = self.keepalive.duration_since(UNIX_EPOCH).unwrap_or(Duration::ZERO);
|
||||||
|
let labels = format!("{{ip=\"{}\", public=\"{}\"}}", ip, self.public);
|
||||||
|
|
||||||
|
let mut res = String::new();
|
||||||
|
res.push_str(&format!("started_at{} {}\n", labels, started_at.as_secs()));
|
||||||
|
res.push_str(&format!("keepalive{} {}\n", labels, keepalive.as_secs()));
|
||||||
|
res.push_str(&format!("mint_requests{} {}\n", labels, self.mint_requests));
|
||||||
|
res.push_str(&format!("mints{} {}\n", labels, self.mints));
|
||||||
|
res.push_str(&format!("mratls_conns{} {}\n", labels, self.mratls_conns));
|
||||||
|
res.push_str(&format!("net_attacks{} {}\n", labels, self.net_attacks));
|
||||||
|
res.push_str(&format!("restarts{} {}\n", labels, self.restarts));
|
||||||
|
res.push_str(&format!("disk_attacks{} {}\n", labels, self.disk_attacks));
|
||||||
|
res
|
||||||
|
}
|
||||||
|
|
||||||
pub fn log(&self, ip: &IP) {
|
pub fn log(&self, ip: &IP) {
|
||||||
let json = format!("{{\"ip\":\"{}\",", ip) + &self.to_json()[1..];
|
let json = format!("{{\"ip\":\"{}\",", ip) + &self.to_json()[1..];
|
||||||
if let Err(e) = Logfile::append(LOG_PATH, &format!("{}\n", &json)) {
|
if let Err(e) = Logfile::append(LOG_PATH, &format!("{}\n", &json)) {
|
||||||
|
@ -78,6 +78,15 @@ async fn mint(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[get("/metrics")]
|
||||||
|
async fn metrics(ds: web::Data<Arc<State>>) -> HttpResponse {
|
||||||
|
let mut metrics = String::new();
|
||||||
|
for (ip, node) in ds.get_node_list() {
|
||||||
|
metrics.push_str(node.to_metrics(&ip).as_str());
|
||||||
|
}
|
||||||
|
HttpResponse::Ok().content_type("text/plain; version=0.0.4; charset=utf-8").body(metrics)
|
||||||
|
}
|
||||||
|
|
||||||
pub async fn init(state: Arc<State>, sol_client: Arc<SolClient>) {
|
pub async fn init(state: Arc<State>, sol_client: Arc<SolClient>) {
|
||||||
HttpServer::new(move || {
|
HttpServer::new(move || {
|
||||||
App::new()
|
App::new()
|
||||||
@ -86,6 +95,7 @@ pub async fn init(state: Arc<State>, sol_client: Arc<SolClient>) {
|
|||||||
.service(homepage)
|
.service(homepage)
|
||||||
.service(get_nodes)
|
.service(get_nodes)
|
||||||
.service(mint)
|
.service(mint)
|
||||||
|
.service(metrics)
|
||||||
})
|
})
|
||||||
.bind("0.0.0.0:31372")
|
.bind("0.0.0.0:31372")
|
||||||
.unwrap()
|
.unwrap()
|
||||||
|
Loading…
Reference in New Issue
Block a user