Added uptime metrics for radarr
This commit is contained in:
+1
-1
@@ -7,7 +7,7 @@ edition = "2021"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
anyhow = "1.0.68"
|
anyhow = "1.0.68"
|
||||||
chrono = "0.4"
|
chrono = { version = "0.4", features = ["serde"] }
|
||||||
clap = { version = "4.0.30", features = ["help", "usage", "error-context", "derive"] }
|
clap = { version = "4.0.30", features = ["help", "usage", "error-context", "derive"] }
|
||||||
confy = { version = "0.5.1", default_features = false, features = ["yaml_conf"] }
|
confy = { version = "0.5.1", default_features = false, features = ["yaml_conf"] }
|
||||||
crossterm = "0.25.0"
|
crossterm = "0.25.0"
|
||||||
|
|||||||
+2
-3
@@ -1,10 +1,9 @@
|
|||||||
use chrono::Duration;
|
use chrono::{DateTime, Utc};
|
||||||
|
|
||||||
use crate::network::radarr::DiskSpace;
|
|
||||||
|
|
||||||
#[derive(Default, Debug)]
|
#[derive(Default, Debug)]
|
||||||
pub struct RadarrData {
|
pub struct RadarrData {
|
||||||
pub free_space: u64,
|
pub free_space: u64,
|
||||||
pub total_space: u64,
|
pub total_space: u64,
|
||||||
pub version: String,
|
pub version: String,
|
||||||
|
pub start_time: DateTime<Utc>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,9 @@
|
|||||||
use std::borrow::Borrow;
|
|
||||||
|
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
|
use chrono::{DateTime, Utc};
|
||||||
use log::{debug, error};
|
use log::{debug, error};
|
||||||
use reqwest::RequestBuilder;
|
use reqwest::RequestBuilder;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use serde_json::Number;
|
use serde_json::Number;
|
||||||
|
|
||||||
use crate::app::radarr::RadarrData;
|
|
||||||
use crate::app::RadarrConfig;
|
use crate::app::RadarrConfig;
|
||||||
use crate::network::{Network, RadarrEvent};
|
use crate::network::{Network, RadarrEvent};
|
||||||
|
|
||||||
@@ -22,7 +19,7 @@ impl RadarrEvent {
|
|||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug)]
|
#[derive(Serialize, Deserialize, Debug)]
|
||||||
#[serde(rename_all = "camelCase")]
|
#[serde(rename_all = "camelCase")]
|
||||||
pub struct DiskSpace {
|
struct DiskSpace {
|
||||||
pub path: String,
|
pub path: String,
|
||||||
pub label: String,
|
pub label: String,
|
||||||
pub free_space: Number,
|
pub free_space: Number,
|
||||||
@@ -30,8 +27,10 @@ pub struct DiskSpace {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Deserialize, Debug)]
|
#[derive(Deserialize, Debug)]
|
||||||
pub struct SystemStatus {
|
#[serde(rename_all = "camelCase")]
|
||||||
|
struct SystemStatus {
|
||||||
version: String,
|
version: String,
|
||||||
|
start_time: DateTime<Utc>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> Network<'a> {
|
impl<'a> Network<'a> {
|
||||||
@@ -59,6 +58,7 @@ impl<'a> Network<'a> {
|
|||||||
Ok(system_status) => {
|
Ok(system_status) => {
|
||||||
let mut app = self.app.lock().await;
|
let mut app = self.app.lock().await;
|
||||||
app.data.radarr_data.version = system_status.version;
|
app.data.radarr_data.version = system_status.version;
|
||||||
|
app.data.radarr_data.start_time = system_status.start_time;
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
error!("Failed to fetch system status. {:?}", e);
|
error!("Failed to fetch system status. {:?}", e);
|
||||||
|
|||||||
+30
-8
@@ -1,9 +1,11 @@
|
|||||||
|
use std::ops::Sub;
|
||||||
|
use chrono::{Duration, Utc};
|
||||||
use tui::backend::Backend;
|
use tui::backend::Backend;
|
||||||
use tui::layout::{Alignment, Constraint, Direction, Layout, Rect};
|
use tui::layout::{Alignment, Constraint, Rect};
|
||||||
use tui::style::Color::Cyan;
|
use tui::style::Color::Cyan;
|
||||||
use tui::style::{Color, Style};
|
use tui::style::Style;
|
||||||
use tui::text::{Spans, Text};
|
use tui::text::{Spans, Text};
|
||||||
use tui::widgets::{Block, Borders, Gauge, LineGauge, Paragraph};
|
use tui::widgets::{Block, Borders, LineGauge, Paragraph};
|
||||||
use tui::{symbols, Frame};
|
use tui::{symbols, Frame};
|
||||||
|
|
||||||
use crate::app::radarr::RadarrData;
|
use crate::app::radarr::RadarrData;
|
||||||
@@ -51,6 +53,7 @@ fn draw_stats<B: Backend>(f: &mut Frame<'_, B>, app: &App, area: Rect) {
|
|||||||
let RadarrData {
|
let RadarrData {
|
||||||
free_space,
|
free_space,
|
||||||
total_space,
|
total_space,
|
||||||
|
start_time,
|
||||||
..
|
..
|
||||||
} = app.data.radarr_data;
|
} = app.data.radarr_data;
|
||||||
let ratio = if total_space == 0 {
|
let ratio = if total_space == 0 {
|
||||||
@@ -63,14 +66,29 @@ fn draw_stats<B: Backend>(f: &mut Frame<'_, B>, app: &App, area: Rect) {
|
|||||||
f.render_widget(base_block, area);
|
f.render_widget(base_block, area);
|
||||||
|
|
||||||
let chunks =
|
let chunks =
|
||||||
vertical_chunks_with_margin(vec![Constraint::Length(1), Constraint::Min(2)], area, 1);
|
vertical_chunks_with_margin(vec![
|
||||||
|
Constraint::Length(1),
|
||||||
|
Constraint::Length(1),
|
||||||
|
Constraint::Min(2)], area, 1);
|
||||||
|
|
||||||
let version = Paragraph::new(Text::from(format!(
|
let version_paragraph = Paragraph::new(Text::from(format!(
|
||||||
"Version: {}",
|
"Radarr Version: {}",
|
||||||
app.data.radarr_data.version
|
app.data.radarr_data.version
|
||||||
)))
|
)))
|
||||||
.block(Block::default());
|
.block(Block::default());
|
||||||
f.render_widget(version, chunks[0]);
|
|
||||||
|
let uptime = Utc::now().sub(start_time);
|
||||||
|
let days = uptime.num_days();
|
||||||
|
let day_difference = uptime.sub(Duration::days(days));
|
||||||
|
let hours = day_difference.num_hours();
|
||||||
|
let hour_difference = day_difference.sub(Duration::hours(hours));
|
||||||
|
let minutes = hour_difference.num_minutes();
|
||||||
|
let seconds = hour_difference.sub(Duration::minutes(minutes)).num_seconds();
|
||||||
|
|
||||||
|
let uptime_paragraph = Paragraph::new(Text::from(format!(
|
||||||
|
"Uptime: {}d {}:{}:{}",
|
||||||
|
days, hours, minutes, seconds
|
||||||
|
))).block(Block::default());
|
||||||
|
|
||||||
let space_gauge = LineGauge::default()
|
let space_gauge = LineGauge::default()
|
||||||
.block(Block::default().title("Storage:"))
|
.block(Block::default().title("Storage:"))
|
||||||
@@ -78,7 +96,10 @@ fn draw_stats<B: Backend>(f: &mut Frame<'_, B>, app: &App, area: Rect) {
|
|||||||
.line_set(symbols::line::THICK)
|
.line_set(symbols::line::THICK)
|
||||||
.ratio(ratio)
|
.ratio(ratio)
|
||||||
.label(Spans::from(format!("{:.0}%", ratio * 100.0)));
|
.label(Spans::from(format!("{:.0}%", ratio * 100.0)));
|
||||||
f.render_widget(space_gauge, chunks[1]);
|
|
||||||
|
f.render_widget(version_paragraph, chunks[0]);
|
||||||
|
f.render_widget(uptime_paragraph, chunks[1]);
|
||||||
|
f.render_widget(space_gauge, chunks[2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn draw_logo<B: Backend>(f: &mut Frame<'_, B>, area: Rect) {
|
fn draw_logo<B: Backend>(f: &mut Frame<'_, B>, area: Rect) {
|
||||||
@@ -89,5 +110,6 @@ fn draw_logo<B: Backend>(f: &mut Frame<'_, B>, area: Rect) {
|
|||||||
let logo = Paragraph::new(Text::from(RADARR_LOGO))
|
let logo = Paragraph::new(Text::from(RADARR_LOGO))
|
||||||
.block(Block::default())
|
.block(Block::default())
|
||||||
.alignment(Alignment::Center);
|
.alignment(Alignment::Center);
|
||||||
|
|
||||||
f.render_widget(logo, chunks[0]);
|
f.render_widget(logo, chunks[0]);
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -4,7 +4,7 @@ use log4rs::encode::pattern::PatternEncoder;
|
|||||||
use log::LevelFilter;
|
use log::LevelFilter;
|
||||||
|
|
||||||
pub fn init_logging_config() -> log4rs::Config {
|
pub fn init_logging_config() -> log4rs::Config {
|
||||||
let file_path = "/tmp/devtools.log";
|
let file_path = "/tmp/managarr.log";
|
||||||
let logfile = FileAppender::builder()
|
let logfile = FileAppender::builder()
|
||||||
.encoder(Box::new(PatternEncoder::new("{l} - {m}\n")))
|
.encoder(Box::new(PatternEncoder::new("{l} - {m}\n")))
|
||||||
.build(file_path)
|
.build(file_path)
|
||||||
|
|||||||
Reference in New Issue
Block a user