Go 将普罗米修斯刮取的数据转换为数组
我从普罗米修斯那里搜集了数据,回复如下。我想使用Go将维度数据放入数组(用于操作)。谁能帮帮我吗。谢谢:) 答复如下:Go 将普罗米修斯刮取的数据转换为数组,go,prometheus,Go,Prometheus,我从普罗米修斯那里搜集了数据,回复如下。我想使用Go将维度数据放入数组(用于操作)。谁能帮帮我吗。谢谢:) 答复如下: # TYPE net_conntrack_dialer_conn_attempted_total untyped net_conntrack_dialer_conn_attempted_total{dialer_name="alertmanager",instance="localhost:9090",job="promethe
# TYPE net_conntrack_dialer_conn_attempted_total untyped
net_conntrack_dialer_conn_attempted_total{dialer_name="alertmanager",instance="localhost:9090",job="prometheus"} 0 1609568651186
# TYPE net_conntrack_dialer_conn_closed_total untyped
net_conntrack_dialer_conn_closed_total{dialer_name="alertmanager",instance="localhost:9090",job="prometheus"} 0 1609568651186
# TYPE net_conntrack_dialer_conn_established_total untyped
net_conntrack_dialer_conn_established_total{dialer_name="alertmanager",instance="localhost:9090",job="prometheus"} 0 1609568651186
# TYPE net_conntrack_dialer_conn_failed_total untyped
net_conntrack_dialer_conn_failed_total{dialer_name="alertmanager",instance="localhost:9090",job="prometheus",reason="refused"} 0 1609568651186
"prometheus",reason="timeout"} 0 1609568651186
net_conntrack_dialer_conn_failed_total{dialer_name="alertmanager",instance="localhost:9090",job="prometheus",reason="unknown"} 0 1609568651186
在得到键和值之后,我得到了这个值。我可以循环使用度量中的“名称”和“值”吗?如果可能的话,我怎么做?我试过了,但显示无法在MetricFamily中循环
OP在解释他/她真正想要什么方面不是很清楚。OP所指的输出是“普罗米修斯展览格式”。这是EBNF语法,最好用
metric\u name
,label\u name
,label\u value
,等等来表达。不要说将维度数据放入数组(用于操作)
展览形式:
metric_name [
"{" label_name "=" `"` label_value `"` { "," label_name "=" `"` label_value `"` } [ "," ] "}"
] value [ timestamp ]
我假设的是,对于每个metric\u name
,OP都希望循环labels
,即label\u name
,label\u value
我把它标记为一个副本,因为我以前回答过一个非常类似的问题,为了达到要求,只需要做一些小的修改
在下面的程序中,存在度量的源文件(以公开格式)存储在本地文件系统中。因此,有一种方法可以更改它,使它通过HTTP获取度量值,然后为每个度量值_name
循环标签
- 样本输入:
- 样本输出:
我以前也回答过类似的问题:(您可以修改代码并使其适合您的用例)。这是否回答了您的问题@shmsr。谢谢你的回复。我想自动化它,我不想每次程序运行时都构建它。有没有其他方法可以像你建议的那样直接得到这个值。我也想得到标签内的尺寸。每次都要生成吗?为什么?你只需要改变你获得展览形式的方式。我正在从一个文件中读它;在您的情况下,您必须使用HTTP获取它。尝试一下,很简单。谢谢您。这不是我想要的答案。但从这一点我得到了这个想法。多谢各位
metric_name [
"{" label_name "=" `"` label_value `"` { "," label_name "=" `"` label_value `"` } [ "," ] "}"
] value [ timestamp ]
# 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
KEY: net_conntrack_dialer_conn_attempted_total
VAL: name:"dialer_name" value:"federate"
VAL: name:"instance" value:"localhost:9090"
VAL: name:"job" value:"prometheus"
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 parseMetricFamily(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 := parseMetricFamily(*f)
fatal(err)
for k, v := range mf {
fmt.Printf("KEY: %v\n", k)
for _, m := range v.Metric {
for _, l := range m.Label {
fmt.Printf("VAL: %v\n", l)
}
}
}
}