Skip to main content

resource_tracker/collector/clouds/
vultr.rs

1use crate::metrics::CloudInfo;
2use serde::Deserialize;
3
4use super::{imds_get, new_imds_agent};
5
6#[derive(Debug, Deserialize)]
7struct Region {
8    regioncode: Option<String>,
9}
10
11#[derive(Debug, Deserialize)]
12struct Metadata {
13    instanceid: Option<String>,
14    #[serde(rename = "instance-v2-id")]
15    instance_v2_id: Option<String>,
16    region: Option<Region>,
17}
18
19/// Vultr cloud metadata via the instance metadata service.
20///
21/// Reference: <https://www.vultr.com/metadata/>
22pub fn probe() -> Option<CloudInfo> {
23    let agent = new_imds_agent();
24    let body = imds_get(&agent, "http://169.254.169.254/v1.json")?;
25    let meta: Metadata = serde_json::from_str(&body).ok()?;
26
27    if meta.instanceid.is_none() && meta.instance_v2_id.is_none() {
28        return None;
29    }
30
31    Some(CloudInfo {
32        cloud_vendor_id: Some("vultr".to_string()),
33        cloud_account_id: None,
34        cloud_region_id: meta
35            .region
36            .and_then(|r| r.regioncode)
37            .filter(|s| !s.is_empty() && s != "unknown"),
38        cloud_zone_id: None,
39        cloud_instance_type: None,
40    })
41}