Prometheus(二)监控基础和指标

监控机制和指标

监控机制

监控的方法是多种多样的,实际上,你可以说从单元测试到检查清单(checklist)的所有事情都是监控的某种形式。

但是传统上,监控的定义侧重于检查和测量应用程序的状态

探针和内省

监控应用程序主要有两种方法:探针(probing)和内省(introspection)。

**探针监控是在应用程序的外部,它查询应用程序的外部特征:监听端口是否有响应并返回正确的数据或状态码。**探针监控的一个例子是执行ICMP检查并确认可以收到响应。Nagios就是一个主要基于探针监控的监控系统。

**内省监控主要查看应用程序内部的内容。**应用程序经过检测,并返回其状态、内部组件,或者事务和事件性能的度量。这些数据可准确显示应用程序的运行方式,而不仅是其可用性或其表面行为。内省监控可以直接将事件、日志和指标发送到监控工具,也可以将信息发送给状态或健康检查接口,然后由监控工具收集。

这并不是说探针监控没有作用了,了解应用程序的外部状态通常很有用,特别是如果应用程序由第三方提供,并且你没有深入了解其内部操作的时候。从外部查看应用程序以了解某些网络、安全性或可用性问题通常也很有帮助。通常建议对安全网络进行探针监控以发现问题,然后使用内省监控进行报告和诊断。

拉去和推送

目前有两种执行监控检查的方式,分别是拉取(pull)和推送(push),这里我们简单讨论一下。

基于拉取的监控方式会提取或检查远程应用程序——例如包含指标的端点,或是探针监控中使用ICMP进行的检查。

在基于推送的监控方式中,应用程序发送事件给监控系统接收。

这两种方法都有利有弊。关于这些优点和缺点,监控领域内部存在相当大的争议,但就许多用户而言,这些辩论没有实际意义。Prometheus主要是一个基于拉取的系统,但它也支持接收推送到网关的事件。

监控数据的类型

监控工具可以收集各种不同类型的数据,这些数据主要有两种形式:

  • 指标:大多数现代监控工具都非常依赖指标来帮助我们了解系统的情况。指标存储为时间序列数据,用于记录应用程序度量的状态,我们很快就会看到更多相关内容。
  • 日志: 日志是从应用程序发出的(通常是文本的)事件。虽然有助于让你知道发生了什么,但它们通常对故障诊断和调查最有帮助。

Prometheus主要关注收集时间序列数据。

指标

指标似乎始终是任何监控体系结构中最直接的部分。然而,有时候我们并没有投入足够的时间来理解我们正在收集的内容,为什么要收集它们,以及我们对这些指标做了些什么。

许多监控框架的重点都是故障检测,即检测是否发生了特定的系统事件或处于什么状态(这是Nagios的风格)。当收到有关特定系统事件的通知时,我们通常会查看收集到的任何指标,以找出发生的确切情况及其原因。在这个思路下,指标被视为故障检测的副产品或者补充。

Prometheus改变了“指标作为补充”的观念,指标变成了监控工作流程中最重要的部分。Prometheus颠覆了以故障检测为中心的模型,指标用来反映环境的状态、可用性以及性能。

正确使用指标可以提供基础设施的动态实时信息,帮助你管理和做出有关系统的最佳决策。此外,通过异常检测和模式分析,指标有可能在故障或问题发生之前,或者是在特定系统事件导致系统瘫痪之前就有所察觉。

什么是指标

指标是软件或硬件组件属性的度量。为了使指标有价值,我们会跟踪其状态,通常记录一段时间内的数据点。这些数据点称为观察点(observation),观察点通常包括值、时间戳,有时也涵盖描述观察点的一系列属性(如源或标签)。观察的集合称为时间序列。

时间序列数据的典型示例是网站访问或点击。我们定期收集有关网站点击量的观察点,记录点击次数和查看次数。我们还可能收集诸如访问来源、被访问到的服务器或其他各种信息等的属性。

我们通常以固定的时间间隔收集数据,该时间间隔被称为颗粒度(granularity)或分辨率(resolution),取值可以从1秒到5分钟,甚至到60分钟或更长。正确地选择指标的颗粒度至关重要,若选择得太粗糙,则很容易错过某些细节。例如,以5分钟为间隔对CPU或内存使用情况进行采样,几乎不可能识别出数据中的异常情况。另外,如果颗粒度过于精细,则需要存储和分析大量数据。

时间序列数据是这些观察点按时间顺序排列的集合。时间序列指标通常被可视化为二维图形,其中x轴是时间,y轴是具体的数据值。通常,你会在y轴上看到多个数据值——例如,来自多个主机的CPU使用率值,或者成功和失败的事务。

在这里插入图片描述

这些图形非常有用,它们提供了相对容易理解的关键数据的直观展示,比使用列表形式的相同数据更加有效。图形还向我们展示了正在监控的任何历史节点,包括发生变化的内容和时间。我们可以使用这些功能来了解系统中发生的事情及其对应的时间。

指标类型

测量型

第一种指标类型是测量型(gauge),这种类型是上下增减的数字,本质上是特定度量的快照。常见的监控指标如CPU、内存和磁盘使用率等都属于这个类型。对于业务指标来说,指标可能是网站上的客户数量。

在这里插入图片描述

计数型

第二种类型是计数型(counter),这种类型是随着时间增加而不会减少的数字。虽然它们永远不会减少,但有时可以将其重置为零并再次开始递增。应用程序和基础设施的计数型示例包括系统正常运行时间、设备收发包的字节数或登录次数。业务方便的示例可能是一个月内的销售数量或应用程序收到的订单数量。

在这里插入图片描述

计数型指标的一个优势在于它们可以让你计算变化率。每个观察到的数值都是在一个时刻:t,你可以使用t+1处的值减去t处的值,以获得两个值之间的变化率。通过了解两个值之间的变化率,可以理解许多有用的信息。例如登录次数指标,你可以通过计算变化率来查看每秒的登录次数,这有助于确定网站这段时间的受欢迎程度。

直方图

直方图(histogram)是对观察点进行采样的指标类型,可以展现数据集的频率分布。将数据分组在一起并以这样的方式显示,这个被称为“分箱”(binning)的过程可以直观地查看数值的相对大小。统计每个观察点并将其放入不同的桶中,这样可以产生多个指标:每个桶一个,加上所有值的总和以及计数。

指标摘要

通常来说,单个指标对我们价值很小,往往需要联合并可视化多个指标,这其中需要应用一些数学变换。

例如,我们可能会将统计函数应用于指标或指标组,一些可能应用的常见函数包括:

  • 计数:计算特定时间间隔内的观察点数。
  • 求和:将特定时间间隔内所有观察点的值累计相加。
  • 平均值:提供特定时间间隔内所有值的平均值。
  • 中间数:数值的几何中点,正好50%的数值位于它前面,而另外50%则位于它后面。
  • 百分位数:度量占总数特定百分比的观察点的值。
  • 标准差:显示指标分布中与平均值的标准差,这可以测量出数据集的差异程度。标准差为0表示数据都等于平均值,较高的标准差意味着数据分布的范围很广。
  • 变化率:显示时间序列中数据之间的变化程度。

指标聚合

除了上述的指标摘要外,你可能经常希望能看到来自多个源的指标的聚合视图,例如所有应用程序服务器的磁盘空间使用情况。指标聚合最典型的样式就是在一张图上显示多个指标,这有助于你识别环境的发展趋势。例如,负载均衡器中的间歇性故障可能导致多个服务器的Web流量下降,这通常比通过查看每个单独的指标更容易发现。
在这里插入图片描述

从图中可以看到30天内多个主机的磁盘使用情况,它为我们提供了一种快速确定某组主机的当前状态(和变化率)的方法。最终,你会发现单一指标和聚合指标的组合可以提供最佳的健康视图:前者可深入到某个特定问题,而后者可以查看更高阶的状态。