resource_tracker/collector/clouds/
vultr.rs1use 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
19pub 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}