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

时间:2019-05-02 20:34:44

标签: json newline jq

考虑一个JSON对象,如

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

jq使用某些数据源构成。实际的键名及其数量可能有所不同,但结果始终是一个以数字(整数或浮点数)作为值的对象。键可能包含引号,但不能包含空格。

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

所需的结果看起来像

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

即空格之间用换行符分隔(没有\r),除了标签值外没有引号。

我不能使用bash进行后处理,因此,如果可能的话,我希望使用纯jq解决方案。

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

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

       public Response Hello(Request request)
       {
         IronPdf.Installation.TempFolderPath = @"/tmp";

         IronPdf.HtmlToPdf Renderer = new IronPdf.HtmlToPdf();
         var PDF = Renderer.RenderHtmlAsPdf("<h1>Hello from DocThread</h1>");
         PDF.SaveAs("/tmp/sample.pdf");

         return new Response("Go Serverless v1.0! Your function executed successfully!", request);
       }