如何将 OSS 数据整合到云账户

导航至

在这篇文章中,我们将介绍一种简单的方法,用于与中央云账户共享来自多个 InfluxDB 2.0 OSS 实例的数据。这是社区成员在不同位置运行 OSS,但又希望能够在中央位置可视化某些数据甚至对数据发出警报时所要求的。

Cloud Account

请注意,虽然这里介绍的方法设置简单快捷,但它有很多局限性,可能使其不适合您的产品用例。这将在文章末尾讨论。

此方法结合使用了 InfluxDB 今天提供的功能;即 任务行协议 和 Flux http.post() 方法。

InfluxDB 物联网场景

为了演示此功能,我创建了一个虚构的制造工厂,我在其中运行 InfluxDB 2.0 OSS 实例。我称之为“工厂 001”。此站点在整个工厂中有两种不同的传感器。这些传感器通过标签“s_type”进行区分,每个传感器的 s_type=1 或 s_type=2。工厂每种传感器有 50 个,每 5 秒报告一次。传感器各有类型代码 1 或 2。

以下是一些传感器数据的示例行协议

sensors,s_type=1,s_id=s18 s_reading=40
sensors,s_type=2,s_id=s28 s_reading=91
sensors,s_type=1,s_id=s19 s_reading=36
sensors,s_type=2,s_id=s29 s_reading=99
sensors,s_type=1,s_id=s110 s_reading=33
sensors,s_type=2,s_id=s210 s_reading=71
sensors,s_type=1,s_id=s111 s_reading=37
sensors,s_type=2,s_id=s211 s_reading=67
sensors,s_type=1,s_id=s112 s_reading=45
sensors,s_type=2,s_id=s212 s_reading=75
sensors,s_type=1,s_id=s113 s_reading=31
sensors,s_type=2,s_id=s213 s_reading=61

工厂 001 中的用户可以在其网络内查看这些传感器的状态,通常使用以下仪表板。

Plant 001 Readings

您的 InfluxDB Cloud 账户

但是,如果我要以相同的方式运行多个工厂怎么办?如果我想能够帮助监控工厂,但 OSS 实例未在可访问的位置运行怎么办?为了解决这个问题,首先,您需要一个 InfluxDB Cloud 账户。

免费套餐账户就可以很好地满足此需求。您可以轻松地在此处注册账户。

因此,您可以继续创建一个存储桶。由于您将存储桶名称作为 URL 的一部分传递,我建议不要在存储桶名称中包含任何特殊字符,以避免 URL 编码问题。对于我的示例,我选择将存储桶简单地命名为“remote”。

创建存储桶后,继续为该存储桶创建一个写入令牌。您的云账户现在已设置为开始从您的 OSS 实例收集数据。

在您的 InfluxDB OSS 实例中创建任务

您要做的第一件事是将您的云账户存储桶的写入令牌作为密钥存储在您的 OSS 实例中。没有用于此操作的 UI,但使用 CLI 执行此操作非常简单。假设Influx CLI 已配置为指向您的 OSS 实例,您可以使用如下命令

$ influx secret update -k remote-token -v LN1lYeE3j0we0dji_E027UyOUrmi1vLJK2xz-N3z8cDzxqiqDjTdV3xrUAjsBLQ6AbNZf67Nxsu3pvBtg3tsrg==
Key		Organization ID
remote-token	6994b3b5a01a431c

现在我们准备好从我们的 OSS 实例写入。为此,我们只需要

  1. 从密钥存储中拉取密钥。
  2. 为 API 创建 URL 字符串。
  3. 选择并聚合您要发送的数据。
  4. 使用 map() 为每一行调用 http.post(),以将行协议发送到您的 InfluxDB Cloud 账户。
import "http"
import "influxdata/influxdb/secrets"
 
token = "Token ${secrets.get(key: "remote-token")}"
url = "https://us-west-2-1.aws.cloud2.influxdata.com/api/v2/write?orgID=27b1f32678fe4738&bucket=remote"
 
from(bucket: "readings")
|> range(start: -5m)
|> filter(fn: (r) =>
(r["_measurement"] == "sensors"))
|> mean()
|> map(fn: (r) =>
({r with http_code: http.post(url: url, headers: {"Authorization": token}, data: bytes(v: "sensors,plant=p001,s_id=${r.s_id} m_reading=${string(v: r._value)}"))}))

现在数据正在流入,我可以继续在我的 InfluxDB Cloud 账户中创建一个仪表板,以便我可以密切关注远程实例。

Plant Buddy - remote plant monitoring screenshot

当然,我可以继续为更多远程实例重复此过程,从而创建一个整合视图。

局限性

虽然此方法具有易于设置且无需任何其他软件或集成即可工作的优点,但它有一些局限性,可能使其不适合您的生产设置。

极少量的数据

此方法每次只能通过 API 发送单行行协议。在我的示例中,这意味着每五分钟,它会向写入端点发出 100 个单独的调用,以将数据写入云账户。对于有意义的点数,这将变得非常缓慢。没有批处理或任何其他优化。您可以想象,这意味着为了使此方法有效,必须积极地对数据进行降采样。

重试逻辑

写入调用总是可能因多种原因而失败,例如运行 OSS 实例的网络与互联网断开连接等...在此示例中,这些失败的写入将被简单地忽略。虽然有一些技术可以尝试克服这种缺乏弹性的情况,但如果这种级别的可用性是您关心的问题,您可能需要探索其他集成选项。

后续步骤

如上所述,此技术很简单,但有一些明显的局限性。我可能会跟进更多关于解决其中一些局限性的详细信息。

检查和通知

此处提供的示例演示了如何可视化来自远程 OSS 实例的数据,但您更可能对基于在这些远程实例中收集的数据进行警报感兴趣。这可以通过在您的任务中创建一个检查来写入您的云账户的 _monitoring 存储桶来实现。

Telegraf

Telegraf 具有许多内置的理想功能,可以提高此系统的弹性。通过配置代理您的云账户的 Telegraf 实例,您可以提高此设置的弹性,而无需进行重大的代码更改。