0 - 本案例所涉及的知识点

云原生、微服务,带你了解大规模容器下的监控方式,通过各个案例分析,熟悉prometheus的内部原理。

涉及知识点:go prometheus

1 - 案例概要

收到用户反馈,使用grafana通过设置prometheus数据源,绘制容器的网络指标时,出现异常,guan j z

2 - 故障重现

服务端prometheus版本为2.9.2,通过访问内置UI地址 prometheus-server:9090,查询数据重现故障,错误截图如下,

通过浏览器开发者模式,获取当前具体的请求接口可表示为:

响应的HTTP状态码422 Unprocessable Entity,错误信息:

3 - 初步假设

看字面意思是查询返回的样本结果集合中存在相同的标签,至于是什么标签相同,只能通过查询源码定位问题了。

4 - 理论知识

4.1 - Prometheus基础数据结构

首先熟悉Prometheus几个基础数据结构

Sample与Series的区别:

  • Sample是样本:一个标签组合,只包含一个时间点以及该点的时间数据
  • Series是序列:一个标签组合,由多个时间点以及对应的数据组合而成

Vector与Matrix的区别:

  • Vector是一个向量数据结构,由多个样本组成,这些样本以时间为方向,具有相同的方向
  • Matrix是一个矩阵数据结构,由多个序列数据组成

4.2 - 通过关键字匹配定位源码

  • 异常关键字出现的代码位置

源码文件:github.com/prometheus/prometheus/promql/engine.go

  • 关键函数result.ContainsSameLabelset的实现源码

该函数主要用于检测在查询返回的数据中,是否存在相同的标签集合,由于向量与矩阵标签类型相同,所以实际它们内部的实现也是一样的。

源码文件:github.com/prometheus/prometheus/promql/value.go

  • 判断样本标签组唯一性,函数s.Metric.Hash()的实现

源码文件:github.com/prometheus/prometheus/pkg/labels/labels.go

也就是在这计算中Vector(向量)或Matrix(矩阵),不能存在相同的Labels(标签组)。

5 - 疑点提出

  1. Prometheus的持久存储方案是内部开发团队自实现的,是这个引起的?
  2. Prometheus本地存储设置只保留最近24h的数据,难道是这部分数据异常?
  3. 分别关闭本地与远程存储,如果均正常,难道是查询返回了相同的两条指标?
  4. 向量与矩阵里面的样本或序列数据是不能存在相同的标签组合?

6 - 实践检验

6.1 - 实验前准备

下载源码,通过以下命令可编译二进制可执行文件

cd github.com/prometheus/prometheusgo build cmd/prometheus/main.go

6.2 - 验证疑点1

由于prometheus本身不适合做长久数据存储,所以我们内部设计了一套持久存储的方案,结合配置remote_read、remote_write实现。

为了验证疑点1,可以先把prometheus.yml中的remote_read设置关闭,然后重载prometheus配置。

通过停止remote_read设置之后就可以正常使用了,但这里也并不能确定就是设置remote_read的问题。

6.2 - 验证疑点2

通过关闭远程数据读取可以解决问题,那通过删除本地数据呢?通过以下步骤:

  1. 设置prometheus.yml取消原先对remote_read的注释。
  2. 关闭prometehus进程,清除本地存储目录下的所有数据,实际由storage.tsdb.path设置,如:data/*
  3. 重新启动prometheus进程。

在刚启动时候,可以正常查询出数据:

等待一会后,出现同样问题:

6.3 - 验证疑点3

在同时开启本地与远程数据存储的情况下,通过promQL查询以下语句:

container_network_receive_bytes_total{pod_name="magick-img-converter-747d899b66-lsrn6"}[1m]

接口返回内容:

确实是访问两个相同标签组的数据,但是时间不同。

对这结果集使用rate函数计算,也就出现了原先的问题。

rate(container_network_receive_bytes_total{pod_name="magick-img-converter-747d899b66-lsrn6"}[1m])

6.4 - 验证疑点4

相同的标签组合是指:一组同样的标签名与标签值。这里通过更改prometheus代码,植入测试语句,获取从远程或本地的数据,对比差异,查询到底哪里导致这个问题的产生。

由以上几个疑点验证可知,问题出现在eval函数的case *Call语句中。

通过对以上函数添加调试代码,然后编译promethues运行,在执行相应的promQL查询。

这里可以看到,存在两个数据,在未移除标签__name__之前,上图存在两个__name__,下图只有一个__name__,当移除之后,他们就存在相同的标签组了。

7 - 问题定位

查询指标数据时,prometheus分别从本地存储与远程存储获取数据,然后进行合并,远程存储获取的数据相比本地多了一个__name__标签。

8 - 解决方案

8.1 - 方案1

修复远程存储返回多余的__name__标签。

8.2 - 方案2

修改prometheus代码,如果存在重复的__name__标签键值,则想办法去重。

9 - 总结讨论

通过方案1,我们就解决了这个问题,同时也继续跟踪prometheus源码,能否为它提交PR,增强健壮性。

如存在疑问点,欢迎留言讨论,本人关注云原生生态,如果您也喜欢,欢迎关注我,一起学习,共同进步。

go实现重新给metric打标签上传到prometheus_案例分析|云原生监控Prometheus对样本rate计算,出现标签重复?...相关推荐

  1. 上传文件漏洞案例分析

    上传文件漏洞 漏洞描述 上传漏洞这个顾名思义,就是攻击者通过上传木马文件,直接得到WEBSHELL,危害等级超级高,现在的入侵中上传漏洞也是常见的漏洞. 导致该漏洞的原因在于代码作者没有对访客提交的数 ...

  2. 上传文件到腾讯云存储桶

    上传文件到腾讯云存储桶 一,配置腾讯云Cos 流程图 第一步,注册腾讯云账号 第二步,选择帐户 填写个人信息 第三步扫码授权 手机端授权 第四步点击免费产品 五步选择对象存储Cos 六步开通服务 七步 ...

  3. 上传数据,直接分析,这才是真正的生物云

    计算资源,生物软件安装,数据库配置,往往占据生物数据分析80%以上的时间,一直是阻挡生物数据分析的三座大山.为了实现我们"上传数据,直接分析"的理念.我们对计算资源的追求是无止境的 ...

  4. 通过COS上传文件至腾讯云

    最近看了一下上传文件至腾讯云.腾讯官方提供的API,cloud.tencent.com/document/pr- 文档上传 文档上传首页要首先引入腾讯云封装好的cos-js-sdk-v5.js文件,然 ...

  5. 弹性服务器怎么上传文件,上传哪个文件夹弹性云服务器

    上传哪个文件夹弹性云服务器 内容精选 换一换 华为云帮助中心,为用户提供产品简介.价格说明.购买指南.用户指南.API参考.最佳实践.常见问题.视频帮助等技术文档,帮助您快速上手使用华为云服务. 本节 ...

  6. excel oss 上传_java实现上传文件到oss(阿里云)功能示例

    本文实例讲述了java实现上传文件到oss(阿里云)功能.分享给大家供大家参考,具体如下: 做这个功能之前我们需要导入阿里云OSS官方提供的工具包 aliyun-sdk-oss-2.5.0.jar 这 ...

  7. 怎么用IDEA上传本地项目到码云/Github?

    博主码云地址:https://git.oschina.net/zsyoung01,欢迎关注! 博客原文地址:http://blog.csdn.net/zsyoung/article/details/7 ...

  8. 【上传文件】基于阿里云的视频点播VOD、对象存储OSS实现音视频图片等文件上传

    一.效果演示 a.测试界面初始化 b.点击[上传视频] c.点击[开始上传] d.点击[上传音频]选择音频之后点击[开始上传] c.点击[上传图片],注意图片上传为单按钮,选择文件之后自动完成上传 d ...

  9. git上传本地工程到码云上,报错: ! [rejected] master - master (non-fast-forward) error: failed to push some

    git上传本地工程到码云上,报错: fushaolei@DESKTOP-50PGGOT MINGW64 /f/teach/xcEdu/xcEduUI01/xc-ui-pc-static-portal ...

最新文章

  1. 关于mybatis中基本类型条件判断问题
  2. python 程序1【登录接口】
  3. MySQL函数和操作符(超详细,备着查找)
  4. 用rollback()VS不用rollback()
  5. MySQL数据库创建用户_修改用户_删除用户_设置用户
  6. 什么是动态链接库(DLL)以及常见问题
  7. java两个二进制数求和,Leetcode 67:Add Binary(二进制求和)
  8. 资深开发者告诉你“页游转手游”应注意的五大点
  9. 计时器setInterval()、setTimeout()
  10. 读书-算法《程序设计导引及在线实践》-简单计算题3:校门外的树
  11. 这几款好加密软件让你不再担心担心隐私泄露!
  12. incaseformat病毒分析
  13. 小程序php上传图片到服务器,关于微信小程序上传图片到服务器的代码
  14. python详细教程#2下载python
  15. PLC是什么?它的作用是什么?
  16. 证明左右特征向量正交
  17. C++字母大小写转换方法
  18. 天地图-第五篇-覆盖物
  19. 2021年中国集成电路重点企业对比(光迅科技VS大唐电信VS士兰微VS中芯国际)[图]
  20. PTA 乙级难点(全部)

热门文章

  1. call指令和ret指令的配合使用
  2. Android之旅---Service
  3. 更改centos 5 yum源
  4. javascript实现缩略图
  5. 加密货币支付卡公司与BCH达成合作
  6. Excel常用英文字母快捷键:
  7. 不要以为用了云,就不要运维
  8. 从零学React Native之13 持久化存储
  9. Veeam Backup Replication v7 安装配置手册
  10. 离职员工如何处理Exchange邮箱