一.Prometheus了解
1.Prometheus 简单介绍
Prometheus 是一个开源的系统监控和报警工具包,最初建立在 SoundCloud 之上。自 2012 年成立以来,许多公司和组织都采用了 Prometheus,它拥有非常活跃的开发者和用户社区。现在是一个独立的开源项目,独立于任何公司进行维护。为了强调这一点并明确项目的治理结构,Prometheus 于 2016 年加入云原生计算基金会,作为继 Kubernetes 之后的第二个托管项目。
Prometheus 将其指标收集并存储为时序数据,即指标信息与记录它的时间戳以及一个称为标签的可选键值对一起存储。
2.Prometheus功能
1)由指标名称和键值对标签标识的时间序列组成的多维数据模型。
2)PromQL,一种强大的查询语言。
3)独立于分布式存储,单个服务节点具有自治权。
4)时序数据由服务器通过HTTP协议主动拉取。
5)中间网关用于推送时序数据。
6)通过服务发现或静态配置文件发现目标。
7)支持多种类型的图标和仪表板
3.Prometheus优势
1)易于管理:
Prometheus核心部分只有一个单独的二进制文件,不存在任何的第三方依赖(数据库,缓存等等);
唯一需要的就是本地磁盘,因此不会有潜在级联故障的风险。
2)强大的查询语言 PromQL:
Prometheus 内置一个强大的数据查询语言 PromQL,通过 PromQL 可以实现对监控数据的查询、聚合。
同时 PromQL 也被应用于数据可视化(如 Grafana)以及告警中。
3)高效:
对于监控系统而言,大量的监控任务必然导致有大量的数据产生。而 Prometheus 可以高效的处理这些数据。
4)可扩展:
Prometheus 支持联邦集群,可以让多个 Prometheus 实例产生一个逻辑集群;
当单实例 Prometheus 处理的任务量过大时,通过使用功能分区(sharding)+ 联邦集群(federation)可以对其进行扩展。
5)易于集成:
目前官网提供了多种语言的客户端 SDK,基于这些 SDK 可以快速让应用程序纳入到监控系统中,同时还支持与其它的监控系统集成。
6)可视化:
Prometheus Server 自带一个 UI,通过这个 UI 可以方便对数据进行查询和图形化展示;
同时还可以对接 Grafana 可视化工具展示精美监控指标。
二.Prometheus 基础架构
架构图如上图,Prometheus 主要由以下部分组成:
Prometheus:主要是负责存储、抓取、聚合、查询方面。
Alertemanager:主要是负责实现报警功能。
Pushgateway:主要是实现接收有 Client-push 过来的指标数据,在指定的时间间隔,有主程序来抓取。
*_exporter:主要是负责采集物理机、中间件的信息。
1.Prometheus数据模型
Prometheus收集的所有监控数据都以指标(Metric)的形式存储在内置的时序数据库(TSDB)中,属于相同的指标名称、相同的标签集和时间戳数据流。除了存储的时间序列,Prometheus 还可以根据查询请求生成临时的和派生的时间序列作为返回结果。
2.如何采集监控数据
要采集目标(主机或服务)的监控数据,首先就要在被采集目标上安装采集组件,这种采集组件被称为Exporter。prometheus.io官网上有很多这种exporter,比如:
Consul exporter (official)
Memcached exporter (official)
MySQL server exporter (official)
Node/system metrics exporter (official)
HAProxy exporter (official)
RabbitMQ exporter
Grok exporter
InfluxDB exporter (official)
这些exporter能采集目标的监控数据,然后传输给prometheus。这时候,exporter会暴露一个http接口,prometheus通过HTTP协议使用Pull的方式周期性拉取相应的数据。
不过,prometheus也提供了Push模式来进行数据传输,通过增加Push Gateway这个中间商实现,可以将数据推送到Push Gateway,prometheus再通过Pull的方式从Push Gateway获取数据。
这就是为什么从架构图里能看到两个 Pull metrics 的原因,一个是采集器直接被Server拉取数据(pull);另一个是采集器主动Push数据到Push Gateway,Server再对Push Gateway主动拉取数据(pull)。
3.采集数据的主要流程如下:
1)Prometheus server 定期从静态配置的主机或服务发现的 targets 拉取数据(zookeeper,consul,DNS SRV Lookup等方式)
2.)当新拉取的数据大于配置内存缓存区的时候,Prometheus会将数据持久化到磁盘,也可以远程持久化到云端。
3.) Prometheus通过PromQL、API、Console和其他可视化组件如Grafana、Promdash展示数据。
4. )Prometheus 可以配置rules,然后定时查询数据,当条件触发的时候,会将告警推送到配置的Alertmanager。
5. )Alertmanager收到告警的时候,会根据配置,聚合,去重,降噪,最后发出警告。
三.采集的数据结构和指标类型
3.1数据结构说明
数据结构说明Key是指标名字,Value是该指标的值,此外Metadata(元信息)也非常重要,也可称之为labels(标签信息)。这些标签信息指定了当前这个值属于哪个云区域下的哪台机器,如果没有labels,数据有可能会被丢失。
3.1.1指标名称:
每个时间序列都由指标名称和一组标签(键值对)唯一标识。指标名称可以反映被监控样本的含义(例如cpu_usage 14.04 表示使用当前系统cpu'使用)。指标名称只能由 ASCII 字符、数字、下划线和冒号组成,并且必须匹配正表达式 [a-za-z:] [a-za-z0-9:] *。其中正则表达式中的冒号用于标识用户定义的记录规则。监控对象直接暴露的exporter或指标中不能使用冒号来定义指标名称。
3.1.2 标签
Prometheus 通过标签开启了强大的多维数据模型:对于相同的指标名称,通过不同标签列表的集合(例如,所有的计量名称为 /api/tracks 且标签为methodu003d,POST 将形成特定的 http 请求)。查询语言过滤和聚合这些指标和标签列表。更改任何指标上的任何标签值(包括添加或删除指标)将创建一个新的时间序列。
标签名称只能由 ASCII 字符、数字和下划线组成,并且满足正则表达式 [a-za-z] [a-za-z0-9] *。其中__标签作为前缀是系统暴露出来的关键字,只能在系统内部使用。标记的值可以包含任何 Unicode 编码字符
3.1.3 时间序列表达式
时间系统中的每个点称为一个样本。样本由以下三部分组成:
metric:描述当前样本特征的指标名称和标签集;
Timestamp:精确到毫秒的时间戳;
样本值:一个folat64浮点数据代表当前样本的值。
样本值的表示:
<指标名称>{<标签名称>u003d<标签值>, ...}
3.2 指标类型
Prometheus的监控指标有4种基本类型:
1.) Counter(计数器):
计数器是我们最简单的指标类型。比如你想统计某个网站的HTTP错误总数,这时候就用计数器。
计数器的值只能增加或重置为0,因此特别适合计算某个时段上某个时间的发生次数,即指标随时间演变发生的变化。
2.)Gauges
Gauges可以用于处理随时间增加或减少的指标,比如内存变化、温度变化。
这可能是最常见的指标类型,不过它也有一定缺点:如果系统每5秒发送一次指标,Prometheus服务每15秒抓取一次数据,那么这期间可能会丢失一些指标,如果基于这些数据做汇总分析计算,则结果的准确性会有所下滑。
3.)Histogram(直方图)
直方图是一种更复杂的度量标准类型。指标提供了额外信息,例如观察值的总和及其数量,常用于跟踪事件发生的规模。
比如:
在大多数情况下,人们倾向于使用一些量化指标的平均值,例如 CPU 的平均利用率和页面的平均响应时间。这种方法的问题是显而易见的。以系统API调用的平均响应时间为例:如果大部分API请求保持在100ms的响应时间范围内,个别请求的响应时间需要5s,则部分WEB页面的响应时间会下降到中位数,这种现象被称为长尾问题。
为了区分平均慢和长尾慢,最简单的方法是根据请求延迟的范围进行分组。例如,统计延迟在 0 到 10ms 之间的请求数和延迟在 10 到 20ms 之间的请求数。这样,我们就可以快速分析出系统速度慢的原因。直方图和摘要旨在解决此类问题。通过直方图和Summary监控指标,我们可以快速了解监控样本的分布情况。
3.1)直方图样本提供三个指标(假设指标名称为<basename>):
Bucket中分布的样本值个数,命名为<basename>_ Bucket {Le "< upper boundary >"}。解释更容易理解。该值表示索引值小于等于上边界所有样本的个数。
3.2)所有样本值大小的总和,命名为<basename>_sum。
取值可以理解为数据指标值字段的划分。划分依据应基于数据值的分布。注意后面的采样点包括前面的采样点,假设xxx_bucket{...,le "0.01"}的值为10,XXX_bucket的值{..., Le "0.05" }为30,表示30个采样点中有10个采样点小于10ms,其他20个采样点的响应时间在10ms到50ms之间。
3.3)可以通过histogram_quantile() 函数来计算直方图类型样本的个数分位数。分位数可能不容易理解。可以将其理解为分割数据的点。让我举个例子。假设样本第9个分位数(quantile 0.9)的值为x,即小于x的采样值个数占总采样值的90%。直方图还可用于计算应用程序性能指标值(Apdex score)。
4.)Summary(摘要)
用于表示一段时间内的数据采样结果(通常是请求时长或响应大小等),但它直接存储分位数(由客户端计算后显示),而不是通过获取来计算
4.1)摘要样本还提供了三个指标(假设指标名称为<basename>):
样本值的分位数分布,命名为<basename> {quantile "<φ>"}。
所有样本值大小的总和,命名为<basename>_sum
样本总数,命名为<basename>_count。
Histogram 和 Summary 的异同:
两者都包含<basename>_sum和<basename>_countindicators
直方图需要通过<basename_bucket>计算分位数,而Summary直接存储分位数值。
5.实例概念
使用Prometheus语言,单个Web服务器单元称为实例(主机实例)。该任务是计算所有实例的HTTP错误数量
实例事实上,这甚至可以说是上图是最简单的架构了,再复杂一点,实例不仅能是主机实例,还能是服务实例,因此需要增加一个instance_type的标签标记主机或服务。
再复杂一点,同样的IP,可能存在于不同云区域下,这属于不同的机器,因此还需要一个cloud标签,最终该数据结构可能会变为:
cpu_usage {job=”1″, instance=”128.0.0.1″, cloud=”0″, instance_type=”0″}
6.数据可视化
如果使用过基于InfluxDB的数据库,可能会熟悉InfluxQL。Prometheus也内置了自己的SQL查询语言用于查询和检索数据,这个内置的语言就是PromQL。
前面说过,Prometheus的数据是用键值对表示的。PromQL也用相同的语法查询和返回结果集。
PromQL会处理两种向量:
即时向量:表示当前时间,某个指标的数据向量。
时间范围向量:表示过去某时间范围内,某个指标的数据向量。
针对8核CPU的使用率Grafana是一个大型可视化系统,功能强大,可以创建自己的自定义面板,支持多种数据来源,当然也支持Prometheus。
通过配置数据源,Grafana会使用相应的SQL拉取并绘制图表,能直接看到Prometheus的各个指标数据图表.
图例
网友评论