Prometheus Collector 失败,并显示“之前收集的指标具有相同的名称和标签值”

2023-12-19

我有一个设备将温度测量结果公开为 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
[..]
  • 据我了解,metric and label组合必须是唯一的,但由于我还添加了时间戳,这不算是唯一的指标吗?我的上述期望是否可能实现?

  • 如何在 Prometheus 导出器中表示这些测量值?


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

我认为首选方法是制作一个量规向量。使用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)
  }
}

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Prometheus Collector 失败,并显示“之前收集的指标具有相同的名称和标签值” 的相关文章

  • 将具有联合字段的 C 结构映射到 Go 结构

    我从 Go 中的某些 WinApi 的系统调用中获取结果 我可以轻松地从 C 代码映射简单的结构 但是如何处理如下所示的 C 结构 typedef struct SPC LINK DWORD dwLinkChoice define SPC
  • mysql 查询中的 golang 切片,带有 where in 子句

    我正在运行以下查询 但只获取第一个 id 值 select from table where table id in 1 2 3 4 5 6 7 9 11 13 14 15 17 and table deleted at is null 我
  • foo.Name undefined(类型接口{}没有字段或方法名称)

    我使用本机 golang 包 container list 来管理堆栈中的 inotify 事件 当我访问堆栈的项目时 我的类型失败 我认为 import golang org x exp inotify container list lo
  • 在 Go 中修改导入的库

    我的问题 弹性节拍 https www elastic co products beats是一个用 Go 编写的日志传送程序的开源项目 它具有多种日志输出功能 包括控制台 Elasticsearch 和 Redis 我想将我自己的输出添加到
  • Cgo 生成的源无法在 MVC 上编译

    我有一个用 CGo 制作的共享库 它在 Linux 和 Android 上链接得很好 但是 当使用 Microsoft Visual Studio 2017 在 Windows 10 上进行编译时 出现以下错误 Microsoft R Pr
  • 如何使用 mongo-go-driver 有效地将 bson 转换为 json?

    我想将 bson 转换为mongo go 驱动程序 https github com mongodb mongo go driver有效地转换为 json 我应该小心处理NaN 因为json Marshal失败如果NaN存在于数据中 例如
  • ReverseProxy取决于golang中的request.Body

    我想构建一个 http 反向代理 它检查 HTTP 主体 然后将 HTTP 请求发送到它的上游服务器 你怎么能在 Go 中做到这一点 初始尝试 如下 失败 因为 ReverseProxy 复制传入请求 修改它并发送 但正文已被读取 func
  • Golang标志:忽略丢失的标志并解析多个重复的标志

    我是 Golang 新手 一直无法使用 flag 找到这个问题的解决方案 如何使用 flag 以便我的程序可以处理此类调用 其中 term 标志可能出现可变次数 包括 0 次 myprogram f flag1 myprogram f fl
  • 初始化嵌套匿名结构

    我有一个 json 作为 fields time id status customerId additionalDetail pageInfo start 0 rows 1000 我想将我的结构编组到上面的 json 并创建如下结构 typ
  • 检查值是否实现接口的说明

    我读过 Effective Go 和其他类似这样的问答 golang接口合规性编译类型检查 https stackoverflow com questions 17994519 golang interface compliance com
  • 构建链代码时 ltdl.h 未找到错误

    我正在尝试使用构建链码go build 当我运行 Go build 命令时它的报告 hyperledger fabric vendor github com miekg pkcs11 pkcs11 g o 29 18 fatal error
  • Go io.Pipe 的缓冲版本

    有缓冲版本吗io Pipe https golang org pkg io Pipe 在标准库或第三方库中 在我推出自己的库之前 上下文 我正在尝试使用这个解决方案 https stackoverflow com a 36229262 15
  • 如何解析 Content-Disposition 标头以检索文件名属性?

    使用 go 如何解析从 http HEAD 请求检索到的 Content Disposition 标头以获取文件的文件名 此外 如何从 http HEAD 响应中检索标头本身 这样的事情正确吗 resp err http Head http
  • for 循环初始值设定项中的结构

    知道为什么 for 循环初始值设定项中的这个结构表达式在编译时会出现语法错误吗 在这种情况下 指向结构的指针工作正常 但 ofc 我需要如下所示的局部变量 感谢您的建议 type Request struct id int line byt
  • 如何在 Go 中解组具有多个项目的简单 xml?

    我想从以下 xml 中获取人物 People 的一部分
  • 如何在运行“go test”时排除或跳过特定目录[重复]

    这个问题在这里已经有答案了 go test go list grep v vendor coverprofile testCoverage txt 我正在使用上述命令来测试文件 但有 1 个名为 Store 的文件夹我想从测试中排除 怎样才
  • GOPATH值设置

    我用go1 3 1 windows amd64 msi安装go 安装后GOROOT是默认设置 我发现 D Programs Go bin 在 PATH 中 然后我创建一个 GOPATH 环境变量 使用 go get 命令时 出现错误 软件包
  • 使用 HTTPS GRC 从 AWS Codecommit 获取私有存储库

    我正在尝试导入位于 AWS codecommit 中的模块 为了克隆存储库 我使用 HTTPS GRC Git 远程代码提交 方法 该方法使用 Google Suite 凭证来访问 AWS 控制台 我用来克隆存储库的命令是 git clon
  • 打印到 stdout 会导致阻塞的 goroutine 运行吗?

    作为一个愚蠢的基本线程练习 我一直在尝试实现理发师睡觉的问题 http en wikipedia org wiki Sleeping barber problem在戈兰 对于通道来说 这应该很容易 但我遇到了一个 heisenbug 也就是
  • 在 Go 中初始化嵌入结构

    我有以下内容struct其中包含一个net http Request type MyRequest struct http Request PathParams map string string 现在我想初始化匿名内部结构http Req

随机推荐

  • 默认成员值最佳实践

    编写 C 11 代码时在类的头文件中为类成员设置默认值是一个好习惯吗 或者在类的构造函数中执行此操作更好 EDIT I mean foo h include
  • Django 联合查询

    我需要在 Django 中使用 3 个模型 即 WebQuery WebReply 和 BusinessOwners 开发 UNION 查询 输出应采用以下形式 conversation id b id from user id email
  • 如何在python 3.7中安装pyramid-arima

    我正在尝试在 Windows10 上的 python 3 7 中实现 auto arima 所以我尝试使用以下命令安装 Pyramid armia pip install pyramid arima 但我收到错误消息 Could not f
  • 类型错误:输入最多需要 1 个参数,但得到 3 个

    我正在用 Python 制作一个小型猜谜游戏 计算机猜测玩家选择的数字 当我尝试要求用户输入时出现错误 answer input Is it guess 这条线抛出 类型错误 输入最多需要 1 个参数 但得到 3 个 我究竟做错了什么 in
  • 根据所选的第一个下拉列表获取下拉列表的值

    PHP MYSQL div style width 100 margin inherit padding left 100px div
  • 空手道中具有未定义变量的三元条件逻辑

    我有一个空手道功能文件 我们称之为一个特征 旨在由其他功能文件重用 通过使用共享范围 一个特征可以使用调用功能文件中定义的一些变量 例如国家 地区 我希望这些参数是可选的 但具有在中定义的默认值一个特征 为此 我使用三元条件逻辑 例如 de
  • Logback.xml配置

    我正在尝试将黑啤酒配置为保存到文件中 但是 它没有保存到文件中 您知道为什么吗 另外 我希望日志文件名可以在 logback xml 中配置 像 LOG FILE NAME 这样的东西将来自 cmd 这可能吗 这是我的 logback xm
  • 在 Git 中使用 trile

    我想使用一个简单的 git pull 来限制trickle http monkey org marius trickle trickle 1 txt 这看起来应该很容易 trickle d 100 git pull 但是当 git 显示其带
  • 有没有办法使用带有默认字段和 __slots__ 的数据类

    我想把 slots 在具有默认字段的数据类上 当我尝试这样做时 我收到此错误 gt gt gt dataclass class C slots x y x int y int 1 Traceback most recent call las
  • 将对象数组转换为新数组及其子数组

    我有一个像这样的数组 var data name Movies info category name content name Interstellar info category data name Dark Knight info ca
  • 有没有办法让 SQL 变量保持常量?

    有没有办法让 SQL 变量保持常量 不 但您可以创建一个函数并将其硬编码在其中并使用它 这是一个例子 CREATE FUNCTION fnConstant RETURNS INT AS BEGIN RETURN 2 END GO SELEC
  • 如何正确进行 sbt 程序集合并?

    在我们的 Scala Scalatra 项目中 我们有这个插件合并策略sbt assembly assemblyMergeStrategy in assembly case x gt val oldStrategy assemblyMerg
  • 无法打开“../tweets.php”进行包含(include_path='.:')

    我正在尝试使用以下代码包含一个脚本 div class main content div 但它不断抛出以下错误 警告 包含 tweets php 无法打开流 没有这样的文件或 目录 第 52 行警告 include 打开失败 tweets
  • 通过部署 Xamarin.iOS-App 缺少资产目录

    我正在 VS 中为连接到 MacinCloud 的 Windows 开发一个适用于 iOS 的 Xamarin App 当我在 MacinCloud 的应用程序加载器中将我的应用程序部署为 ipa 文件时 没有任何错误 但每次我收到苹果发来
  • 如何使用 Eclipse 调试 servlet

    拥有一个 servlet 它可以在 TomCat 中运行 但是 我不知道如何在 Eclipse Java 标准版 中调试它 有什么建议么 首先确保您正在使用 Eclipse IDE 用于企业Java 开发人员 https www eclip
  • C++ 套接字:PC 之间通过互联网进行通信

    我正在Windows 上使用winsocks 编写一个程序 可以将消息发送到另一台计算机 客户端与另一台计算机中的服务器连接并开始交换数据 它在使用本地地址 192 168 1 的本地网络上工作正常 但我无法与公共地址 216 185 45
  • 隐藏状态栏 Swift 4

    我试图隐藏我的 UIViewControllers Swift 4 之一中的状态栏 首先 我设置查看基于控制器的状态栏外观 to YES in Info plist 我重写了prefersStatusBarHidden我的控制器中的属性 o
  • BufferedOutputStream 与 ByteArrayOutputStream

    将 BufferedOutputStream 包装在 ByteArrayOutputStream 周围而不是仅使用 ByteArrayOutputStream 本身有什么优势吗 一般来说 BufferedOutputStream 包装器主要
  • 从 Joomla 中删除 hasTip javascript 代码

    Joomla 2 5 添加了以下代码 window addEvent domready function hasTip each function el var title el get title if title var parts t
  • Prometheus Collector 失败,并显示“之前收集的指标具有相同的名称和标签值”

    我有一个设备将温度测量结果公开为 JSON 格式如下 dataPointId 123456 values t 1589236277000 v 14 999993896484398 t 1589236877000 v 14 700006103