Skip to main content

resource_tracker/collector/clouds/
hetzner.rs

1use crate::metrics::CloudInfo;
2
3use super::{imds_get, new_imds_agent};
4
5pub fn probe() -> Option<CloudInfo> {
6    let agent = new_imds_agent();
7    let text = imds_get(&agent, "http://169.254.169.254/hetzner/v1/metadata")?;
8
9    let mut instance_type: Option<String> = None;
10    let mut region: Option<String> = None;
11    for line in text.lines() {
12        let line = line.trim();
13        if line.is_empty() {
14            continue;
15        }
16        let Some((key, value)) = line.split_once(':') else {
17            continue;
18        };
19        match key.trim() {
20            "instance-id" => instance_type = Some(value.trim().to_string()),
21            "region" => region = Some(value.trim().to_string()),
22            _ => {}
23        }
24    }
25
26    Some(CloudInfo {
27        cloud_vendor_id: Some("hcloud".to_string()),
28        cloud_account_id: None,
29        cloud_region_id: region.filter(|s| !s.is_empty() && s != "unknown"),
30        cloud_zone_id: None,
31        cloud_instance_type: instance_type.filter(|s| !s.is_empty() && s != "unknown"),
32    })
33}