跳过正文

重学prometheus

·148 字·1 分钟
Chuck Chan
作者
Chuck Chan
分享技术、思考与生活

1. 数据是如何存储的
#

无论是哪种metrics类型,prometheus在底层都会将所有采集到的样本数据以时间序列的方式存储在内存数据库中,并定时保存到硬盘上。如下图,可以理解为一个以时间为X轴的数字矩阵:

  ^
  │   . . . . . . . . . . . . . . . . .   . .   node_cpu_seconds_total{cpu="cpu0",mode="idle"}
  │     . . . . . . . . . . . . . . . . . . .   node_cpu_seconds_total{cpu="cpu0",mode="system"}
  │     . . . . . . . . . .   . . . . . . . .   node_load1{}
  │     . . . . . . . . . . . . . . . .   . .
  v
    <------------------ 时间 ---------------->

如图,横轴为即时间,矩阵中的点称为一个样本,样本由以下三个部分组成:

  • 指标(metric):指标名称和描述当前样本特征的 labelsets,如上图中的"node_cpu_seconds_total"
  • 时间戳(timestamp):一个精确到毫秒的时间戳;
  • 样本值(value): 一个 folat64 的浮点型数据表示当前样本的值。

其中,指标的格式如下所示:

http_request_total{status="200", method="GET"}

“http_request_total"为指标的名称,这个指标名称反应了被监控样本的含义(顾名思义,http_request_total是用来监控当前系统的http请求)。而"status"跟"method"都为label,给指标打上label就是为了细分/筛选数据,比如需要监控http请求状态码为200的请求,这个label的作用就是如此。

1. metrics的四种类型
#

Prometheus定义了4中不同的指标类型(metric type),用于够帮助用户理解和区分这些不同监控指标之间的差异。

  • Counter(计数器)
  • Gauge(仪表盘)
  • Histogram(直方图)
  • Summary(摘要)

2. Counter
#

counter是一个只增不减的计数器,常见的监控指标如http_requests_totalnode_cpu都是Counter类型的监控指标。 一般在定义Counter类型指标的名称时推荐使用**_total**作为后缀。

我们可以用counter来记录某些时间发生的次数,一般配合increase、rate、irate等函数统计变化速率

例如,通过rate函数记录search请求的QPS:

rate(http_requests_total{path="search"}[5m])

又例如,当前系统中访问量前10的HTTP地址:

topk(10, http_requests_total)

3. Guage
#

guage也是一个计数器,但跟counter不同,guage是可增可减的,它反映的是一个瞬时的值。当看到guage时我们很容易联想到汽车上的速度仪表盘,速度仪表盘里的速度值正是可增可减的。系统监控中常见的一些指标例如: cpu使用率、内存空闲率等,都是guage类型的监控指标。

计算 CPU 温度在两小时内的差异:

dalta(cpu_temp_celsius{host="zeus"}[2h])

还可以通过PromQL 内置函数 predict_linear() 基于简单线性回归的方式,对样本数据的变化趋势做出预测。例如,基于 2 小时的样本数据,来预测主机可用磁盘空间在 4 个小时之后的剩余情况:

predict_linear(node_filesystem_free{job="node"}[2h], 4 * 3600) < 0

4. Histogram
#