如何将开源软件数据整合到云账户中
作者:Rick Spencer / 产品,用例,开发者
2021年5月24日
导航至
在这篇文章中,我们将描述一种简单的方法,用于将多个InfluxDB 2.0 OSS实例的数据共享到中央云账户。这是社区成员在多个地点运行OSS时提出的需求,但他们希望在中央位置可视化某些数据或对数据进行警报。
请注意,尽管这里介绍的方法简单且易于设置,但它有许多局限性,可能不适合您的产品用例。这将在文章结尾进行讨论。
此方法结合了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工厂的用户可以在他们的网络中查看这些传感器的状态,通常如下所示。
您的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实例写入数据了。为此,我们只需做以下事情:
- 从秘密存储中提取秘密。
- 创建API的URL字符串。
- 选择并聚合您想要发送的数据。
- 使用
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账户中创建一个仪表板,以便我可以监控远程实例。
当然,我可以为更多的远程实例重复此过程,从而创建一个综合视图。
限制
虽然这种方法设置简单,无需任何额外的软件或集成即可工作,但它有一些局限性,可能不适合您的生产环境。
非常小的数据量
此方法一次只能通过API发送一行行协议。在我的例子中,这意味着每五分钟,它会对写入端点进行100次单独调用,将数据写入云账户。对于有意义的点数,这将变得非常慢。没有批处理或其他优化。想象一下,这意味着为了使其工作,数据必须被大量降采样。
重试逻辑
写入调用可能会因为多种原因而失败,例如OSS实例运行的网络上网断开等。在这个例子中,这些失败的写入被简单地忽略。虽然您可能会尝试一些技术来克服这种缺乏弹性,但如果这种可用性是一个问题,您可能会想探索其他此类集成的其他选项。
下一步
如上所述,这种技术简单但有一些显著的局限性。我可能会提供更多关于解决这些局限性的详细信息。
检查和通知
这里提供的示例展示了如何可视化远程OSS实例的数据,但你更有可能对基于那些远程实例收集的数据进行的警报感兴趣。这可以通过在您的任务中创建一个写入您云账户的_monitoring bucket的检查来实现。
Telegraf
Telegraf内置了许多期望的特性,可以增强此系统的弹性。通过配置一个代理您的云账户的Telegraf实例,您可以在不进行重大代码更改的情况下提高此设置的弹性。