32.2 prometheus倒排索引统计功能

embedded/2024/11/22 4:19:19/

本节重点介绍 :

  • 获取采集端的高基数metrics的tsdb页面解析
  • tsdb统计函数Stats源码解读
    • 依赖倒排索引统计

获取采集端的高基数metrics

tsdb页面解析

  • Top 10 label names with value count: 标签中value最多的10个
  • image.png
  • image.png
  • Top 10 series count by metric names: metric_name匹配的series最多的10个
  • image.png
  • image.png
  • Top 10 label names with high memory usage: 标签消耗内存最多的10个
  • Top 10 series count by label value pairs: 标签对数量最多的10个
  • image.png

核心源码解读

web侧调用入口

  • api /api/v1/status/tsdb
  • 代码位置 D:\go_path\src\github.com\prometheus\prometheus\web\api\v1\api.go
func (api *API) serveTSDBStatus(*http.Request) apiFuncResult {s, err := api.db.Stats("__name__")if err != nil {return apiFuncResult{nil, &apiError{errorInternal, err}, nil, nil}}metrics, err := api.gatherer.Gather()if err != nil {return apiFuncResult{nil, &apiError{errorInternal, fmt.Errorf("error gathering runtime status: %s", err)}, nil, nil}}chunkCount := int64(math.NaN())for _, mF := range metrics {if *mF.Name == "prometheus_tsdb_head_chunks" {m := *mF.Metric[0]if m.Gauge != nil {chunkCount = int64(m.Gauge.GetValue())break}}}return apiFuncResult{tsdbStatus{HeadStats: HeadStats{NumSeries:     s.NumSeries,ChunkCount:    chunkCount,MinTime:       s.MinTime,MaxTime:       s.MaxTime,NumLabelPairs: s.IndexPostingStats.NumLabelPairs,},SeriesCountByMetricName:     convertStats(s.IndexPostingStats.CardinalityMetricsStats),LabelValueCountByLabelName:  convertStats(s.IndexPostingStats.CardinalityLabelStats),MemoryInBytesByLabelName:    convertStats(s.IndexPostingStats.LabelValueStats),SeriesCountByLabelValuePair: convertStats(s.IndexPostingStats.LabelValuePairsStats),}, nil, nil, nil}
}

底层调用的是 tsdb的Stats函数,传入__name__标签

tsdb 统计函数 Stats

初始最大堆用作统计

	metrics := &maxHeap{}labels := &maxHeap{}labelValueLength := &maxHeap{}labelValuePairs := &maxHeap{}numLabelPairs := 0metrics.init(maxNumOfRecords)labels.init(maxNumOfRecords)labelValueLength.init(maxNumOfRecords)labelValuePairs.init(maxNumOfRecords)

遍历双层map 获取 标签中value最多的10个

  • 把所有非空的标签算入统计 labels,值是e中id-set的长度
  • labels这个 最大堆统计的就是 Top 10 label names with value count,代表 标签中value最多的10个
	for n, e := range p.m {if n == "" {continue}labels.push(Stat{Name: n, Count: uint64(len(e))})}

遍历双层map 获取 标签中value最多的10个

  • 遍历内层的map,如果name和传入的label一致,则加入metrics最大堆统计
  • metrics这个 最大堆统计的就是 Top 10 series count by metric names: metric_name匹配的series最多的10个
	for n, e := range p.m {...size = 0for name, values := range e {if n == label {metrics.push(Stat{Name: name, Count: uint64(len(values))})}}}

遍历双层map 获取 标签对数量最多的10个

  • 遍历内层的map,把name=value做统计算入labelValuePairs最大堆统计
  • labelValuePairs这个 最大堆统计的就是Top 10 series count by label value pairs: 标签对数量最多的10个
	for n, e := range p.m {...for name, values := range e {labelValuePairs.push(Stat{Name: n + "=" + name, Count: uint64(len(values))})}}

遍历双层map 获取 标签消耗内存最多的10个

  • 遍历内层的map,计算标签的value字符串长度 size,推入labelValueLength 最大堆统计
  • labelValueLength这个 最大堆统计的就是Top 10 label names with high memory usage: 标签消耗内存最多的10个
	for n, e := range p.m {if n == "" {continue}size = 0for name, values := range e {size += uint64(len(name))}labelValueLength.push(Stat{Name: n, Count: size})}

get方法获取最大堆的结果

func (m *maxHeap) get() []Stat {sort.Slice(m.Items, func(i, j int) bool {return m.Items[i].Count > m.Items[j].Count})return m.Items
}

本节重点介绍 :

  • 获取采集端的高基数metrics的tsdb页面解析
  • tsdb统计函数Stats源码解读
    • 依赖倒排索引统计
    • 是基于内存中的倒排索引 算最大堆取 top10

http://www.ppmy.cn/embedded/139520.html

相关文章

如何提高代理IP的并发能力

在数据采集的领域,时间就是金钱,效率就是生命。代理IP的并发能力直接关系到我们能否快速、高效地获取数据。那么,如何提高代理IP的并发能力呢?今天,我们就来聊聊这个话题,为你的数据采集项目提速。 并发&a…

Vue项目开发 element-UI 前端实现 1到10排列选择的按钮

在 Element UI 中,你可以通过 el-button 来实现按钮的排列选择,例如让用户选择 1 到 10 之间的数字。为了实现这一功能,我们可以使用 v-for 来动态生成 1 到 10 的按钮,并通过按钮点击事件来更新所选的数字。 以下是一个基本的实…

【高等数学学习记录】隐函数及由参数方程所确定的函数的导数、相关变化率

一、知识点 (一)隐函数的导数 显函数 对于形如 y s i n x ysinx ysinx 这种等号左端是因变量,右端是含有自变量的式子,当自变量取定义域内任一值时,由这个式子能确定对应的函数值,这种方式表达的函数叫做…

FPGA上板项目(六)——UART测试,串口收发

目录 实验内容串口接收模块模块框图时序波形仿真结果 顶层模块设计模块框图时序波形代码调整仿真结果上板测试 实验内容 将接收到的数据发送出去,实现串口回环。 串口发送的内容 FPGA上板项目(五)——UART测试,串口发送 已做过阐…

力扣 LeetCode 111. 二叉树的最小深度(Day7:二叉树)

解题思路: 用后序遍历 题目要求的最小深度为根节点到叶子节点的最小深度,注意是到根节点,所以如图所示假设(没有9这个节点)是需要返回3的,而不是1(根节点左子树为空的情况)&#x…

基于yolov8、yolov5的植物类别识别系统(含UI界面、训练好的模型、Python代码、数据集)

项目介绍 项目中所用到的算法模型和数据集等信息如下: 算法模型:     yolov8、yolov8 SE注意力机制 或 yolov5、yolov5 SE注意力机制 , 直接提供最少两个训练好的模型。模型十分重要,因为有些同学的电脑没有 GPU&#xff0…

用sqlmap工具打sqli-labs前20关靶场

这个星期我们用手动注入打了前20关靶场,今天我们用sqlmap直接梭哈前20关 1.介绍sqlmap sqlmap是一个自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL和SQL注入漏洞。 2.下载和使用sqlmap 官方下载地址:GitHub - sq…

鱼厂实习,光速转正了!

今天要分享的这篇文章,比较特殊,是我们团队一位同事写的。主要分享了他从 0 开始学编程,再到加入鱼厂光速转正的故事。长达 6000 多字,诉说了自己四年多的经历,满满的真情实感,大家可以当个小说阅读。 以下…