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

导航至

本文最初发布于 The New Stack,并经授权在此重发。

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

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

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

指标通常是数据以恒定流的形式到达,每秒一个值,但有时它可能更加随机。原始时间序列指标数据在用于更广泛的使用和存储之前,可以从清洗和标准化中受益。在处理大量时间序列指标时,标准化搜索特定时间段的标签可以帮助他人更容易地搜索数据。有许多类型的时间序列指标,但在这篇博客文章中,我们将重点介绍来自我们内部存储引擎的指标,由我们的一个站点可靠性工程师(SRE)提供。

physica-vs-virtual

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

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

flux

我们将从简单的Flux查询开始,以便更熟悉Flux的编写和工作方式。您的桶是数据库名称。每个桶都可以根据它接受的数据和保留数据的时间长度进行自定义。首先注意range()函数。由于这种语言是针对时间序列的,从逻辑上讲,我们需要查询时间范围内的数据。在这个例子中,我们的范围大约是20秒(从开始和结束时间)。您可以选择没有范围,但这样将返回桶中的所有数据。

这是我们称为“node_points_total”的测量数据。它有一组计数器,每当一个点被写入时,计数器就会增加。如果是好的点,“ok”就会增加;如果是“坏”点,相应的点就会增加。在这里,我们正在计算成功写入的点总数。函数的顶部正在筛选到我们想要监控的特定节点和主机。我们搜索具有四种状态(ok、拒绝、错误和丢弃)的点。然后我们使用map()函数对数据进行转换并计算ok的百分比。map()函数生成一个“好的百分比”数字,这允许您说“99.98%的所有写入点都是OK。”

import-universe

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

singlge percent

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

import-universe-2

这是最后一个绘制的查询图。这里我们看到在几天的范围内,99.88%的“ok”写入有小幅下降。我们的云服务级别协议(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

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

此代码正在检查该值,并将类型和级别设置为“关键”或“信息”。从那里,我们还创建了一条Slack消息,如果状态类型为“关键”,则会发送警报。这里有一个警报函数正在被调用,但不需要深入了解。总之,您可以使用Flux构建这些警报任务,并在数据超出定义的边界或表现良好时接收警报。要了解有关使用Flux创建警报和通知的更多信息,请参阅以下文档

creating alerts and notifications with Flux

这些只是InfluxDB中清理和解释时间序列度量的一些简单功能。我们拥有大量Flux文档和示例,您可以根据您的用例和需求进行参考。我们喜欢看到人们在我们的开源社区中构建的内容,并期待在社区论坛和Slack频道中与您交流,看看您会构建哪些令人惊叹的项目!