如何用PowerShell将Azure API的JSON监控数据正确转换为CSV
解决Azure监控JSON转CSV的行映射问题
问题根源
你的脚本未遍历JSON中每个时间点的指标数据,直接将timestamps、averages这类数组字段写入CSV,导致所有值被合并到同一行。Azure监控API返回的JSON里,每个指标的时间序列数据嵌套在metrics.timeseries.data数组中,每个数组元素对应一个时间点的完整指标值。
正确转换步骤
1. 核心JSON结构参考
假设你的监控数据JSON核心结构如下:
{ "metrics": [ { "name": { "value": "UsedCapacity" }, "timeseries": [ { "data": [ { "timeStamp": "2024-05-01T00:00:00Z", "average": 1024, "maximum": 1200 }, { "timeStamp": "2024-05-01T01:00:00Z", "average": 1100, "maximum": 1300 } ] } ] }, { "name": { "value": "Percentage CPU" }, "timeseries": [ { "data": [ { "timeStamp": "2024-05-01T00:00:00Z", "average": 25, "maximum": 40 } ] } ] } ] }
2. PowerShell转换脚本
# 读取JSON文件(若直接从API获取,可替换为Invoke-RestMethod的响应结果) $jsonData = Get-Content -Path "your-monitor-data.json" -Raw | ConvertFrom-Json # 初始化结果集合 $csvRows = @() # 遍历所有指标 foreach ($metric in $jsonData.metrics) { $metricType = $metric.name.value # 遍历时间序列组 foreach ($series in $metric.timeseries) { # 遍历每个时间点的指标数据 foreach ($point in $series.data) { # 构造单行数据对象 $csvRows += [PSCustomObject]@{ MetricType = $metricType Timestamp = $point.timeStamp AverageValue = $point.average MaximumValue = $point.maximum } } } } # 导出到CSV文件 $csvRows | Export-Csv -Path "monitor-output.csv" -NoTypeInformation -Encoding UTF8
3. 脚本说明
- 逐层遍历嵌套结构:从顶级
metrics到timeseries,再到每个时间点的data元素 - 为每个时间点生成独立的行对象,明确映射指标类型、时间戳、平均值、最大值字段
- 最终导出的CSV会实现一个时间点对应一行数据的需求
预期CSV结构
导出的CSV内容格式如下:
| MetricType | Timestamp | AverageValue | MaximumValue |
|---|---|---|---|
| UsedCapacity | 2024-05-01T00:00:00Z | 1024 | 1200 |
| UsedCapacity | 2024-05-01T01:00:00Z | 1100 | 1300 |
| Percentage CPU | 2024-05-01T00:00:00Z | 25 | 40 |
内容的提问来源于stack exchange,提问作者Chauhan240
相关产品推荐
相关产品推荐

