Skip to main content

resource_tracker/collector/clouds/
azure.rs

1use crate::metrics::CloudInfo;
2use serde::Deserialize;
3
4use super::new_imds_agent;
5
6#[derive(Debug, Deserialize)]
7struct InstanceMetadata {
8    compute: Option<Compute>,
9}
10
11#[derive(Debug, Deserialize)]
12struct Compute {
13    #[serde(rename = "vmSize")]
14    vm_size: Option<String>,
15    location: Option<String>,
16}
17
18pub fn probe() -> Option<CloudInfo> {
19    let agent = new_imds_agent();
20    let url = "http://169.254.169.254/metadata/instance?api-version=2021-02-01";
21    let body = agent
22        .get(url)
23        .header("Metadata", "true")
24        .call()
25        .ok()
26        .and_then(|mut r| r.body_mut().read_to_string().ok())?;
27    let meta: InstanceMetadata = serde_json::from_str(&body).ok()?;
28    let compute = meta.compute?;
29
30    Some(CloudInfo {
31        cloud_vendor_id: Some("azure".to_string()),
32        cloud_account_id: None,
33        cloud_region_id: compute.location.filter(|s| !s.is_empty()),
34        cloud_zone_id: None,
35        cloud_instance_type: compute.vm_size.filter(|s| !s.is_empty()),
36    })
37}