在 CMD 中将 Instana EUM JSON 与 JQ 合并

问题描述 投票:0回答:1

我使用 Instana 在我的网站上提供查看统计信息,每个每日文件如下所示:

{
  "items" : [ {
    "name" : "page1.htm",
    "earliestTimestamp" : 1675222177839,
    "cursor" : {
      "@class" : ".IngestionOffsetCursor",
      "ingestionTime" : 1675292168217,
      "offset" : 1
    },
    "metrics" : {
      "uniqueSessions.distinct_count" : [ [ 1675292400000, 4.0 ] ]
    }
  }, {
    "name" : "page2.htm",
    "earliestTimestamp" : 1675260035165,
    "cursor" : {
      "@class" : ".IngestionOffsetCursor",
      "ingestionTime" : 1675292168217,
      "offset" : 2
    },
    "metrics" : {
      "uniqueSessions.distinct_count" : [ [ 1675292400000, 1.0 ] ]
    }
  }, {
    "name" : "page3.htm",
    "earliestTimestamp" : 1675228447118,
    "cursor" : {
      "@class" : ".IngestionOffsetCursor",
      "ingestionTime" : 1675292168217,
      "offset" : 3
    },
    "metrics" : {
      "uniqueSessions.distinct_count" : [ [ 1675292400000, 7.0 ] ]
    }
  } ],
  "canLoadMore" : false,
  "totalHits" : 12,
  "totalRepresentedItemCount" : 12,
  "totalRetainedItemCount" : 12,
  "adjustedTimeframe" : {
    "windowSize" : 86400000,
    "to" : 1675292400000
  }
}

这些日常文件应在过滤必要信息后合并为一个 json:

  • 网址(来自名称)

  • 日期(“uniqueSessions.distinct_count”中的第一个值)

  • 页面访问次数:(“uniqueSessions.distinct_count”中的第二个值)
    重要的是,它必须在 CMD 中完成,因为我必须使用批处理文件,因为目标用户不允许运行 PowerShell 脚本,也无法访问任何其他 CL 工具。

到目前为止,我设法使用以下方法将文件归结为所需的数据元素作为单独的 JSON 对象:

type *.json | jq ".items[] | {url: .name, date: .metrics[][0][0], load: .metrics[][0][1]}"

结果如下:

{
  "url": "page1.htm",
  "date": 1675292400000,
  "load": 4
}
{
  "url": "page1.htm",
  "date": 1675292400000,
  "load": 1
}
{
  "url": "page1.htm",
  "date": 1675292400000,
  "load": 7
}

但是,如果我尝试将其括在方括号中(如教程所示)以获得有效的 JSON,我会得到一个文件,其中包含一堆数组,其开始和结束位置与原始文件中的位置相同。
我做了作业,并且意识到这一点:使用 jq 过滤器将多个 json 文件组合成一个 json 文件实际上,在询问之前我已经玩了一段时间了。我在想如果我可以再次添加大括号和根节点,它会有所帮助,但我还没有找到一种 JQ 不会失败的方法,该错误很可能来自 windows cmd 的引号使用。

如何将其制作成一个 JSON,而不是与源文件一样多的数组?谢谢!

json batch-file cmd jq instana
1个回答
0
投票

对于多个输入文件,您可以使用

--slurp
(或
-s
选项)围绕所有输入文件创建另一个数组,然后在其上使用
map

jq -s 'map(.items[] | {…})' *.json

演示

或者使用

inputs
(与
--null-input
(或
-n
)标志组合)以编程方式迭代每个输入:

jq -n 'reduce inputs as {$items} ([]; . + [$items[] | {…}])' *.json

演示

© www.soinside.com 2019 - 2024. All rights reserved.