diff --git a/changelog.d/skip_empty_ecs_metrics.fix.md b/changelog.d/skip_empty_ecs_metrics.fix.md new file mode 100644 index 0000000000000..9aae13a99a650 --- /dev/null +++ b/changelog.d/skip_empty_ecs_metrics.fix.md @@ -0,0 +1,3 @@ +The `aws_ecs_metrics` source now skips over empty ECS metrics payloads. It previously failed to parse such payloads. + +authors: tustvold diff --git a/src/sources/aws_ecs_metrics/parser.rs b/src/sources/aws_ecs_metrics/parser.rs index f4a066d0b712e..e37decf894bd6 100644 --- a/src/sources/aws_ecs_metrics/parser.rs +++ b/src/sources/aws_ecs_metrics/parser.rs @@ -507,14 +507,27 @@ fn network_metrics( .collect() } +#[derive(Deserialize)] +#[serde(untagged, deny_unknown_fields)] +enum StatsPayload { + Container(ContainerStats), + Empty {}, + Null, +} + pub(super) fn parse( bytes: &[u8], namespace: Option, ) -> Result, serde_json::Error> { let mut metrics = Vec::new(); - let parsed = serde_json::from_slice::>(bytes)?; + let parsed = serde_json::from_slice::>(bytes)?; + + for (id, payload) in parsed { + let container = match payload { + StatsPayload::Container(container) => container, + _ => continue, + }; - for (id, container) in parsed { let mut tags = MetricTags::default(); tags.replace("container_id".into(), id); if let Some(name) = container.name { @@ -608,7 +621,9 @@ mod test { "io_time_recursive": [], "sectors_recursive": [] } - } + }, + "123456789": {}, + "123456789": null }"#; assert_event_data_eq!( @@ -672,7 +687,9 @@ mod test { "throttled_time": 0 } } - } + }, + "2344": {}, + "test": null }"#; assert_event_data_eq!(