使用 InfluxDB 清洗和解释时间序列指标

导航至

本文最初发表于 The New Stack,经许可在此转载。

了解如何通过浏览器和 Visual Studio 使用 Flux 进行数据清洗和分析。

时间序列数据是您想要随时间分析监控的数据。例如,您可能想知道植物一天中的水位变化,或者它接收到多少阳光以及何时接收。这是一个简单但易于理解的示例。显然,在更大的规模上,风险可能会更高。您可能正在监控数据中心中的服务器基础设施或工厂车间机器的压力。

在这些时候,故障和实时反应可能极其重要,以避免紧急情况。时间序列数据通常是指标,通常来自物联网设备或服务器基础设施。

指标通常是以恒定流到达的数据,每秒一个值,但有时它可能更随机。原始时间序列指标数据可以从清理和标准化中受益,然后再将其公开以供更广泛的使用和存储。在处理大量时间序列指标时,标准化其他人搜索特定时间范围数据的方式(使用易于理解的标签)可能会有所帮助。时间序列指标有很多类型,但在这篇博文中,我们将重点关注来自我们的内部存储引擎的指标,这些指标由我们的站点可靠性工程师 (SRE) 之一提供。

physica-vs-virtual

在本教程中,我将使用 InfluxDB 的时间序列数据平台。InfluxDB 的核心是一个高性能时间序列数据库,非常适合处理每秒数百万的数据,但它也附带数据收集器和脚本语言。本次技术会议的重点是使用 Flux,这是一种 InfluxDB 使用的数据处理和查询语言。Flux 具有许多像 SQL 这样的查询语言的功能,但它也预先构建了分析和数据科学功能。稍后,我们还将使用 Flux 来创建警报和降采样任务。未来,我们还将包含 SQL 集成,这将为查询数据提供一种新方式。

Flux 已经内置于 Influx 中,因此无需额外安装。将演示如何通过浏览器和 Visual Studio 利用 Flux 进行数据清理和分析的示例。您可以在此处查看 Visual Studio 扩展以获取更多详细信息。但您也可以使用命令行或云 UI 与您的数据进行交互。

flux

我们将从一个简单的 Flux 查询开始,以更熟悉 Flux 的编写和工作方式。您的存储桶是您的数据库名称。每个存储桶都可以自定义其接受的数据以及保留该数据的时间长度。首先注意 range() 函数。由于这种语言用于时间序列,因此逻辑上我们需要查询来自时间范围内的数据。在本例中,我们的范围约为 20 秒(从开始时间和停止时间)。您可以选择不设置范围,但这将返回存储桶中的所有数据。

这是来自我们名为“node_points_total”的测量的数据。它有一组计数器,每次写入点时,计数器都会递增。如果是“好”点,“ok”会递增;如果是“坏”点,则相应的点会递增。这里我们计算的是成功写入的点总数。该函数的顶部是筛选到我们想要监控的特定节点和主机。我们搜索具有四种状态(ok、denied、error 和 dropped)的点。然后我们透视数据,并使用 map() 函数计算 ok 的百分比。map() 函数生成一个“良好百分比”数字,这将允许您说“写入的所有点中有 99.98% 是 OK 的”。

import-universe

这是查询运行的结果。如您所见,我们正在可视化结果。

singlge percent

下一个示例将使用更大的范围,四天的数据。这很多!我们正在使用 aggregateWindow(),它将为我们提供每小时值的总和(我们将返回 96 个结果,过去四天每小时一个结果)。这不仅是一个更快的查询,而且如果我们要在表中查看数据结果,那么读取 96 个结果而不是 200 万个结果也会更容易!

import-universe-2

这是最后一个绘制的查询图。在这里,我们看到几天内“ok”写入略有下降,降至 99.88%。我们的云服务级别协议 (SLA) 是每月 99.9% 的可用性。但这只是一个特定日子的示例,该日子发生了一起小事件。总的来说,我们仍然达到了我们的 SLA 目标,但即使是轻微的下降也值得注意。这使我们的 SRE 团队能够在需要时采取行动。

Percent Ok over time with aggregateWindow

以下 Flux 是我们称之为降采样的简化版本。降采样是将原始高精度数据降低到低精度聚合的过程。我们将 aggregateWindow() 函数to() 函数结合使用,将降采样数据写入新的存储桶。在本例中,我们获取每 10 分钟间隔数据的平均值,并将该数据点存储在新存储桶中。

这可以帮助解决三个问题

  1. 更轻松地对较小的数据集运行分析,并从历史数据中获得高级见解。
  2. 清理错误数据。
  3. 长期存储较小的数据集,并在保留数据整体形状的同时减小整体实例大小。

new bucket

最后,我们将看看如何对我们的数据集发出警报。第一部分都是关于筛选到我们想要监控的字段。我们特别想筛选“ok”状态。

alerting on our data set

我们正在使用 quantile 函数来确定值何时超出第 95 个百分位数 (95p)。我们的分位数压缩中的压缩是我们希望在确定 95p 时数据有多详细。压缩越大,计算所需的时间就越长。您可以在文档中找到有关如何设置分位数函数的更多信息。

此代码正在检查该值,并将类型和级别设置为“critical”或“info”。从那里,我们还创建了一条 Slack 消息,如果状态类型为“critical”,则发送警报。我们这里有一个正在调用的警报函数,但没有必要深入研究它。底线是您可以使用 Flux 构建这些警报任务,并在您的数据超出定义的边界或正常运行时接收警报。要了解有关使用 Flux 创建警报和通知的更多信息,请查看以下文档

creating alerts and notifications with Flux

这些只是使用 InfluxDB 清洗和解释时间序列指标的一些更简单的功能。我们有大量的 Flux 文档和示例供您参考,具体取决于您的用例和需求。我们很乐意看到人们在我们的 开源社区中构建的内容,并期待在我们的社区论坛和 Slack 频道中与您联系,看看您构建了哪些令人惊叹的项目!