提交 57f366e2 authored 作者: Serhij S's avatar Serhij S

show remote metrics

上级 d03f7858
差异被折叠。
......@@ -32,6 +32,7 @@ once_cell = "1.19.0"
bma-ts = { version = "0.1.14", features = ["serde", "chrono"] }
prettytable-rs = "0.10.0"
chrono = "0.4.39"
url = "2.5.4"
[target.'cfg(windows)'.dependencies]
ansi_term = "0.12.1"
......
......@@ -55,7 +55,16 @@ pub enum SubCommand {
about = "Rollback to the previous program version (requires RoboPLC Pro)"
)]
Rollback(RollbackCommand),
#[clap(name = "purge", about = "Purge program data directory")]
Purge,
#[clap(name = "metrics", about = "Get running program metrics")]
Metrics(MetricsCommand),
}
#[derive(Parser)]
pub struct MetricsCommand {
#[clap(short = 'p', long, help = "Metrics port", default_value = "9000")]
pub port: u16,
}
#[derive(Parser)]
......
......@@ -30,6 +30,7 @@ mod common;
mod config;
mod exec;
mod flashing;
mod metrics;
mod project;
mod remote;
mod ureq_err;
......@@ -156,6 +157,9 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
SubCommand::Purge => {
remote::purge(&url, &key, agent)?;
}
SubCommand::Metrics(m) => {
metrics::display(&url, m.port, agent)?;
}
}
Ok(())
}
use std::{
collections::BTreeMap,
io::{BufRead as _, BufReader},
};
use prettytable::{format, row, Table};
use ureq::Agent;
#[allow(clippy::too_many_arguments, clippy::fn_params_excessive_bools)]
pub fn display(url: &str, port: u16, agent: Agent) -> Result<(), Box<dyn std::error::Error>> {
let mut url = url::Url::parse(url)?;
url.set_port(Some(port)).map_err(|_| "invalid port")?;
let r = agent.get(url.as_str()).call()?;
if r.status() != 200 {
return Err(format!("Error: {}", r.status()).into());
}
let r = BufReader::new(r.into_reader());
let mut values = BTreeMap::new();
for line in r.lines() {
let line = line?;
let mut l = line.split('#').next().unwrap_or("");
l = l.trim();
if l.is_empty() {
continue;
}
let mut sp = l.splitn(2, ' ');
let name = sp.next().unwrap();
let value = sp.next().unwrap_or("");
values.insert(name.to_string(), value.to_string());
}
let mut table = Table::new();
let format = format::FormatBuilder::new()
.column_separator(' ')
.padding(1, 1)
.build();
table.set_format(format);
for (key, value) in values {
table.add_row(row![key, value]);
}
table.printstd();
Ok(())
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论