Prometheus源码学习(11)-common_model

news/2024/7/2 1:23:17 标签: prometheus, 源码

文章目录

  • lables.go
  • labelset.go
  • metric.go
  • value.go
  • alert.go
  • fnv.go
  • signature.go
  • 收获

github.com/prometheus/common@v0.35.0/model

lables.go

  1. 首先声明一系列标签常量,其中 __meta___tmp_ 前缀用于标签的中间处理
  2. 标签名 LabelName 是字符串,命名规范是“可以包含大写或小写英文字母、数字和下划线,不能以数字开头”
  3. LabelNamesLabelName 的切片,支持排序
  4. 标签值 LabelValue 是 utf8 字符串,LabelValuesLabelValue 的切片,支持排序
  5. LablePairLabelNameLabelValue 组成的结构体
  6. LablePairsLablePair 的切片,支持排序,排序依据是先按标签名再按标签值

labelset.go

  1. LabelSet 是一个map,一组标签键值对的集合 type LabelSet map[LabelName]LabelValue
  2. LabelSet 的 String() 函数会对键值对进行字符串排序,这样在前端查询时显示的标签集都是有序的,比较清晰

metric.go

  1. type Metric LabelSet 的底层类型就是 LabelSet,区别在于 Metrics 是单例,并且关联且仅引用一系列样本
  2. 指标名命名规范:可以包含大小写英文字母、数字、下划线和冒号,不能以数字开头
  3. String()方法要判断是否只有 __name__ 标签,如果是就不显示标签集的大括号了,否则返回除 __name__{labels} 这种格式的字符串
  4. 实现了 LabelSet 的一些方法

value.go

  1. 样本值是 float64类型:type SampleValue float64,代表某个时间的某个样本的值
  2. 判等函数中有关于 NaN 不等于 NaN 的说明
  3. 样本对包含时间戳和样本值
type SamplePair struct {
	Timestamp Time
	Value     SampleValue
}
  1. 样本是指标、样本值和时间戳组成的结构体
type Sample struct {
	Metric    Metric      `json:"metric"`
	Value     SampleValue `json:"value"`
	Timestamp Time        `json:"timestamp"`
}
  1. 样本串是一个指标和一组样本对
type SampleStream struct {
	Metric Metric       `json:"metric"`
	Values []SamplePair `json:"values"`
}
  1. 值是实现了 Type() 方法的接口,是查询语句的结果,有无值、标量、向量、矩阵和字符串五种类型的值
type Value interface {
	Type() ValueType
	String() string
}

func (Matrix) Type() ValueType  { return ValMatrix }
func (Vector) Type() ValueType  { return ValVector }
func (*Scalar) Type() ValueType { return ValScalar }
func (*String) Type() ValueType { return ValString }

type ValueType int

const (
	ValNone ValueType = iota
	ValScalar
	ValVector
	ValMatrix
	ValString
)
  1. 向量类型是具有相同时间戳的 *Sample 的切片
  2. 矩阵类型是 *SampleStream 的切片

alert.go

  1. 告警指纹是告警标签集的指纹
  2. Go 的零时是时间戳为0的时间 January 1, year 1, 00:00:00 UTC

fnv.go

对标准库 hash/fnv 的 FNV-1A 64-bit 算法做了一些简化,性能有大幅提升,甚至超过了 murmur3,我做了一个benchmark

cpu: Intel(R) Core(TM) i7-8565U CPU @ 1.80GHz
BenchmarkMD5
BenchmarkMD5-8           5231271               222.5 ns/op
BenchmarkFNV
BenchmarkFNV-8          12151196                90.65 ns/op
BenchmarkFNVProm
BenchmarkFNVProm-8      57570523                20.62 ns/op
BenchmarkMurmer3
BenchmarkMurmer3-8      18314626                54.97 ns/op

signature.go

  1. 用简化 FNV-1A 64-bit 算法计算指标或者标签的哈希值作为指纹
  2. LabelsToSignature 计算标签(Labels) map 的指纹
  3. labelSetToFingerprint 计算标签集(LabelSet)的指纹
  4. func SignatureForLabels(m Metric, labels ...LabelName) uint64 计算指标的指纹,哈希时除了计算指定的标签外还计算指标值
  5. func SignatureWithoutLabels(m Metric, labels map[LabelName]struct{}) uint64 计算不包含指定标签的指标的指纹
  6. 快速指纹算法不排序,但是更容易产生碰撞,研究了半天才明白

收获

这个包有很多实用的数据类型和函数,在自己开发系统时可以直接用

  1. 很多数据模型比如 label、labelset、alert 可以在自己开发监控告警系统时直接使用
  2. fnv 算法性能好碰撞几率小,以后可以直接用
  3. 计算多元素类型的哈希时先排序

http://www.niftyadmin.cn/n/1531789.html

相关文章

sql between and 复制表

1 -between and 包括边界值,如果是日期 截止日期到00点0分 如果截止日期:2019-7-26 则为:2019-7-26 00:00:00 not between adn 不包括边界值 2 复制表 select * into newtable from oldtable where 12 insert into new…

Three.js教程:网格模型

推荐:将 NSDT场景编辑器 加到你的3D工具链 工具集: NSDT简石数字孪生 网格模型(三角形概念) 本节课给大家演示网格模型Mesh渲染自定义几何体BufferGeometry的顶点坐标,通过这样一个例子帮助大家建立**三角形(面)**的概念 三角形(面) 网格模型Mesh其实…

tarjan学习笔记

1.$tarjan$求强连通分量 思想:在$dfs$的过程中,把强连通分量中的点入栈,当找到一个强连通分量的最起始的点,就将其所在强连通分量中的点出栈。 缩点 把强连通分量中的点缩成一个点,进行重新建图,从而解决一…

偶尔发现此地

对于自己的工作一直没有很好的积累,平时看到一些好的文章和思想往往来不及整理就被从脑海中挤掉。希望能在这里留下一点感想,一些思想和点滴记忆。。。转载于:https://www.cnblogs.com/risun/archive/2004/06/16/16241.html

搭建Ceph分布式存储

环境: 系统 IP地址 主机名(登录用户) 承载角色 Centos 7.4 64Bit 1611 10.199.100.170 dlp(yzyu) ceph-client(root) admin-node ceph-client Centos 7.4 64Bit 1611 10.199.100.171 …

生成器和各种推导式

昨日回顾 1. 函数名 -> 第一类对象函数名就是变量名.函数可以赋值函数可以作为集合类的元素函数可以作为参数传递函数可以作为返回值返回2. 闭包语法: 内层函数对外层函数的局部变量的使用def wrapper():name ""def inner():return namereturn inner如何查看一个…

TensorFlow gfile文件操作详解

转:https://blog.csdn.net/u014182497/article/details/80681331 一、gfile模块是什么 gfile模块定义在tensorflow/python/platform/gfile.py,但其源代码实现主要位于tensorflow/tensorflow/python/lib/io/file_io.py,那么gfile模块主要功能是…

Python标准库shutil用法实例详解

转:https://www.jb51.net/article/145522.htm shutil模块提供了许多关于文件和文件集合的高级操作,特别提供了支持文件复制和删除的功能。 文件夹与文件操作 copyfileobj(fsrc, fdst, length16*1024): 将fsrc文件内容复制至fdst文件&#xff…