当前位置: 首页 > 科技观察

想要深入浅出地了解普罗米修斯,看这篇文章就足够了

时间:2023-03-16 10:19:52 科技观察

背景对于很多人来说,未知的、不确定的、无法控制的事情都会下意识地逃避。我第一次接触普罗米修斯时也有类似的感觉。对于初学者来说,Prometheus包含的概念太多,门槛太高。概念:Instance、Job、Metric、MetricName、MetricLabel、MetricValue、MetricType(Counter、Gauge、Histogram、Summary)、DataType(InstantVector、RangeVector、Scalar、String)、Operator、Function马云说:“虽然阿里巴巴是全球最大的零售平台,但阿里不是一家零售公司,而是一家数据公司。”Prometheus也是如此,它本质上是一个基于数据的监控系统。日常监控,假设需要监控WebServerA的各个API的请求量为例。需要监控的维度包括:服务名(job)、实例IP(instance)、API名(handler)、方法(method)、返回码(code)、请求量(value)。以SQL为例,演示常用的查询操作:querymethod=putandcode=200requests(redbox)SELECT*fromhttp_requests_totalWHEREcode=”200”ANDmethod=”put”ANDcreated_atBETWEEN1495435700AND1495435710;queryhandler=prometheusandmethod=post请求量(绿框)SELECT*fromhttp_requests_totalWHEREhandler=”prometheus”ANDmethod=”post”ANDcreated_atBETWEEN1495435700AND1495435710;queryinstance=10.59.8.110,handler以查询请求量开始(绿框)SELECT*query1hand”in_totalWHERE=9”8.110"ANDcreated_atBETWEEN1495435700AND1495435710;从上面的例子可以看出,在常见的查询和统计方面,日常监控是主要用于基于监控维度和时间的组合查询,如果监控100个服务,平均每个服务部署10个实例,每个服务有20个API,4个方法,每30秒采集一次数据,保存60天,然后数据条总数为:100(服务)10(实例)20(API)4(方法)86400(秒/天)*60(天)/30(秒)=138.24亿条数据,写入和存储,这种量级的数据在Mysql这样的关系型数据库上是不可能查询到的,所以Prometheus采用了TSDB作为存储引擎,存储引擎TSDB作为Prometheus的存储引擎,非常适合监控数据的应用场景。e存储的数据非常大。大多数时候,写操作几乎是顺序添加的。大多数时候,数据写入在到达时是按时间排序的。写操作很少写入非常旧的数据,也很少更新数据。在大多数情况下,数据会在数据采集后几秒或几分钟后写入数据库。删除操作一般为块删除,选择起始历史时间并指定后续块。很少在特定时间或单独的随机时间删除数据。基础数据大,一般超过内存大小。一般只选择其中的一小部分,没有规则,缓存几乎没有作用。读取操作是典型的升序或降序顺序读取。高并发读操作很常见。那么TSDB是如何实现上述功能的呢?"labels":[{"latency":"500"}]"samples":[{"timestamp":1473305798,"value":0.9}]原始数据分为标签、样本两部分。前者记录监控的维度(label:labelvalue),指标名和label可选的key-value对唯一确定一个时间序列(用series_id表示);后者包括一个时间戳(timestamp)和一个指标值(value)。系列^│.......服务器{latency="500"}│......服务器{latency="300"}│............server{}│.........v<--------time---------->TSDB使用timeseries:doc::存储键值。为了加快常见的查询查询操作:标签和时间范围组合。TSDB额外构建了三个索引:Series、LabelIndex和TimeIndex。以labellatency为例:Series存储两部分数据。一部分是按字典顺序排列的所有标签键值对的序列(series);另一部分是时间线到数据文件的索引,根据时间窗口切割存储数据块记录的具体位置信息,因此在查询大量非查询窗口记录时可以快速跳过dataLabelIndex每一对标签都会使用index:label:作为key来存储标签所有值的列表,并通过引用指向Series的值的起始位置。TimeIndex数据会以index:timeseries::为key,指向对应时间段的数据文件。强大的数据计算存储引擎为数据计算提供完美的辅助,使Prometheus完全不同于其他监控服务。Prometheus可以查询不同的数据序列,然后添加基本的运算符和强大的函数来进行度量级数的矩阵运算(见下图)。这样看来,Promtheus系统的能力并不弱于监控行业的“数据仓库”+“计算平台”。所以大数据在行业应用之初,可以理解为这是未来监控的方向。一次计算,处处查询当然,如此强大的计算能力消耗的资源是恐怖的。因此,查询预先计算好的结果通常比每次都查询原始表达式要快很多,尤其是在仪表盘和告警规则的适用场景中,仪表盘每次刷新都需要重复查询同一个表达式,而告警规则。二次操作也是如此。因此Prometheus提供了Recoding规则,可以对经常需要或者需要大量计算的表达式进行预计算,并将结果保存为一组新的时间序列,从而达到一次计算多次查询的目的。