简而言之,我正在编写一个程序来远程收集一些 kubelets 指标。
但这些指标不包含有关 node_name 的信息,因此在 prometheus 废弃时它会重复
所以我想解析它们的指标,为它们添加节点名称标签,然后将它们重新解析为 prometheus 指标,这样我就可以作为端点托管,让 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 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)
}
}
使用这样的简单指标:
# 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
结果:
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 >
我只是想把名字,标签,值和时间戳取出来,但是我不能把它取出来处理,不像python
from prometheus_client.parser import text_string_to_metric_families
import requests
metrics = """
# 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
"""
for family in text_string_to_metric_families(metrics):
for sample in family.samples:
print("{0}\n{1}\n{2}\n{4}".format(*sample))
Python 结果:
net_conntrack_dialer_conn_attempted_total
{'dialer_name': 'federate', 'instance': 'localhost:9090', 'job': 'prometheus'}
1.0
1608520832.877
那么回到主要问题:我怎样才能取出那些特定的值并修改它?