为了账号安全,请及时绑定邮箱和手机立即绑定

如何解析普罗米修斯数据

如何解析普罗米修斯数据

Go
哔哔one 2022-08-01 10:08:32
我已经能够通过发送HTTP GET来获取指标,如下所示:# TYPE net_conntrack_dialer_conn_attempted_total untyped net_conntrack_dialer_conn_attempted_total{dialer_name="federate",instance="localhost:9090",job="prometheus"} 1 1608520832877现在我需要解析这些数据并控制每条数据,以便我可以转换像json这样的串联格式。我一直在研究Go中的ebnf包:ebnf包有人能给我指出正确的方向来解析上述数据吗?
查看完整描述

1 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

已经有一个很好的软件包可以做到这一点,它是由普罗米修斯的作者自己完成的。


他们编写了一堆Go库,这些库在Prometheus组件和库之间共享。它们被认为是普罗米修斯的内部,但你可以使用它们。


请参阅:github.com/prometheus/common 文档。有一个名为“普罗米修斯”的软件包可以解码和编码普罗米修斯的Exposition Format(Link)。是的,它遵循EBNF语法,因此也可以使用包,但是您开箱即用。expfmtebnfexpfmt


使用的软件包:expfmt


示例输入:


# HELP net_conntrack_dialer_conn_attempted_total

# TYPE net_conntrack_dialer_conn_attempted_total untyped

net_conntrack_dialer_conn_attempted_total{dialer_name="federate",instance="localhost:9090",job="prometheus"} 1 1608520832877

示例程序:


package main


import (

    "flag"

    "fmt"

    "log"

    "os"


    dto "github.com/prometheus/client_model/go"

    "github.com/prometheus/common/expfmt"

)


func fatal(err error) {

    if err != nil {

        log.Fatalln(err)

    }

}


func parseMF(path string) (map[string]*dto.MetricFamily, error) {

    reader, err := os.Open(path)

    if err != nil {

        return nil, err

    }


    var parser expfmt.TextParser

    mf, err := parser.TextToMetricFamilies(reader)

    if err != nil {

        return nil, err

    }

    return mf, nil

}


func main() {

    f := flag.String("f", "", "set filepath")

    flag.Parse()


    mf, err := parseMF(*f)

    fatal(err)


    for k, v := range mf {

        fmt.Println("KEY: ", k)

        fmt.Println("VAL: ", v)

    }

}

示例输出:


KEY:  net_conntrack_dialer_conn_attempted_total

VAL:  name:"net_conntrack_dialer_conn_attempted_total" type:UNTYPED metric:<label:<name:"dialer_name" value:"federate" > label:<name:"instance" value:"localhost:9090" > label:<name:"job" value:"prometheus" > untyped:<value:1 > timestamp_ms:1608520832877 >

因此,对于您的用例来说,这是一个不错的选择。expfmt


更新:OP发布的输入中的格式问题:


指:


https://github.com/prometheus/pushgateway/issues/147#issuecomment-368215305


https://github.com/prometheus/pushgateway#command-line


Note that in the text protocol, each line has to end with a line-feed

character (aka 'LF' or '\n'). Ending a line in other ways, e.g. with 

'CR' aka '\r', 'CRLF' aka '\r\n', or just the end of the packet, will

result in a protocol error.

但是从错误消息中,我可以看到char存在于put中,这在设计上是不可接受的。因此,用于行尾。\r\n


查看完整回答
反对 回复 2022-08-01
  • 1 回答
  • 0 关注
  • 188 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信