使用 jq 解析 jolokia 输出
Parse jolokia output with jq
我有一个 Apache Artemis 代理,我可以通过 jolokia 获得它的一些管理信息。此响应采用 json 格式;我还有 jq 可以用它做 "json stuff"。
curl -s -X GET --url 'http://localhost:8161/console/jolokia/read/org.apache.activemq.artemis:*'
这行得通;并提供 json 响应。
我想制作一种通用脚本来检查此响应中的某些值;因此有几个问题:
(为了便于测试,我将响应存储在文件 broker.json 中,通常我只是将 curl 的输出通过管道传输到 jq 或将其存储在变量中,具体取决于必须调用 jq 的频率)
我要查询的其中一个key我可以这样得到:
jq '."value"."org.apache.activemq.artemis:broker=\"broker1\""' broker.json
但是,在更通用的脚本中,我不知道代理的名称(这里是 "broker1");有什么办法可以像这样通配密钥: "org.apache.activemq.artemis:broker=\"*\""
吗?到目前为止,我的尝试没有给我任何帮助
第二题我觉得有点难。
在响应中有一个字段可以通过查询找到。request.timestamp
该值是自纪元以来的秒数。
broker上有队列,其中一些可能有消息;我想找到那些消息早于 5 分钟的消息。
我可以用这个键找到一个这样的对象:
jq '."value"."org.apache.activemq.artemis:address=\"my.queue\",broker=\"broker1\",component=addresses,queue=\"my.queue\",routing-type=\"anycast\",subcomponent=queues"' broker.json
此对象包含两个可用于此目的的键:
- FirstMessageAge:以毫秒为单位的年龄
- FirstMessageTimestamp:自纪元以来以毫秒为单位的时间戳。
我该如何查询?理想情况下,我想得到答案 "my.queue has messages older than X";其中 my.queue 也可以通过密钥 "Address" 或 "Name"
获得
Artemis 使用地址和队列作为单独的实体;出于所有实际目的,两者具有相同的名称。
我正在尝试制作一个(简单的)脚本,该脚本可以定期监控代理的健康状况(队列上的消息不会太多太久,队列有消费者,诸如此类;所有这些都可以从一次休息中获得call;我想有了上面问题的答案我应该能弄清楚如何得到这个。
is there some way I can wildcard the key like this:
"org.apache.activemq.artemis:broker=\"*\""
在键名上匹配通配符的最佳方法是使用 with_entries
或 to_entries
。由于您没有根据 MCVE 指南提供示例,因此不清楚您将如何这样做,但通过类比您给出的示例,您可以从以下内容开始:
.value
| to_entries[]
| select(.key | test("^org.apache.activemq.artemis:broker=\".*\""))
| .value
我有一个 Apache Artemis 代理,我可以通过 jolokia 获得它的一些管理信息。此响应采用 json 格式;我还有 jq 可以用它做 "json stuff"。
curl -s -X GET --url 'http://localhost:8161/console/jolokia/read/org.apache.activemq.artemis:*'
这行得通;并提供 json 响应。
我想制作一种通用脚本来检查此响应中的某些值;因此有几个问题:
(为了便于测试,我将响应存储在文件 broker.json 中,通常我只是将 curl 的输出通过管道传输到 jq 或将其存储在变量中,具体取决于必须调用 jq 的频率)
我要查询的其中一个key我可以这样得到:
jq '."value"."org.apache.activemq.artemis:broker=\"broker1\""' broker.json
但是,在更通用的脚本中,我不知道代理的名称(这里是 "broker1");有什么办法可以像这样通配密钥: "org.apache.activemq.artemis:broker=\"*\""
吗?到目前为止,我的尝试没有给我任何帮助
第二题我觉得有点难。 在响应中有一个字段可以通过查询找到。request.timestamp 该值是自纪元以来的秒数。
broker上有队列,其中一些可能有消息;我想找到那些消息早于 5 分钟的消息。
我可以用这个键找到一个这样的对象:
jq '."value"."org.apache.activemq.artemis:address=\"my.queue\",broker=\"broker1\",component=addresses,queue=\"my.queue\",routing-type=\"anycast\",subcomponent=queues"' broker.json
此对象包含两个可用于此目的的键: - FirstMessageAge:以毫秒为单位的年龄 - FirstMessageTimestamp:自纪元以来以毫秒为单位的时间戳。
我该如何查询?理想情况下,我想得到答案 "my.queue has messages older than X";其中 my.queue 也可以通过密钥 "Address" 或 "Name"
获得Artemis 使用地址和队列作为单独的实体;出于所有实际目的,两者具有相同的名称。
我正在尝试制作一个(简单的)脚本,该脚本可以定期监控代理的健康状况(队列上的消息不会太多太久,队列有消费者,诸如此类;所有这些都可以从一次休息中获得call;我想有了上面问题的答案我应该能弄清楚如何得到这个。
is there some way I can wildcard the key like this:
"org.apache.activemq.artemis:broker=\"*\""
在键名上匹配通配符的最佳方法是使用 with_entries
或 to_entries
。由于您没有根据 MCVE 指南提供示例,因此不清楚您将如何这样做,但通过类比您给出的示例,您可以从以下内容开始:
.value
| to_entries[]
| select(.key | test("^org.apache.activemq.artemis:broker=\".*\""))
| .value