zoukankan      html  css  js  c++  java
  • 理解时间序列

    样本

    Prometheus会将所有采集到的样本数据以时间序列(time-series)的方式保存在内存数据库中,并且定时保存到硬盘上。
    time-series是按照时间戳和值的序列顺序存放的,我们称之为向量(vector). 每条time-series通过指标名称(metrics name)和一组标签集(labelset)命名。
    如下所示,可以将time-series理解为一个以时间为Y轴的数字矩阵:

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

    在time-series中的每一个点称为一个样本(sample),样本由以下三部分组成:

    • 指标(metric):metric name和描述当前样本特征的labelsets;
    • 时间戳(timestamp):一个精确到毫秒的时间戳;
    • 样本值(value): 一个folat64的浮点型数据表示当前样本的值。
    <--------------- metric ---------------------><-timestamp -><-value->
    http_request_total{status="200", method="GET"}@1434417560938 => 94355
    http_request_total{status="200", method="GET"}@1434417561287 => 94334
    
    http_request_total{status="404", method="GET"}@1434417560938 => 38473
    http_request_total{status="404", method="GET"}@1434417561287 => 38544
    
    http_request_total{status="200", method="POST"}@1434417560938 => 4748
    http_request_total{status="200", method="POST"}@1434417561287 => 4785
    

    指标(Metric)

    在形式上,所有的指标(Metric)都通过如下格式标示:

    <metric name>{<label name>=<label value>, ...}
    

    指标的名称(metric name)可以反映被监控样本的含义(比如, http_request_total - 表示当前系统接收到的HTTP请求总量)。
    指标名称只能由ASCII字符、数字、下划线以及冒号组成并必须符合正则表达式 [a-zA-Z_:][a-zA-Z0-9_:]*

    标签(label)反映了当前样本的特征维度,通过这些维度Prometheus可以对样本数据进行过滤,聚合等。
    标签的名称只能由ASCII字符、数字以及下划线组成并满足正则表达式 [a-zA-Z_][a-zA-Z0-9_]*

    其中以 __ 作为前缀的标签,是系统保留的关键字,只能在系统内部使用。
    标签的值则可以包含任何Unicode编码的字符。
    在Prometheus的底层实现中指标名称实际上是以 __name__=<metric name> 的形式保存在数据库中的,因此以下两种方式均表示的同一条time-series:

    api_http_requests_total{method="POST", handler="/messages"}
    

    等同于:

    {__name__="api_http_requests_total",method="POST", handler="/messages"}
    

    在Prometheus源码中也可以指标(Metric)对应的数据结构,如下所示:

    type Metric LabelSet
    
    type LabelSet map[LabelName]LabelValue
    
    type LabelName string
    
    type LabelValue string
    

    Metric类型

    在Prometheus的存储实现上所有的监控样本都是以time-series的形式保存在Prometheus内存的TSDB(时序数据库)中,而time-series所对应的监控指标(metric)也是通过labelset进行唯一命名的。

    从存储上来讲所有的监控指标metric都是相同的,但是在不同的场景下这些metric又有一些细微的差异。
    例如,在Node Exporter返回的样本中指标node_load1反应的是当前系统的负载状态,随着时间的变化这个指标返回的样本数据是在不断变化的。
    而指标node_cpu所获取到的样本数据却不同,它是一个持续增大的值,因为其反应的是CPU的累积使用时间,从理论上讲只要系统不关机,这个值是会无限变大的。

    为了能够帮助用户理解和区分这些不同监控指标之间的差异,Prometheus定义了4中不同的指标类型(metrictype):Counter(计数器)、Gauge(仪表盘)、Histogram(直方图)、Summary(摘要)。

    Counter:只增不减的计数器

    Counter类型的指标其工作方式和计数器一样,只增不减(除非系统发生重置)。
    常见的监控指标,如http_requests_total,node_cpu都是Counter类型的监控指标。
    一般在定义Counter类型指标的名称时推荐使用_total作为后缀。

    Gauge:可增可减的仪表盘

    Gauge类型的指标侧重于反应系统的当前状态。因此这类指标的样本数据可增可减。
    常见指标如:node_memory_MemFree(主机当前空闲的内容大小)、node_memory_MemAvailable(可用内存大小)都是Gauge类型的监控指标。

    使用Histogram和Summary分析数据分布情况

    Histogram和Summary主用用于统计和分析样本的分布情况。

    在大多数情况下人们都倾向于使用某些量化指标的平均值,例如CPU的平均使用率、页面的平均响应时间。
    这种方式的问题很明显,以系统API调用的平均响应时间为例:如果大多数API请求都维持在100ms的响应时间范围内,而个别请求的响应时间需要5s,那么就会导致某些WEB页面的响应时间落到中位数的情况,而这种现象被称为长尾问题。

    为了区分是平均的慢还是长尾的慢,最简单的方式就是按照请求延迟的范围进行分组。
    例如,统计延迟在0~10ms之间的请求数有多少而10~20ms之间的请求数又有多少。通过这种方式可以快速分析系统慢的原因。
    Histogram和Summary都是为了能够解决这样问题的存在,通过Histogram和Summary类型的监控指标,我们可以快速了解监控样本的分布情况。

    与Summary类型的指标相似之处在于Histogram类型的样本同样会反应当前指标的记录的总数(以_count作为后缀)以及其值的总量(以_sum作为后缀)。
    不同在于Histogram指标直接反应了在不同区间内样本的个数,区间通过标签len进行定义。

    同时对于Histogram的指标,我们还可以通过histogram_quantile()函数计算出其值的分位数。不同在于Histogram通过histogram_quantile函数是在服务器端计算的分位数。
    而Sumamry的分位数则是直接在客户端计算完成。
    因此对于分位数的计算而言,Summary在通过PromQL进行查询时有更好的性能表现,而Histogram则会消耗更多的资源。反之对于客户端而言Histogram消耗的资源更少。
    在选择这两种方式时用户应该按照自己的实际场景进行选择。

  • 相关阅读:
    PowerMock 遇到的问题——2
    PowerMock遇到的问题——3
    PowerMock使用遇到的问题——2
    PowerMock使用遇到的问题——1
    PowerMock使用遇到的一些问题
    PowerMock.expectNew(Class<T> type, Class<?>[] parameterTypes, Object... arguments)
    PowerMock与EasyMock的应用(转)
    EasyMock的原理及使用方法
    一个div相对于外层的div水平和垂直居中
    SAP 采购订单收货时报错:对于采购订单xxxx无收货可能
  • 原文地址:https://www.cnblogs.com/sanduzxcvbnm/p/13306085.html
Copyright © 2011-2022 走看看