在做负载分析时,需要用到时序数据进行分析和可视化,一个专门用于存储时序数据的数据库就非常必要了。在同学的推荐下,发现并开始使用prometheus。正在慢慢探索当中…


Prometheus

1.定义

Prometheus是一套开源的监控&报警&时间序列数据库的组合,起始是由SoundCloud公司开发的。随着发展,越来越多公司和组织接受采用Prometheus,社区也十分活跃,他们便将它独立成开源项目,并且有公司来运作。google SRE的书内也曾提到跟他们BorgMon监控系统相似的实现是Prometheus。现在最常见的Kubernetes容器管理系统中,通常会搭配Prometheus进行监控。

2.优点

  • 非常少的外部依赖,安装使用超简单
  • 已经有非常多的系统集成 例如:docker HAProxy Nginx JMX等等
  • 服务自动化发现
  • 直接集成到代码
  • 设计思想是按照分布式、微服务架构来实现的

3.系统架构

prometheus工作目录数据太大 prometheus自带数据库_Prometheus


接下来根据图理解下服务过程:

Prometheus daemon负责定时去目标上抓取metrics数据,每个抓取目标需要暴露一个http服务的借口给它定时抓取。

Alertmanager 是独立于Prometheus的一个组件,可以支持Prometheus的查询语句,提供十分灵活的报警方式。

Prometheus支持很多方式的图表可视化,例如十分精美的Grafana,自带的Promdash,以及自身提供的模版引擎等等,还提供HTTP API的查询方式,自定义所需要的输出。

PushGateway这个组件是支持Client主动推送 metrics 到PushGateway,而Prometheus只是定时去Gateway上抓取数据。

Prometheus 的数据模型

Prometheus 从根本上所有的存储都是按时间序列去实现的,相同的 metrics(指标名称) 和 label(一个或多个标签) 组成一条时间序列,不同的label表示不同的时间序列。为了支持一些查询,有时还会临时产生一些时间序列存储。

metrics name & label 指标名称和标签
每条时间序列是由唯一的 指标名称 和 一组 标签 (key=value)的形式组成。
指标名称 一般是给监测对像起一名字,例如 http_requests_total 这样,它有一些命名规则,可以包字母数字_之类的的。
通常是以应用名称开头监测对像数值类型_单位这样。
例如:

push_total
userlogin_mysql_duration_seconds
app_memory_usage_bytes
标签 就是对一条时间序列不同维度的识别了,例如 一个http请求用的是POST还是GET,它的endpoint是什么,这时候就要用标签去标记了。
最终形成的标识便是这样了。

http_requests_total{method="POST",endpoint="/api/tracks"}

记住,针对http_requests_total这个metrics name 无论是增加标签还是删除标签都会形成一条新的时间序列。
查询语句就可以跟据上面标签的组合来查询聚合结果了。
如果以传统数据库的理解来看这条语句,则可以考虑 http_requests_total是表名,标签是字段,而timestamp是主键,还有一个float64字段是值了。(Prometheus里面所有值都是按float64存储)

Prometheus 的四种数据类型

Counter
Counter用于累计值,例如记录请求次数,任务完成数,错误发生次数。
一直增加,不会减少。
重启进程后,会被重置。

http_response_total{method="GET",endpoint="/api/tracks"} 100
#10秒后抓取 http_response_total{method="GET",endpoint="/api/tracks"} 100

Guage
Guage常规数值。例如 温度变化、内存使用变化
可变大 可变小
重启进程后 会被重置

memory_usage_bytes{host="master-01"} 100 < 抓取值
memory_usage_bytes{host="master-01"} 30
memory_usage_bytes{host="master-01"} 50
memory_usage_bytes{host="master-01"} 80 < 抓取值

Histogram

可以理解为柱状图,常用语跟踪事件发生的规模。例如:请求耗时、响应大小,它特别之处是可以对记录的内容进行分组,提供count和sum全部值的功能。

{小于10=5次,小于20=1次,小于30=2次},count=7次,sum=7次的求和值

prometheus工作目录数据太大 prometheus自带数据库_时间序列_02

Summary

Summary和Histogram十分相似,常用于跟踪事件发生的规模,例如:请求耗时、响应大小。同样提供 count 和 sum 全部值的功能。
例如:count=7次,sum=7次的值求值
它提供一个quantiles的功能,可以按%比划分跟踪的结果。例如:quantile取值0.95,表示取采样值里面的95%数据。