Skip to content

Commit e2f39b0

Browse files
author
Ariel Ben-Yehuda
committed
feat: add parsing of CPU and Memory fields
1 parent babaa12 commit e2f39b0

File tree

5 files changed

+257
-36
lines changed

5 files changed

+257
-36
lines changed

Cargo.lock

Lines changed: 26 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ chrono = "0.4"
1717
futures = { version = "0.3", default-features = false, features = ["alloc"] }
1818
libloading = "0.8"
1919
reqwest = { version = "0.12", default-features = false, optional = true, features = ["charset", "http2"] }
20+
ordered-float = { version = "5", features=["serde"]}
2021
serde_json = "1"
2122
serde = { version = "1", features = ["derive"] }
2223
tempfile = "3"
@@ -47,6 +48,9 @@ s3-no-defaults = ["dep:aws-config", "dep:aws-sdk-s3"]
4748
aws-metadata = ["aws-metadata-no-defaults", "aws-config/default", "reqwest/rustls-tls"]
4849
# A version of the aws-metadata feature that does not enable AWS default features
4950
aws-metadata-no-defaults = ["dep:reqwest", "dep:aws-config", "dep:aws-arn"]
51+
# *Unstable* feature to allow Fargate CPU count. The feature will be stabilized
52+
# and removed soon.
53+
__unstable-fargate-cpu-count = []
5054

5155
[package.metadata.docs.rs]
5256
all-features = true

src/metadata/aws.rs

Lines changed: 67 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ use reqwest::Method;
99
use serde::Deserialize;
1010
use thiserror::Error;
1111

12+
use crate::metadata::OrderedF64;
13+
1214
use super::AgentMetadata;
1315

1416
/// An error converting Fargate IMDS metadata to Agent metadata. This error
@@ -80,12 +82,25 @@ async fn read_ec2_metadata() -> Result<ImdsEc2InstanceMetadata, AwsProfilerMetad
8082
Ok(serde_json::from_str(imds_document.as_ref())?)
8183
}
8284

85+
#[derive(Deserialize, Debug, PartialEq, Eq)]
86+
struct FargateLimits {
87+
#[serde(rename = "CPU")]
88+
cpu: Option<OrderedF64>,
89+
#[serde(rename = "Memory")]
90+
memory: Option<u64>,
91+
}
92+
8393
#[derive(Deserialize, Debug, PartialEq, Eq)]
8494
struct FargateMetadata {
8595
#[serde(rename = "Cluster")]
8696
cluster: String,
8797
#[serde(rename = "TaskARN")]
8898
task_arn: String,
99+
// According to <https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-metadata-endpoint-v4-fargate-response.html>
100+
// Limits: The resource limits specified at the task levels such as CPU (expressed in vCPUs) and memory.
101+
// This parameter is omitted if no resource limits are defined.
102+
#[serde(rename = "Limits")]
103+
limits: Option<FargateLimits>,
89104
}
90105

91106
async fn read_fargate_metadata(
@@ -144,6 +159,16 @@ impl super::AgentMetadata {
144159
.to_string(),
145160
ecs_task_arn: fargate_metadata.task_arn,
146161
ecs_cluster_arn: fargate_metadata.cluster,
162+
#[cfg(feature = "__unstable-fargate-cpu-count")]
163+
cpu_limit: fargate_metadata
164+
.limits
165+
.as_ref()
166+
.and_then(|limits| limits.cpu),
167+
#[cfg(feature = "__unstable-fargate-cpu-count")]
168+
memory_limit: fargate_metadata
169+
.limits
170+
.as_ref()
171+
.and_then(|limits| limits.memory),
147172
})
148173
}
149174
}
@@ -173,6 +198,7 @@ pub async fn load_agent_metadata() -> Result<AgentMetadata, AwsProfilerMetadataE
173198
#[cfg(test)]
174199
mod tests {
175200
use super::*;
201+
use test_case::test_case;
176202

177203
// these constants are "anonymized" (aka randomly generated in that format)
178204

@@ -237,10 +263,29 @@ mod tests {
237263
)
238264
}
239265

240-
#[test]
241-
fn test_fargate_metadata() {
242-
let json_str = r#"
243-
{
266+
#[test_case(
267+
r#"{
268+
"Cluster": "arn:aws:ecs:us-east-1:123456789012:cluster/profiler-metadata-cluster",
269+
"TaskARN": "arn:aws:ecs:us-east-1:123456789012:task/profiler-metadata-cluster/5261e761e0e2a3d92da3f02c8e5bab1f"
270+
}"#,
271+
None,
272+
None,
273+
None
274+
; "no_limits"
275+
)]
276+
#[test_case(
277+
r#"{
278+
"Cluster": "arn:aws:ecs:us-east-1:123456789012:cluster/profiler-metadata-cluster",
279+
"TaskARN": "arn:aws:ecs:us-east-1:123456789012:task/profiler-metadata-cluster/5261e761e0e2a3d92da3f02c8e5bab1f",
280+
"Limits": {}
281+
}"#,
282+
Some(FargateLimits { cpu: None, memory: None }),
283+
None,
284+
None
285+
; "empty_limits"
286+
)]
287+
#[test_case(
288+
r#"{
244289
"Cluster": "arn:aws:ecs:us-east-1:123456789012:cluster/profiler-metadata-cluster",
245290
"TaskARN": "arn:aws:ecs:us-east-1:123456789012:task/profiler-metadata-cluster/5261e761e0e2a3d92da3f02c8e5bab1f",
246291
"Family": "profiler-metadata",
@@ -316,17 +361,27 @@ mod tests {
316361
"Utilized": 208,
317362
"Reserved": 20496
318363
}
319-
}
320-
"#;
321-
322-
let fargate_metadata: FargateMetadata = serde_json::from_str(&json_str).unwrap();
364+
}"#,
365+
Some(FargateLimits { cpu: Some(0.25.into()), memory: Some(2048) }),
366+
Some(0.25.into()),
367+
Some(2048)
368+
; "with_limits"
369+
)]
370+
fn test_fargate_metadata(
371+
json_str: &str,
372+
expected_limits: Option<FargateLimits>,
373+
_expected_cpu_limit: Option<OrderedF64>,
374+
_expected_memory_limit: Option<u64>,
375+
) {
376+
let fargate_metadata: FargateMetadata = serde_json::from_str(json_str).unwrap();
323377

324378
assert_eq!(
325379
fargate_metadata,
326380
FargateMetadata {
327381
cluster: "arn:aws:ecs:us-east-1:123456789012:cluster/profiler-metadata-cluster"
328382
.to_owned(),
329383
task_arn: "arn:aws:ecs:us-east-1:123456789012:task/profiler-metadata-cluster/5261e761e0e2a3d92da3f02c8e5bab1f".to_owned(),
384+
limits: expected_limits,
330385
}
331386
);
332387

@@ -339,6 +394,10 @@ mod tests {
339394
aws_region_id: "us-east-1".to_owned(),
340395
ecs_task_arn: "arn:aws:ecs:us-east-1:123456789012:task/profiler-metadata-cluster/5261e761e0e2a3d92da3f02c8e5bab1f".to_owned(),
341396
ecs_cluster_arn: "arn:aws:ecs:us-east-1:123456789012:cluster/profiler-metadata-cluster".to_owned(),
397+
#[cfg(feature = "__unstable-fargate-cpu-count")]
398+
cpu_limit: _expected_cpu_limit,
399+
#[cfg(feature = "__unstable-fargate-cpu-count")]
400+
memory_limit: _expected_memory_limit,
342401
}
343402
)
344403
}

0 commit comments

Comments
 (0)