kubernetes popeye 向带有 JQ 的 cvs 报告 JSON

kubernetes popeye report JSON to cvs with JQ

我需要在电子表格中重新格式化 Popeye Kubernetes 报告。 我用了jq但是有点棘手

{
  "popeye": {
    "score": 90,
    "grade": "A",
    "sanitizers": [
      {
        "sanitizer": "cluster",
        "tally": {
          "ok": 1,
          "info": 0,
          "warning": 0,
          "error": 0,
          "score": 100
        },
        "issues": {
          "Version": [
            {
              "group": "__root__",
              "level": 0,
              "message": "[POP-406] K8s version OK"
            }
          ]
        }
      }
    ]
  }
}

导出到 csv 的最佳格式如下:

{
  "sanitizer" : "cluster",
  "kube-object" : "Version",
  "group": "__root__",
  "level": 0,
  "message": "[POP-406] K8s version OK"
}

我尝试了很多 jq 命令都没有成功。

有什么想法吗?

谢谢。

您要求导出 CSV,但显示的是 object 所需的格式。所以,我将 object 的字段解释为 CSV 列:

["sanitizer", "kube-object", "group", "level", "message"],
(.popeye.sanitizers[] | [.sanitizer] + (
  .issues | to_entries[] | [.key, (.value[] | .group, .level, .message)])
)
| @csv
"sanitizer","kube-object","group","level","message"
"cluster","Version","__root__",0,"[POP-406] K8s version OK"

Demo

使用 jq--raw-output-r 参数获取正确的 CSV 格式。另外,如果不需要 headers.

,请删除第一行

一个选项是使用 map()+ 运算符来生成 JSON 问题中呈现的格式,例如

jq - r '.[].sanitizers | map({sanitizer}+{"kube-object" : "Version"}+.issues.Version[])[]'

哪里

{"kube-object" : "Version"}

已添加为源 JSON

的不存在的键值对

Demo

如果您的目标是逐行生成以逗号分隔的键值对,请考虑使用

jq -r '.[].sanitizers | map({sanitizer}+{"kube-object" : "Version"}+.issues.Version[])[] | to_entries[] | "\(.key), \(.value)"'

Demo