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 失败,并显示“之前收集的指标具有相同的名称和标签值” 的相关文章

  • GO中的优先级队列

    谁能向我解释一下 我想在GO中实现一个优先级队列 接口实现来自link https golang org pkg container heap example priorityQueue 但优先级最低 我的代码 pq make Priori
  • 在 Go 中解析 RFC-3339 / ISO-8601 日期时间字符串

    我尝试解析日期字符串 2014 09 12T11 45 26 371Z 在围棋中 该时间格式定义为 RFC 3339 日期时间 https datatracker ietf org doc html rfc3339 section 5 6
  • 防止使用 golang 服务器访问文件夹中的文件

    我在 golang 中有一个服务器可以处理这样的文件夹路径 fs http FileServer http Dir assets http Handle Images fs http ListenAndServe 8000 nil 但在这个
  • 限制 FormFile 中的文件大小

    我让用户使用 FormFile 上传文件 我应该在什么时候检查文件大小是否太大 当我做 file header fileErr r FormFile file 文件对象已经创建 那么我是否已经产生了读取整个文件的成本 https golan
  • Prometheus - 在 static_configs 中添加目标特定标签

    我的工作定义如下 job name test name static configs targets 192 168 1 1 9100 192 168 1 1 9101 192 168 1 1 9102 labels group devel
  • 在 Go 中读取请求负载?

    我正在使用文件上传器 需要请求负载中的详细信息来裁剪它 func Upload w http ResponseWriter r http Request reader err r MultipartReader if err nil htt
  • golang导入结构体指针

    好的 我有一个主包和一个 http 处理程序包 本质上我想做的是设置一个全局结构 这样我就可以随时调用该结构中的信息 我尝试的示例的基本概要如下 主包导入处理函数 主包调用handlerfunc Handlerfunc 将 http Res
  • 将 []string 传递给需要可变参数的函数

    为了不一遍又一遍地重复我的自我 我想创建一个处理运行一些命令的函数 func runCommand name string arg string error cmd exec Command name arg if err cmd Run
  • runtime.LockOSThread 是否允许子 goroutine 在同一个操作系统线程中运行?

    我明白在 Go 中 runtime LockOSThread https golang org pkg runtime LockOSThread将一个 goroutine 绑定到一个操作系统线程 并且不允许其他 goroutine 在该线程
  • prometheus中每个节点的CPU使用率

    理想情况下 我必须找出每个节点上 Pod 的 CPU 使用率百分比 但我试图找出每个节点的CPU使用率 我已经编写了查询 但它给了我超过 100 可以是 150 200 即使包含多个 cpu 的情况 我取了平均值 您能帮我理解下面的查询有什
  • GoLang - 坚持使用 ISO-8859-1 字符集

    我正在开发一个项目 我们需要将信息保存在具有 ISO 8859 1 表的旧数据库中 因此 在向数据库写入内容之前 我需要将其从 UTF 8 转换为 ISO 8859 1 每次从数据库检索它时 我都需要将其转换回 UTF 8 我试图使用图书馆
  • Bazel 构建缺少严格的依赖关系

    我正在尝试使用 brazel 构建 Go 应用程序 它是一个现有的私有 GitHub 存储库 位置如下 github xyz com repo name 我正在研究 我的目标是从 main go 文件创建一个二进制文件 该文件的方法依赖于其
  • 给定方法值,获取接收者对象

    Go 有没有办法从方法值获取接收者对象 例如有没有这样的MagicFunc这将使以下程序输出字符串my info来自底层 Foo 实例 package main import fmt type Foo struct A string fun
  • 为什么我的 SQL 占位符没有被替换(使用 Go pq)?

    根据文档 我正在这样做 var thingname string asdf var id int err database QueryRow SELECT id from things where thing thingname Scan
  • 按引用或按值扫描功能

    我有以下代码 statement SELECT id from source where mgmt 1 var exists string errUnique dr db QueryRow statement mgmt Scan exist
  • 在 Go 中使用电子邮件地址创建证书签名请求 (CSR)

    我尝试使用 crypto x509 包生成 CSR 但没有找到将 emailAddress 字段添加到其主题中的方法 根据文档证书申请 http golang org pkg crypto x509 CertificateRequest结构
  • Go 无法推断赋值中的类型:“non-name on left side of :=”

    该片段按预期工作play golang org p VuCl OKMav http play golang org p VuCl OKMav i 10 next 11 prev i i next 然而这个几乎相同的片段给出了non name
  • 使用覆盖率信息测试 Go 中的 os.Exit 场景 (coveralls.io/Goveralls)

    这个问题 如何在 Go 中测试 os exit 场景 https stackoverflow com questions 26225513 how to test os exit scenarios in go 以及其中得票最高的答案 列出
  • 重新插入通道导致死锁

    我有稳定的入站 作业 流 将其输入到无缓冲通道中 我有一个for range循环来迭代项目并处理它们 如果处理该项目失败 我会将项目重新插入通道中 以便稍后重试 问题是当我将项目重新插入通道时 它陷入僵局 我明白为什么会发生这种情况 处理器
  • (转)如何使用toml文件?

    正如标题 我想知道如何使用 golang 中的 toml 文件 在此之前 我展示了我的 toml 示例 这样对吗 datatitle enable true userids 12345 67890 datatitle 12345 prop1

随机推荐

  • 默认成员值最佳实践

    编写 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