Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 将普罗米修斯刮取的数据转换为数组_Go_Prometheus - Fatal编程技术网

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

我从普罗米修斯那里搜集了数据,回复如下。我想使用Go将维度数据放入数组(用于操作)。谁能帮帮我吗。谢谢:)

答复如下:

# 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)
            }
        }
    }
}