use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub struct HealthSpec {
pub interval_ms: u64,
pub miss_limit: u32,
}
impl Default for HealthSpec {
fn default() -> Self {
Self {
interval_ms: 10_000,
miss_limit: 3,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum SampleState {
Loaded,
Running,
Exited,
Degraded,
Unknown,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct HealthSample {
pub state: SampleState,
pub exit_code: Option<i32>,
pub continuous: bool,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Health {
Healthy,
Finished,
Unhealthy(String),
}
pub fn judge_process(s: &HealthSample) -> Health {
match s.state {
SampleState::Running => Health::Healthy,
SampleState::Loaded => Health::Healthy,
SampleState::Degraded => Health::Unhealthy("adapter reports it degraded".into()),
SampleState::Unknown => Health::Unhealthy("adapter does not know the instance".into()),
SampleState::Exited if !s.continuous && s.exit_code == Some(0) => Health::Finished,
SampleState::Exited => Health::Unhealthy(match s.exit_code {
Some(c) => format!("exited with code {c}"),
None => "exited (killed by a signal)".into(),
}),
}
}