ExAws调用CloudWatch触发sweet_xml MatchError问题求助
从CloudWatch获取EC2 CPU指标时的MatchError问题
代码实现
我用Elixir结合ExAws库编写了获取EC2实例CPUUtilization指标的代码:
defp fetch_and_save_metrics do end_time = DateTime.utc_now() start_time = DateTime.add(end_time, -5 * 60, :second) opts = [ {:statistics, ["Maximum"]}, {:dimensions, [{"InstanceId", @instance_id}]} ] case ExAws.Cloudwatch.get_metric_statistics( "AWS/EC2", "CPUUtilization", start_time, end_time, 300, opts ) |> ExAws.request() do {:ok, metric_data} -> IO.inspect(metric_data, label: "Raw CloudWatch Response", pretty: true) {:error, error} -> IO.inspect(error, label: "Raw CloudWatch Response", pretty: true) end
现象对比
- 传入未运行的InstanceId时,请求能成功返回,但响应中无指标数据:
Raw CloudWatch Response: %{ body: %{ label: "CPUUtilization", request_id: <some uuid>, metric_statistics: [] },
- 传入运行中的InstanceId时,抛出MatchError错误:
00:09:40.944 [error] GenServer #PID<0.200.0> terminating ** (MatchError) no match of right hand side value: :error (sweet_xml 0.7.5) lib/sweet_xml.ex:873: SweetXml.to_cast/3 (sweet_xml 0.7.5) lib/sweet_xml.ex:630: SweetXml.xpath/3 (sweet_xml 0.7.5) lib/sweet_xml.ex:737: anonymous fn/3 in SweetXml.xmap/3 (elixir 1.18.1) lib/map.ex:957: Map.get_and_update/3 (sweet_xml 0.7.5) lib/sweet_xml.ex:737: SweetXml.xmap/3 (sweet_xml 0.7.5) lib/sweet_xml.ex:736: SweetXml.xmap/3 (elixir 1.18.1) lib/enum.ex:1714: Enum."-map/2-lists^map/1-1-"/2 (sweet_xml 0.7.5) lib/sweet_xml.ex:732: anonymous fn/4 in SweetXml.xmap/3 Last message: :fetch_metrics State: %{}
依赖配置
项目的依赖如下:
defp deps do [ {:ex_aws, "~> 2.4"}, {:ex_aws_cloudwatch, "~> 2.0"}, {:configparser_ex, "~> 4.0"}, {:hackney, "~> 1.18"}, {:jason, "~> 1.4"}, {:sweet_xml, "~> 0.7.5"} ] end
疑问
我已经排查过:
- 移除所有响应处理逻辑后仍会报错,说明不是自己的响应处理代码问题
- 使用相同参数通过AWS CLI可以正常获取数据
由于错误栈追踪完全不涉及我的代码,想请教这是不是依赖(比如sweet_xml)的问题?有没有对应的代码修复方案?
内容的提问来源于stack exchange,提问作者7evam
相关产品推荐
相关产品推荐

