下一代应用监控指标采集器Prometheus基础介绍

Prometheus简介

Prometheus是一个最初在SoundCloud上构建的开源系统监视和警报工具包 。自2012年成立以来,许多公司和组织都采用Prometheus,该项目拥有一个很是活跃的开发人员和用户社区。它如今是一个独立的开源项目。Prometheus于2016年加入谷歌主导的顶级开源社区云原生计算基金会(CNCF),成为第二个顶级托管项目。第一是大名鼎鼎的k8s。 prometheus是属于下一代监控。可用来监控正则表达式

特征

普罗米修斯的主要特色是:数据库

  • 多维度数据模型(时序由metric名称和k/v结构的labels构成)。
  • 灵活的查询语句(PromQL)。
  • 无依赖存储,支持本地和远程。
  • 采用http协议,使用pull模式拉取数据。
  • 监控目标,能够采用服务发现或静态配置的方式。
  • 支持多种统计数据模型,图形化友好。

组件

Prometheus生态系统由多个组件组成,其中许多组件是可选的,主要有:api

  • Prometheus server - 收集和存储时间序列数据
  • client library - 用于client访问server/pushgateway
  • pushgateway - 对于短暂运行的任务,负责接收和缓存时间序列数据,同时也是一个数据源
  • exporter - 各类专用exporter,面向硬件、存储、数据库、HTTP服务等
  • alertmanager - 告警管理器,用以监控指标告警

架构

此图说明了Prometheus的体系结构及其一些生态系统组件: 缓存

Prometheus直接或者间接拉取应用的监控指标,汇总并转化成自有的时间序列数据模型或者生成告警信息。提供api给具备可视化的一些UI展示层。服务器

适用场景

Prometheus在记录时间序列的数据方面表现很是好。它既适用于面向服务器等硬件指标的监控,也适用于高动态的面向服务架构的监控。对于如今流行的微服务,Prometheus的多维度数据收集和数据筛选查询语言也是很是的强大。Prometheus是为服务的可靠性而设计的,当服务出现故障时,它可使你快速定位和诊断问题。它的搭建过程对硬件和服务没有很强的依赖关系。 Prometheus的价值在于可靠性,甚至在很恶劣的环境下,你均可以随时访问它和查看系统服务各类指标的统计信息。 若是你对统计数据须要百分之百的精确,那么Prometheus不是一个很好的选择。架构

即时向量选择器

Prometheus存储的是时序数据, 即按照相同时序(相同的名字和标签),以时间维度存储连续的数据的集合。时间序列由metric名称和label组成,由于随着时间而改变,因此时序数据都是向量。app

  • metric 监控的指标名称。名称能够包含ASCII字母、数字、下划线和冒号,必须知足正则表达式 [a-zA-Z_:][a-zA-Z0-9_:]*, 其名字应该具备语义化,通常表示一个能够度量的指标。假如咱们来度量http请求的总数,咱们能够用http_requests_total来表示。
  • label 用来标识其所属的metric的特性。由kv匹配表达式组成。好比上面的http_requests_total,若是咱们须要监控来自应用名称为myapp的应用时,咱们就能够这样来过滤出咱们想要的数据:http_requests_total{ appliaction="myapp",} 。 若是有多个label用逗号隔开并以逗号结尾。

综上所述,能够概括出即时向量选择器通用pattern为: [metric name]{[label name]=[label value], ...}函数

匹配运算符

上面提到label是一个kv匹配表达式。并不局限于 = 匹配。 如下是label的匹配运算符:微服务

  • = 选择相同匹配。
  • != 选择不等于匹配。
  • =~ 选择正则表达式匹配。
  • !~ 选择正则表达式不匹配。

以下例子:工具

http_requests_total{environment=~"prod|testing",method!="GET"} 用来匹配生产或者测试环境,并且不是get请求的总请求数。

范围向量选择器

范围向量选择器与即时向量选择器工做原理相同,只不过返回当前时间之前的一系列采样。时间范围由附加在向量选择器尾部的[]指定,具体的值由数字和单位组成,时间单位包括:

  • s - 秒
  • m - 分钟
  • h - 小时
  • d - 天
  • w - 星期
  • y - 年

例如,返回5分钟内metric名为http_requests_total、job是prometheus的所有时间序列:

http_requests_total{job="prometheus"}[5m] 也就是若是咱们对即时向量要作范围度量,能够在其后用[rangTime] 来定义。

偏移修改器

offset修饰符容许在单个即时向量或范围向量查询中设置相对于当前时间的时间偏移。下面的表达式返回http_requests_total5分钟前的值:

http_requests_total offset 5m 请注意语法上offset修饰符应紧跟在selector后面。

内置函数

函数 内置函数不少,说几个使用过的,其余函数可参考https://prometheus.io/docs/prometheus/latest/querying/functions/

函数 功能
rate 计算每秒平均值,仅适用于Counter,例如统计QPS
sum 计算求和
histogram_quantile 计算分位值

时序类型

Prometheus的时序数据分为 Counter, Gauge, Histogram, Summary 四种类型:

  • Counter:计数器。只容许重置或者增长。咱们每每用它记录服务请求总量,错误总数等。例如 Prometheus server 中 http_requests_total, 表示 Prometheus 处理的 http 请求总数,咱们可使用data, 很容易获得任意区间数据的增量。

  • Gauge:表示搜集的数据是一个瞬时的,与时间没有关系,能够任意变高变低,每每能够用来记录内存使用率、磁盘使用率等。表达一个瞬时的状态。

  • Histogram: 采样观测值,可进行分位计算和数据聚合,计算在server端完成。一个名为的metric,其histogram有3个固定的时间序列

    • _bucket 不一样bucket下的观测值的累加数量
    • _sum 观测值的总和
    • _count 观测值的数量
  • Summary:不是根据区间计算出来的而是直接统计一段区间的采样结果。如请求持续时间或响应大小。不一样于Histogram,该数值是在客户端直接统计计算。由于没有最初值,故而不能聚合。

注意事项

  • 时间要对齐 大多数聚合的时间序列数据所对应的时间戳没有对齐。因为它们的独立性,咱们须要在这些时间戳中选择一个时间戳,并已这个时间戳为基准,获取小于且最接近这个时间戳的时间序列数据。

  • 数据过时 若是5分钟内,没有获取到任何的时间序列数据,则这个时间戳不会存在。那么在图表中看到的数据都是在当前时刻5分钟前的数据

  • 避免慢查询和过载 若是一个查询须要操做很是大的数据量,图表绘制极可能会超时,或者服务器负载太高。因此对于一个选择器指标来讲须要尽量的精确度。简而言之就是要尽量经过label来进行标记。

关注公众号:码农小胖哥,获取更多资讯

相关文章
相关标签/搜索