使用 jq 将 JSON 对象转换为 Prometheus 指标格式

convert JSON object to Prometheus metrics format using jq

考虑一个 JSON 对象,例如

{
  "foo": 42,
  "baz": -12,
  "bar{label1=\"value1\"}": 12.34
}

jq 使用一些数据源构建。实际的键名及其数量可能会有所不同,但结果将始终是一个以数字(int 或 float)作为值的对象。键可以包含引号,但不能有白色spaces.

我可以使用 jq 将对象格式化为 Prometheus 兼容的格式,这样我就可以使用输出将数据推送到 Prometheus Pushgateway 吗?

所需的结果看起来像

foo 42
bar{label1="value1"} 12.34
baz -12

即space-用换行符分隔(没有 \r),除了标签值外没有引号。

我不能使用 bash 进行 post 处理,因此如果可能的话我更喜欢纯 jq 解决方案。

使用keys_unsorted获取对象键(keys也一样,但前者更快),通过字符串插值的方式生成所需的输出。

$ jq -r 'keys_unsorted[] as $k | "\($k) \(.[$k])"' file
foo 42
baz -12
bar{label1="value1"} 12.34

并且,通过添加 -j 选项并按照@peak 的建议手动打印换行符,您可以使它具有可移植性。

在Windows平台上,jq通常使用CR-LF换行;为防止这种情况,请使用 -j 命令行选项并手动插入所需的 'newline' 字符,如下所示:

jq -rj 'to_entries[] | "\(.key) \(.value)\n"' file