Skip to main content

rivet_logger/processors/
hostname.rs

1use std::process::Command;
2use std::sync::OnceLock;
3
4use crate::logger::{BoxError, LogRecord, LogValue, Processor};
5
6static HOSTNAME_CACHE: OnceLock<String> = OnceLock::new();
7
8#[derive(Default)]
9pub struct Hostname;
10
11impl Processor for Hostname {
12    fn process(&self, mut record: LogRecord) -> Result<LogRecord, BoxError> {
13        let hostname = HOSTNAME_CACHE.get_or_init(resolve_hostname).clone();
14        record
15            .extra
16            .insert("hostname".to_string(), LogValue::String(hostname));
17        Ok(record)
18    }
19}
20
21fn resolve_hostname() -> String {
22    if let Some(hostname) = std::env::var("HOSTNAME")
23        .ok()
24        .filter(|value| !value.trim().is_empty())
25    {
26        return hostname;
27    }
28
29    let output = Command::new("hostname").output();
30    let Ok(output) = output else {
31        return String::new();
32    };
33    if !output.status.success() {
34        return String::new();
35    }
36
37    String::from_utf8_lossy(&output.stdout).trim().to_string()
38}