Go 如何解析普罗米修斯数据

Go 如何解析普罗米修斯数据,go,prometheus,amazon-cloudwatch,ebnf,Go,Prometheus,Amazon Cloudwatch,Ebnf,我已经能够通过发送HTTP GET获得metrices,如下所示: # TYPE net_conntrack_dialer_conn_attempted_total untyped net_conntrack_dialer_conn_attempted_total{dialer_name="federate",instance="localhost:9090",job="prometheus"} 1 1608520832877 现在我

我已经能够通过发送HTTP GET获得metrices,如下所示:

# 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一样转换tand格式

我一直在研究Go中的ebnf包:


有人能告诉我解析上述数据的正确方向吗?

普罗米修斯的作者已经有了一个很好的软件包

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

参考:doc。有一个名为
expfmt
的包,可以对普罗米修斯的展览格式进行解码和编码。是的,它遵循EBNF语法,因此也可以使用
EBNF
包,但您可以直接获得
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 >

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

已经有了一个很好的软件包,它是由普罗米修斯的作者自己编写的

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

参考:doc。有一个名为
expfmt
的包,可以对普罗米修斯的展览格式进行解码和编码。是的,它遵循EBNF语法,因此也可以使用
EBNF
包,但您可以直接获得
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 >

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

您一定做错了什么。通过构建来运行此程序(
go build
)。假设可执行文件的名称是
promfmt
,然后运行
/promfmt--f/path/to/file
,其中
/path/to/file
是路径(绝对或相对;两者都有效!),在文件末尾添加一个换行字符。实际上,度量后面有一个换行符。您发布的文件有一些格式错误。尝试使用我用作输入的文件。我已更新了答案。那应该有帮助!脚本不应该忽略以#开头的行吗?一旦我删除了以#开头的所有行,并使用答案中更新的代码,错误就变为“预期整数作为时间戳,得到”1608520832877\r“您一定做错了什么。通过构建它来运行此程序(
go build
)。假设可执行文件的名称为
promfmt
,然后运行
/promfmt--f/path/to/file
,其中
/path/to/file
是路径(绝对或相对;两者都可以!)在文件末尾添加一个换行符。实际上,度量后面有一个换行符。您发布的文件有一些格式错误。尝试使用我用作输入的文件。我已经更新了答案。这应该会有帮助!脚本不应该忽略以#开头的行吗?一旦我删除了所有以#开头的行,然后使用更新的代码e从回答中,错误更改为“预期整数作为时间戳,得到”1608520832877\r”