TL;DR InfluxDB 技术提示 — 监控任务和查找失控基数的来源

导航至

假设您正在使用 InfluxDB Cloud,并且正在向您的帐户写入数百万个指标。您还在运行各种下采样和数据转换任务。无论您是在 InfluxDB 之上构建 IoT 应用程序,还是使用 InfluxDB 监控您的生产环境,您的时间序列操作最终都运行顺利。您希望保持这种状态。您可能是 免费计划 Cloud 用户按用量付费计划用户,但无论哪种方式,您都需要了解实例大小的可见性,以管理资源和成本。使用 InfluxDB 运维监控模板 来防止失控序列基数,并确保您的任务成功执行。

什么是运维监控模板?

如果您是 InfluxData 的新手,InfluxDB 模板 是仪表板、任务、警报、Telegraf 配置等的预配置和可共享集合。您可以通过从 社区模板 中复制感兴趣的模板的 URL 并将其粘贴到 UI 中来应用它们。今天,我们将应用运维监控模板到我们的 InfluxDB Cloud 帐户,以监控我们的基数和任务执行。

Operational Monitoring Template - Settings<figcaption> 如何通过 UI 应用模板的示例。导航到“设置”页面上的“模板”选项卡,并将您要应用的模板的 YAML 或 JSON 链接粘贴到此处。</figcaption>

运维监控模板包含以下资源

    • 1 个 存储桶 (Bucket):基数 (cardinality)
    • 1 个 任务 (Task):cardinality_by_bucket,每小时运行一次。此任务负责计算您所有存储桶的基数,并将计算结果写入 cardinality 存储桶。
    • 1 个 标签 (Label):operational_monitoring。此标签可帮助您在 UI 中更轻松地找到属于此模板的资源。
    • 2 个 变量 (Variables):bucket 和 measurement。
    • 2 个 仪表板 (Dashboards)
      • 任务摘要仪表板 (Task Summary Dashboard)。此仪表板显示有关您的任务运行、成功和失败的信息。
      • 基数浏览器 (Cardinality Explorer)。此仪表板可帮助您可视化所有存储桶的序列基数。深入查看您的 measurement 基数,以 解决您的失控基数 问题。

任务摘要仪表板如何帮助我?

任务摘要仪表板和基数浏览器仪表板都可用于监控您的特定任务执行状态和序列增长。任务摘要仪表板如下所示

Task Summary dashboard<figcaption> 任务摘要仪表板的示例。它提供过去一小时的任务运行成功信息,时间范围由时间范围下拉配置(粉红色方框)控制。</figcaption>

此仪表板的前三个单元格允许您轻松评估指定时间范围内所有任务的成功情况。从此屏幕截图我们可以看到我们有 80 个失败的任务运行。第二行的单元格允许我们轻松地按时间范围内每个任务的最成功和最失败运行进行排序。它为我们提供了错误率和任务 ID。

Task Summary Dashboard<figcaption> 任务摘要仪表板的更多信息。它提供过去一小时的任务运行成功信息。</figcaption>

仪表板还包括一个错误列表单元格 (Error List cell)。此单元格包含有关所有失败运行的信息,以及每个 runID 的单独 errorMessages。您可以使用此单元格来确定任务失败的原因。“错误率随时间变化 (Error Rates Over Time)”下方的内容允许您轻松确定失败任务的数量是否在增加。线性线表示同一组任务正在失败,而指数线则表明越来越多的任务正在失败。

Task Summary Dashboard - Last Successful Run Per Task<figcaption> 任务摘要仪表板的更多信息。它提供过去一小时的任务运行成功信息。</figcaption>

任务摘要仪表板的最后一个单元格“每个任务的最后一次成功运行 (Last Successful Run Per Task)”可帮助您识别任务何时失败,以便您可以更轻松地调试任务。现在我们已经回顾了任务摘要仪表板的功能,让我们检查一下基数浏览器仪表板。

使用您自己的任务警报补充模板

如果您正在运行对您的时间序列用例至关重要的任务,我建议设置警报以监控这些任务何时失败。使用任务摘要仪表板来帮助您找到与您要发出警报的任务关联的 taskID。现在我们需要将我们的状态转换为数值,以便为失败的任务创建阈值警报。接下来,导航到数据浏览器 (Data Explorer)。使用 map() 函数使用以下 Flux 脚本将状态转换为布尔值

from(bucket: "_tasks")
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
|> filter(fn: (r) => r["taskID"] == "05ff8e19b32dc000")
|> map(fn: (r) => ({ r with status_bool: if r.status == "success" then 1 else 0}))

单击“另存为 (Save As)”按钮,将其转换为 警报 (Alert)。然后创建一个阈值警报,并在 status_bool 的值低于 1 时发出警报。

Creating Alerts

有关创建警报的更多信息,请参阅下面的“使用您自己的基数警报补充模板”部分,或 使用任务和检查进行 InfluxDB 监控。 

基数浏览器仪表板如何帮助我?

基数浏览器仪表板提供您的 InfluxDB 实例中每个存储桶的基数。

Cardinality Explorer Dashboard<figcaption> 基数浏览器仪表板的示例。它提供有关您的 InfluxDB 实例基数的信息。标签允许您使用下拉配置(橙色)可视化指标。</figcaption>

仪表板顶部的变量允许您轻松地在存储桶和 measurement 之间切换。

  • 第一个单元格“按存储桶划分的基数 (Cardinality by Bucket)”中的图表允许您一目了然地监控所有存储桶的基数。我们可以看到我们的基数保持在相同的范围内。所有存储桶的基数都具有较小的标准偏差这一事实是一个好迹象。它使我们能够验证我们没有序列基数问题。在存储桶之上创建 其他警报 以在您的基数超过预期标准偏差时通知您可能是有利的。基数的下降可能是数据成功过期或可能 数据删除 的证据。基数的峰值可能是由于新摄取的数据和即将被驱逐的旧数据之间的瞬时重叠造成的。峰值也很可能是由于重要事件造成的。

Top Buckets

  • 第二个单元格“顶部存储桶 (Top Buckets)”提供最大存储桶及其基数的表格视图。
  • 第三个单元格“按 Measurement 划分的基数 (Cardinality by Measurement)”允许您深入查看每个存储桶的特定 measurement,由存储桶和 measurement 变量选择。如果您遇到失控序列基数,这将特别有助于查找其来源。
  • 使用最后一个单元格(未图示)“按标签划分的基数 (Cardinality by Tag)”来查找无界标签。值得注意的是,执行这些计算的 Flux 脚本非常巧妙。

在下一节中,我们将了解 cardinality_by_bucket 任务的工作原理,以帮助我们理解这些单元格如何生成此基数数据,因为查询遵循与任务相同的逻辑。

基数任务如何工作?

基数任务 cardinality_by_bucket 包含以下 Flux 代码

import "influxdata/influxdb"
        buckets()
        	|> map(fn: (r) => {
        		cardinality = influxdb.cardinality(bucket: r.name, start: -task.every)
        			|> findRecord(idx: 0, fn: (key) =>
        				(true))
        		return {
        			_time: now(),
        			_measurement: "buckets",
        			bucket: r.name,
        			_field: "cardinality",
        			_value: cardinality._value,
        		}
        	})
        	|> to(bucket: "cardinality")

Flux influxdata/influxdb 包目前包含一个 Flux 函数 influxdb.cardinality()。此函数返回特定存储桶中数据的序列基数。buckets() 函数返回存储桶列表。map() 函数在此处有效地“迭代”存储桶名称列表。它在 自定义函数 cardinality 中使用 findRecord(),以返回每个存储桶的序列基数。return 语句创建一个新表,其中包含字段键的相应  r.name 和字段值的 cardinality._value 。然后将此数据写入我们的“cardinality”存储桶。

如果您想了解有关 findRecord() 函数的更多详细信息,请参阅 如何使用 Flux 和 InfluxDB 提取值、可视化标量并执行自定义聚合

使用您自己的基数警报补充模板

为了充分利用此模板,我建议根据基数存储桶设置基数阈值警报。创建警报的最快方法是通过 UI。导航到 UI 中的“警报 (Alerts)”选项卡。首先查询您的基数。虽然在图表可视化中很难可视化我们的基数数据(警报 (Alerts) UI 的默认可视化类型),但我可以将鼠标悬停在点上或在“原始数据视图 (Raw Data View)”中查看数据以更好地理解我的数据。

Cardinality Alerts

我注意到我的基数数据可以大致分为三个范围。接下来,我将围绕这些范围配置警报。如果我的存储桶中的基数跨越这三个阈值之一,我将收到警报。

Cardinality Alert dashboard

这种类型的警报可以帮助您防止达到 InfluxDB Cloud 中的基数限制。具体来说,免费层和按用量付费计划用户希望在其基数限制分别接近 10,000 和初始基数限制 100 万的 80% 时收到警报。您还可以考虑创建一个任务,该任务对所有存储桶的基数求和,并对总基数发出警报。

如果您注意到您的基数显着增长,您可以决定是否需要请求更高的基数限制,或者是否需要对历史数据进行下采样。要请求更高的基数限制,请单击 InfluxDB UI 右上角的“立即升级 (Upgrade Now)”按钮。

请查看 解决失控序列基数InfluxDB 架构设计和数据布局文档 以及 InfluxDB 的数据布局和架构设计最佳实践,以获取有关管理基数和最佳架构设计的更多信息。

如果您想了解有关使用 UI 创建警报的信息,请参阅 使用任务和检查进行监控 与 InfluxDB 和 如何使用 InfluxDB 监控状态

顺便说一句,如果您有兴趣了解为什么基数不会成为未来 InfluxDB 用户关注的重点,我建议您阅读 宣布 InfluxDB IOx – 使用 Rust 和 Arrow 构建的 InfluxDB 未来核心

关于 InfluxDB 运维监控模板的最终想法

请注意,在 cardinality_by_bucket 任务运行之前,基数浏览器仪表板将为空。它以 1 小时的间隔运行,因此可能需要一段时间才能使该仪表板填充有意义的数据。但是,如果您需要立即可视化您的基数数据,您可以重新调整 cardinality_by_bucket 任务中的脚本的用途,并选择您希望从中收集基数数据的时间范围。然后,如果您愿意,可以使用 to() 函数将基数数据写入基数存储桶。使用 subDuration() 函数创建正确的时间戳。

import "influxdata/influxdb"
import "experimental"

time = experimental.subDuration(
  d: 7d,
  from: now(),
)
buckets()
	|> map(fn: (r) => {
		cardinality = influxdb.cardinality(bucket: r.name, start: -7d)
			|> findRecord(idx: 0, fn: (key) =>
				(true))
		return {
			_time: time,
			_measurement: "buckets",
			bucket: r.name,
			_field: "cardinality",
			_value: cardinality._value,
		}
	})

我希望这篇 InfluxDB 技术技巧博文能够为您提供高效监控 InfluxDB Cloud 实例、成功执行时间序列操作以及控制成本的工具。如果您计划使用运维指标模板,请向我们寻求帮助并分享您的故事!请在评论区、我们的社区网站或我们的 Slack 频道分享您的想法、疑虑或问题。我们很乐意获得您的反馈并帮助您解决遇到的任何问题!特别感谢 @nathanielc@aanthony1243 为此模板贡献了两个仪表板。