TL;DR InfluxDB技术技巧——使用和理解InfluxDB Cloud使用模板

导航到

因此,您正在使用InfluxDB Cloud,并将数百万个指标写入您的账户。无论是基于InfluxDB构建IoT应用程序还是使用InfluxDB监控生产环境,您的时间序列操作终于运行顺畅。您想保持这种方式。您可能是一名免费计划云用户或一名基于使用量的计划用户,但无论如何,您需要了解您的实例大小以管理资源和成本。使用InfluxDB Cloud使用模板来了解您的使用情况,并在达到限制之前采取主动措施。

什么是InfluxDB Cloud使用模板?

如果您是InfluxData的新用户,InfluxDB模板 是一个预配置并可共享的仪表板、任务、警报、Telegraf配置等集合。您可以通过以下方式应用它们:1)使用CLI和influx apply命令;或2)从社区模板中复制您感兴趣的模板的URL,并将其粘贴到UI中。今天,我们将应用InfluxDB Cloud使用模板到我们的InfluxDB Cloud账户中,以监控我们的使用情况和速率限制事件。当用户超过其云账户的使用限制时,将发生速率限制事件。使用以下命令通过CLI应用InfluxDB Cloud使用模板:

influx apply --file https://raw.githubusercontent.com/influxdata/community-templates/master/usage_dashboard/usage_dashboard.yml

或者,您也可以使用UI来应用模板。导航到设置页面的模板标签页,并将要应用的模板的YAML或JSON链接粘贴进去。

Navigate to Template on Settings page

InfluxDB Cloud使用模板包含以下资源

  • 1 仪表板:使用情况仪表板。此仪表板允许您跟踪您的InfluxDB Cloud数据使用情况和限制事件。
  • 1 任务:基数限制警报(使用情况仪表板),每小时运行一次。此任务负责确定您的基数是否超过了与您的云账户关联的基数限制。
  • 1 标签:usage_dashboard。此标签帮助您在UI和API中更容易地找到属于此模板的资源。

使用情况仪表板的说明

InfluxDB Cloud使用模板包含使用情况仪表板,它使您能够了解数据输入、查询次数、存储、数据输出和速率限制事件。

The Usage Dashboard - InfluxDB Cloud Usage Template

仪表板中的单元格显示以下信息

  • 数据输入(图形)可视化通过/write端点写入到您的InfluxDB组织中的总字节数。
  • 查询次数(图形)可视化执行的查询数量。
  • 存储(按存储桶)可视化每个存储桶中的总字节数以及所有存储桶的总数。
  • 数据输出(图形)可视化通过/query端点从您的InfluxDB组织查询的总字节数。
  • 速率限制事件可视化限制被达到的次数。
  • 速率限制事件在底部右边的单元格中按事件类型分割,以显示写入限制、查询限制和基数限制事件的数量以及您组织的总基数限制。

所有这些可视化自动将数据聚合到1小时分辨率。实际上,此仪表板补充了InfluxDB UI中“使用情况”页面的数据,以为您提供更多关于使用情况的洞察。

InfluxDB UI中的使用情况页面包含关于您使用情况的一般信息。

InfluxDB UI中的使用情况页面包含关于您使用情况的一般信息。

理解使用情况仪表板背后的Flux

为了全面理解 InfluxDB Cloud 使用模板,您必须了解使用仪表板背后的 Flux。让我们看看第一个单元格中产生“数据输入(图形)”可视化的查询。

import "math"
import "experimental/usage"
 
usage.from(
start: v.timeRangeStart,
stop: v.timeRangeStop,
)
|> filter(fn: (r) =>
r._measurement == "http_request"
and (r.endpoint == "/api/v2/write" or r.endpoint == "/write")
and r._field == "req_bytes"
)
|> group()
|> keep(columns: ["_value", "_field", "_time"])
|> fill(column: "_value", value: 0)
|> map(fn: (r) =>
({r with
write_mb: math.round(x: float(v: r._value) / 10000.0) / 100.0
}))

首先,我们导入所有相关的包以执行生成我们所需可视化的 Flux 查询。Flux 数学包提供了基本数学函数和常数。Flux 实验性/使用包提供了收集与您的 InfluxDB Cloud 账户相关的使用和使用限制数据的函数。InfluxDB Cloud 使用模板中的所有单元格、仪表板和任务都使用 Flux 实验性/使用包。函数 usage.from() 返回使用数据。我们过滤出任何写入中的“req_bytes”字段的使用数据。然后我们对写入数据进行分组,用 0 填充任何空行,并计算兆字节数,将值存储在新列“write_mb”中。

探索实验性/使用 Flux 包

实验性/使用包包含两个函数:usage.from()usage.limits()

函数 usage.from() 对应于 InfluxDB v2 API 中的 org/{orgID}/usage 端点。函数 usage.from() 返回您 InfluxDB 组织的使用数据。函数 usage.from() 需要您指定 startstop 参数。默认情况下,该函数返回按小时汇总的聚合使用数据。此默认下采样使您能够有效地查询长时间段的使用数据。如果您想查看原始高分辨率数据,请查询短时间范围(几小时)并设置 raw:true。默认情况下,usage.from() 返回您当前使用的 InfluxDB Org 的使用数据。要查询外部 InfluxDB Cloud Org,请提供 hostorgIDtoken 参数。函数 usage.from() 返回具有以下模式的使用数据

  • _time: 使用事件的时刻(raw:true)或下采样使用数据(raw:false)。
  • _bucket_id: 每个存储桶特定使用的存储桶 id,如 storage_usage_bucket_bytes 测量值标签。
  • _org_id: 正在查询使用数据的组织 id 标签。
  • _endpoint: 收集使用数据的 InfluxDB v2 API 端点标签。
  • _status: HTTP 状态码标签。
  • _measurement: 测量值。
    • http_request
    • storage_usage_buckets_bytes
    • query _count
    • events
  • _field: 字段键。
    • resp_bytes: 一个响应中的字节数或 raw:true。在下采样数据中,raw:false 每个端点按小时汇总。
    • gauge: 在 _time 指示的时刻,由 _bucket_id 标签指示的存储桶中的字节数。如果您的存储桶具有无限保留策略,则从您开始向存储桶写入数据到此刻的 req_bytes 之和将等于 gauge 值。
    • req_bytes: 一个请求的字节数(raw:true)。在下采样数据中,raw:false 每个端点按小时汇总。
    • event_type_limited_cardinality: 卡inality 限制事件的次数。
    • event_type_limited_query: 查询限制事件的次数。
    • event_type_limited_write: 写入限制事件的次数。

函数 usage.limits() 对应 InfluxDB v2 API 中的 org/{orgID}/limits 端点。函数 usage.limits() 返回一个记录,具体是一个与您 InfluxDB Cloud 组织相关的使用限制的 json 对象。为了在 VS Code 或 InfluxDB UI 中返回记录,我建议使用 array.from 函数,如下所示

import "experimental/usage"
import "array"
limits = usage.limits()
array.from(rows: [{
    orgID: limits.orgID,
    wrte_rate: limits.rate.writeKBs,
    query_rate: limits.rate.readKBs,
    bucket: limits.bucket.maxBuckets,
    task: limits.maxTasks,
    dashboard: limits.dashboard.maxDashboards,
    check: limits.check.maxChecks,
    notificationRule: limits.notificationRule.maxNotifications,
}])

上面的 Flux 代码本质上使用 array.from 函数将 json 输出转换为注解 CSV。以下是一个 usage.limits() 返回的 json 对象示例,以帮助您了解嵌套 json 键的来源。

{
  orgID: "123",
  rate: {
    readKBs: 1000,
    concurrentReadRequests: 0,
    writeKBs: 17,
    concurrentWriteRequests: 0,
    cardinality: 10000
  },
  bucket: {
    maxBuckets: 2,
    maxRetentionDuration: 2592000000000000
  },
  task: {
    maxTasks: 5
  },
  dashboard: {
    maxDashboards: 5
  },
  check: {
    maxChecks: 2
  },
  notificationRule: {
    maxNotifications: 2,
    blockedNotificationRules: "comma, delimited, list"
  },
  notificationEndpoint: {
    blockedNotificationEndpoints: "comma, delimited, list"
  }
}

使用基数限制警报任务

基数限制警报任务负责确定您是否达到了或超过了您的基数限制,并将警报发送到 Slack 端点。为了使此任务功能正常并向 Slack 发送警报,您必须编辑任务并提供 webhook。您可以直接通过 UI 编辑任务,或者可以使用 CLI 和 Visual Studio 代码的 Flux 扩展。对于这个一行编辑,我建议使用 UI。

Edit Task dashboard

转到任务页面,点击基数限制警报任务进行编辑,编辑第 7 行并提供您的 Slack webhook,然后点击保存以使基数限制警报任务功能正常。

使用 CLI、Visual Studio Code 和 Flux 扩展进行 Flux 开发

InfluxDB UI 是许多初学者和中级 InfluxDB 用户的一站式商店。它简化了仪表板、笔记本、警报和任务的创建。我通常建议用户从 InfluxDB UI 开始他们的 InfluxDB 之旅,因为它提供了许多无代码或低代码解决方案,用户可以利用这些解决方案进行有意义的警报和可视化工作。然而,我建议使用 VS code 和 Flux 扩展进行复杂的 Flux 开发,原因如下

  1. 许多开发者更熟悉使用命令行和代码编辑器。
  2. 它为用户提供保存脚本并轻松查看注解 CSV 输出以及轻松查询不同组织的能力。

因此,我们将利用这个机会来强调使用 CLI 在 VS code 中编辑和更新任务的流程。

首先,使用 influx task list 命令列出您的任务以获取您的任务 ID,如下所示

./influx task list

Task ID

然后使用 jq,一个轻量级的命令行 json 解析器,以美化打印任务的 Flux,如下所示

./influx task list -i 0786fb9aa2bab000 --json | jq -r '.[].flux

Influx task list

现在将 Flux 复制并粘贴到 VS code 中,并使用 Flux 扩展更新 slackWebhook 变量以使用您的 Slack webhook。从左侧面板选择您要使用的 InfluxDB 配置和组织,右键单击以运行查询并查看左侧的输出。您会注意到输出是一个单列表,值为 0。我们将在下一节“理解基数限制警报任务背后的 Flux”中讨论此输出。

An example of editing a Task in VS Code with the Flux extension

使用 Flux 扩展在 VS code 中编辑任务的示例。轻松在左侧面板中切换和选择您要使用的现有配置的 InfluxDB 组织。相应的输出显示在左侧的标签中。我为我个人的 InfluxDB Cloud 账户和组织设置了配置。我也是我同事 John 组织的用户。

在查询我的同事John的InfluxDB组织后,我收到了Slack警报。我还将任务查询持续时间更改为查询过去30天内的所有基数限制事件(第17行),因为我们过去一个月内触发了数百个基数事件。只选择这个长查询时间范围,只是为了检查任务是否成功向Slack发送警报。

Slack alerts

最后,现在我相信我的任务按预期工作,我在使用influx update task命令更新任务之前,将开始参数的值返回到-1小时。

influx task update --file /path/to/example-task.flux

理解基数限制警报任务背后的Flux以及绕过InfluxDB检查和通知系统

现在我们已经了解了与复杂Flux开发相关的最佳实践,让我们花点时间回顾一下基数限制警报任务背后的Flux。与任何Flux任务或脚本一样,首先导入所有相关包。接下来,指定任务选项,包括名称、every和偏移量参数。every间隔指定查询开始时间,而偏移量间隔指定任务应运行的时间。在任务选项中包含偏移量确保您正在捕获任何迟到的数据,并帮助您避免读写冲突。

import "array"
import "experimental/usage"
import "slack"
option task = { name: "Cardinality Limit Alert (usage dashboard)", every: 1h0m0s, offset: 5m0s }

接下来,指定您的slackWebhook URL和slackChannel。如果您正在发送直接消息,则将空引号作为您的slackChannel。

slackWebhook = "https://hooks.slack.com/services/####/####/####"
slackChannel = ""

现在定义一个自定义函数alert(),在基数事件数量eventValue超过阈值时触发Slack消息。我们使用条件逻辑和slack.message()函数来实现这一点。

alert = (eventValue, threshold) =>
(if eventValue >= threshold then slack.message(
url: slackWebhook,
channel: slackChannel,
text: "A Cardinality Event has occured! The number of cardinality events = \"${string(v: eventValue)}\".",
color: "warning",
) else 0)

现在我们期望能够使用usage.from()查询我们的基数事件,并将此函数应用于查询的输出,以在我们的事件超过阈值时触发Slack警报。然而,我们必须解决两个问题,这些问题稍微复杂了我们的Flux脚本。

  1. 首先,我们必须处理查询基数事件没有返回结果的情况。为了初始化查询以返回一个值为0的表,我们使用了array.from()函数。
  2. 其次,Flux查询的输出是带注解的CSV格式的表流,而不是预期的标量值,这是alert()函数的输入。为了从带注解的CSV输出中返回标量值,我们使用了findRecord()函数。

我们使用 `array.from()` 函数将一个包含一列(_value)和一个行值(0)的表格存储到变量 data_0 中。通过应用适当的过滤器、计算事件总和并将输出存储在变量 data 中,我们使用 usage.from() 查询我们的基数事件数据。接下来,我们对两个表格流 data_0data 执行联合操作,以确保输出表格并成功应用我们的 alert() 函数。对联合应用 group()sum() 函数,将联合输出的结果减少到一个单列、单行的表格。请注意,sum() 函数只是将 0 添加到基数事件值。现在,由于总是返回表格,我们应用了 findRecord() 函数以检索标量值,该值将输入到我们的 alert() 函数中。

data_0 = array.from(rows: [{_value: 0}])
data = usage.from(start: -1h, stop: now())
|> filter(fn: (r) =>
(r._measurement == "events" and r._field == "event_type_limited_cardinality" and exists r._value))
|> sum()
events = union(tables: [data_0, data])
|> group()
|> sum()
|> findRecord(fn: (key) =>
(true), idx: 0)
eventTotal = events._value
alert(eventValue: eventTotal, threshold: 1)

最后,任务需要返回一个表格流。如果一个任务没有输出表格流,即使它成功地查询了我们的使用数据并执行了我们的警报逻辑,它也会失败。为了满足任务对表格输出的要求,我们产生我们的初始化表格 data_0

data_0
|> yield(name: "ignore")f

这种异常引入了这个任务最重要的方面,即它完全绕过了 InfluxDB 检查和通知系统。任务要求表格输出的原因是因为通常检查任务和通知任务使用 monitor.check()monitor.notify() 函数,这些函数输出和写入有关您的检查和通知的元数据到系统桶 “_monitoring”。这些函数及其元数据输出提供了对您的检查和通知任务的可见性,并为所有检查和通知数据提供了一个统一的管理系统。然而,正如我们的基数限制警报任务(使用情况仪表板)所示,用户并非必须订阅 InfluxDB 检查和通知系统,如果他们认为合适,可以完全绕过它。有关更多信息,请阅读 InfluxDB 的检查和通知系统 博客或查看下面的“进一步阅读”部分。

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

尽管 InfluxDB 云使用模板附带基数限制警报任务,但您并不局限于这个任务。我建议将此任务视为创建您自己的 InfluxDB 云使用任务和警报的跳板。例如,您可能决定要向 Slack 之外的其他端点发送警报。您可以编辑 Flux 代码以使用任何 <package>.message() 函数将警报发送到您选择的端点。请查看此问题 #2405 以获取 Flux 通知端点包的完整列表。

或者,您可能决定创建一个任务,当您达到写入限制事件时向您发出警报。该任务看起来与上面的基数限制事件任务相同,但需要对字段类型进行单一修改

data = usage.from(start: -1h, stop: now())
|> filter(fn: (r) =>
(r._measurement == "events" and r._field == "event_type_limited_write" and exists r._value))

进一步阅读

尽管这篇文章旨在提供 InfluxDB 云使用模板及其所依赖的 Flux 的全面概述,但以下资源也可能对您感兴趣

  1. TL;DR InfluxDB 技术技巧 – 监控任务和查找卡迪纳性问题来源:本文介绍了如何使用操作监控模板帮助您在遇到卡迪纳性问题事件时确定卡迪纳性的来源。我鼓励您尝试使用操作监控模板以及 InfluxDB 云使用模板,以全面了解 InfluxDB 云中可用的仪表选项。
  2. InfluxDB 的检查和通知系统:本文介绍了 InfluxDB 的检查和通知系统是如何工作的,以及如何创建自定义检查和通知任务。
  3. TL;DR InfluxDB 技术技巧 – 如何解读注释 CSV:本文介绍了如何解读注释 CSV,这是 InfluxDB 的 Flux 查询结果格式。如果您是 InfluxDB 和 Flux 的初学者,我建议您在尝试编写复杂的自定义检查任务之前,先花时间了解注释 CSV 输出。
  4. TL;DR InfluxDB 技术技巧 – 如何使用 Flux 和 InfluxDB 提取值、可视化标量值和执行自定义聚合:本文介绍了如何使用 findRecord() 提取标量值以及一个技巧,让您可以在 UI 中可视化它们。
  5. Flux Telegram 包:本视频介绍了如何配置 Telegram 机器人并使用 Flux Telegram 包 向 Telegram 发送通知。
  6. TL;DR InfluxDB 技术技巧:配置 InfluxDB 的 Slack 通知:本文介绍了如何配置 Slack webhook 以使用 Flux 向 Slack 发送通知。

关于 InfluxDB 云使用模板的最终思考

我希望这篇 InfluxDB 技术技巧文章能够激发您利用 InfluxDB 云使用模板的兴趣。最后,以下问题可能对您和您的 Flux 开发有关联。我鼓励您在评论中发表意见并分享您的想法,以便 InfluxData 能更好地支持您。

  1. InfluxDB UI #1664:支持除注释 CSV 以外的数据格式可视化。
  2. Flux 扩展 for VS Code #234:支持除注释 CSV 以外的数据格式可视化。
  3. Flux #3726:绕过调用任务流函数时出现的错误。

如果您使用社区模板或 Flux 并需要帮助,请在我们的社区网站Slack频道中寻求帮助。如果您在 InfluxDB 上开发酷炫的物联网应用程序,我们非常乐意了解,请确保分享您的经历!此外,请在评论部分分享您的想法、担忧或问题。我们非常希望得到您的反馈,并帮助您解决遇到的问题!