Added uptime metrics for radarr

This commit is contained in:
2023-08-08 10:50:04 -06:00
parent 08ecdea1e0
commit 3ae7e15961
5 changed files with 45 additions and 24 deletions
+1 -1
View File
@@ -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
View File
@@ -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>
} }
+6 -6
View File
@@ -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
View File
@@ -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
View File
@@ -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)