gpt4 book ai didi

go - 普罗米修斯收集器失败并显示 "collected metric was collected before with the same name and label values"

转载 作者:行者123 更新时间:2023-12-01 19:47:04 24 4
gpt4 key购买 nike

我有一个设备以以下格式将温度测量结果作为 JSON 公开:

[
{
"dataPointId": 123456,
"values": [
{
"t": 1589236277000,
"v": 14.999993896484398
},
{
"t": 1589236877000,
"v": 14.700006103515648
},
{
"t": 1589237477000,
"v": 14.999993896484398
},
[..]

如您所见,这些值包含时间戳和温度测量值。我想通过 Prometheus 指标公开这些测量值,因此我使用 prometheus/client_golang 来构建导出器。

我的期望是 /metrics 端点然后从上面的数据中公开这样的东西:
# HELP my_temperature_celsius Temperature
# TYPE my_temperature_celsius gauge
my_temperature_celsius{id="123456"} 14.999993896484398 1589236277000
my_temperature_celsius{id="123456"} 14.700006103515648 1589236877000
my_temperature_celsius{id="123456"} 14.999993896484398 1589237477000

我实现了一个简单的 prometheus.Collector 并且我正在添加我的静态指标,没有任何问题。对于上面的测量, NewMetricWithTimestamp 似乎是添加带有时间戳的指标的唯一方法,因此我使用以下内容迭代这些值:
for _, measurements := range dp.Values {
ch <- prometheus.NewMetricWithTimestamp(
time.Unix(measurements.T, 0),
prometheus.MustNewConstMetric(
collector.temperature,
prometheus.GaugeValue,
float64(measurements.V),
device.DatapointID))
}

但是,这会导致我不完全理解的以下错误:
An error has occurred while serving metrics:

1135 error(s) occurred:
* collected metric "my_temperature_celsius" { label:<name:"id" value:"123456" > gauge:<value:14.999993896484398 > timestamp_ms:1589236877000000 } was collected before with the same name and label values
* collected metric "my_temperature_celsius" { label:<name:"id" value:"123456" > gauge:<value:14.700006103515648 > timestamp_ms:1589237477000000 } was collected before with the same name and label values
[..]
  • 我知道指标和标签组合必须是唯一的,但由于我还添加了时间戳,这不算是唯一指标吗?我上面的期望甚至可能吗?
  • 如何在 Prometheus 导出器中表示这些测量值?
  • 最佳答案

    如果仔细观察,您会发现 JSON 数据格式在指标收集的上下文中略显多余,因为时间戳位于每个设备内部,而不是作为父键,并且具有作为设备 ID 和值数组的值。只有这样你才能循环实时序列数据,然后你的标签不会像现在一样在循环中是静态的。标签唯一性是标签名称 + 标签值散列在一起。

    我认为最好的方法是制作一个 Gauge Vector。使用 WithLabelValues获得 Gauge对象并调用 Set在它上面设置值

    deviceTempGaugeVector := prometheus.NewGaugeVec(
    prometheus.GaugeOpts{
    Name: "my_temperature_celsius",
    },
    []string{
    "device_id" // Using single label instead of 2 labels "id" and "value"
    },
    )

    prometheus.MustRegister(deviceTempGaugeVector)

    for _, point := range dp.TimeStamps {
    for _, measurements := range point {
    deviceId := measurements.DatapointID
    value := measurements.V
    metric := deviceTempGaugeVector.WithLabelValues(deviceId).Set(value)
    ch <- prometheus.NewMetricWithTimestamp(time.Unix(measurements.T, 0),metric)
    }
    }

    引用: https://godoc.org/github.com/prometheus/client_golang/prometheus#NewGaugeVec

    关于go - 普罗米修斯收集器失败并显示 "collected metric was collected before with the same name and label values",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61900346/

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