Prometheus源码学习(11)-common_model


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. 计算多元素类型的哈希时先排序
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在mysqld_exporter的配置文件中,"collect.global_variables"用于指定需要采集的全局变量,其中包括"thread_pool_size"和"max_connections"等参数。这些全局变量的值将在指定的时间间隔内被采集,并通过Prometheus进行监控和告警。 对于"thread_pool_size"和"max_connections"这两个参数,需要根据具体的MySQL服务器配置和实际情况进行设置。 - thread_pool_size:该参数指定MySQL服务器的线程池大小,即同时可以处理的客户端连接数。如果MySQL服务器经常出现"Too many connections"的错误,可以适当增加该参数的值。但是,过高的线程池大小也会导致系统资源的浪费,因此需要根据实际情况进行调整。一般来说,可以将该参数设置为CPU核心数的2~3倍。 - max_connections:该参数指定MySQL服务器允许的最大连接数。如果MySQL服务器经常出现连接数过高的问题,可以适当降低该参数的值。但是,过低的最大连接数也会导致系统无法处理更多的客户端连接请求,因此需要根据实际情况进行调整。一般来说,可以根据服务器的硬件配置和实际负载情况,将该参数设置为100~1000之间的值。 需要注意的是,调整这些参数的值可能会对MySQL服务器的性能和稳定性产生影响,因此建议在进行调整之前,先进行充分的测试和评估。同时,建议使用监控工具对MySQL服务器的运行状态进行实时监控,及时发现并解决问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值