gpt4 book ai didi

go - 如何解析Prometheus数据

转载 作者:行者123 更新时间:2023-12-03 10:10:10 28 4
gpt4 key购买 nike

我已经能够通过发送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等tand格式。
我一直在研究Go中的ebnf软件包:
ebnf package
有人可以指出正确的方向来解析上述数据吗?

最佳答案

已经有一个不错的软件包可以由Prometheus的Authors自己来完成。
他们编写了许多在Prometheus组件和库之间共享的Go库。它们被认为是Prometheus内部的,但是您可以使用它们。
请参阅:github.com/prometheus/common文档。有一个名为expfmt的软件包,可以对普罗米修斯的展览格式(Link)进行解码和编码。是的,它遵循EBNF语法,因此也可以使用ebnf包,但是您可以立即使用expfmt
使用的软件包: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.
    但是从错误消息中,我可以看到put中存在 \r char,这在设计上是 Not Acceptable 。因此,使用 \n作为行尾。

    关于go - 如何解析Prometheus数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65388098/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com