使用 Telegraf 和 InfluxDB 跟踪南美洲的 COVID-19 数据
作者:社区 / 产品,用例,开发者
2020 年 5 月 28 日
导航至
本文由 InfluxDB 社区成员 Ignacio Van Droogenbroeck 撰写。
Ignacio 是一位来自乌拉圭的 DevOps 工程师。他大约十年前开始写博客,主要关于 IT 基础设施、云、Docker、Linux 和可观测性。
我想更好地了解南美洲 COVID-19 的进展情况。由于我最近开始使用开源时间序列数据库 InfluxDB,我使用 InfluxData 的平台创建了一个病例和死亡情况的仪表板。
我通常使用 InfluxDB、Chronograf、Grafana、Zabbix 等类似解决方案来监控服务和系统。然而,直到此时,我还没有使用它们来处理和 可视化 其他类型的数据。由于医疗数据是 时间戳数据,因此使用时间序列数据库是合理的。
针对此案例,我建立了一个关于阿根廷、玻利维亚、巴西、智利、巴拉圭和乌拉圭的COVID-19病例和死亡情况的仪表盘。这些指标包括新增病例的24小时变化。为了参考,我还包括了一个全球病例和死亡面板。我使用的API是从约翰霍普金斯大学的COVID-19追踪器实时获取数据的。这是仪表盘
<figcaption>显示阿根廷、玻利维亚、巴西、智利、巴拉圭和乌拉圭的COVID-19病例和死亡情况的Chronograf仪表盘</figcaption>
我是如何构建我的Chronograf仪表盘的?
时间序列数据和仪表盘存储在InfluxDB中。数据通过GitHub上找到的API进行检索。
我创建了一个.sh
文件来运行curl命令,指定API URL和位置,然后将输出转换为JSON。例如,对于乌拉圭,以下是完整的“命令”
curl -s https://coronavirus-tracker-api.herokuapp.com/v2/locations/224 | json_pp
如前所述,此命令保存了一个可执行文件。我使用了Telegraf,其输入为可执行文件,以将此命令的结果带到InfluxDB。
[[inputs.exec]]
## Commands array
commands = [
"sh /Users/nacho/docker/influxdb2.0-covid/uruguay.sh" ]
## Timeout for each command to complete.
timeout = "30s"
## measurement name suffix (for separating different commands) name_suffix = "_uruguay"
## Data format to consume.
## Each data format has its own unique set of configuration options, read
## more about them here:
## https://github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_INPUT.md data_format = "json"
提示:指定name_suffix很重要,因为默认情况下,Telegraf会以“_exeCollector”后缀保存数据。当需要处理多个“来源”的数据时,很重要的一点是使它们可识别。
我为每个国家的“input.exec”进行了配置,运行了Telegraf,并等待数据开始加载到InfluxDB。
我经常使用Chronograf的数据探索器进行数据分析、可视化和测试查询。在这种情况下,我将继续使用乌拉圭作为示例。我现在知道最新的确诊病例数。Flux是InfluxData的脚本语言,内置于InfluxDB v1.8。对于此项目,我使用的是InfluxDB 2.0.0 Beta 10,所有查询均使用Flux编写。
以下是Flux查询
from(bucket: "covid")
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
|> filter(fn: (r) => r["_measurement"] == "exec_uruguay")
|> filter(fn: (r) => r["_field"] == "location_latest_confirmed")
我将图表类型指定为“单个统计”,然后!??总确诊病例数出现在屏幕上。
要列出过去24小时内报告的病例数,我创建了此查询
from(bucket: "covid")
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
|> filter(fn: (r) => r["_measurement"] == "exec_uruguay")
|> filter(fn: (r) => r["_field"] == "location_latest_confirmed")
|> increase()
|> yield(name: "increase")
与前一样,我使用了“单个统计”图表。由于我也想了解六个国家的病例(和死亡)总数,因此构建了此查询
from(bucket: "covid")
|> range(start: -1m)
|> filter(fn: (r) => r["_measurement"] == "exec_argentina" or r["_measurement"] == "exec_uruguay" or r["_measurement"] == "exec_bolivia" or r["_measurement"] == "exec_paraguay" or r["_measurement"] == "exec_chile" or r["_measurement"] == "exec_brasil")
|> filter(fn: (r) => r["_field"] == "location_latest_confirmed")
|> mean()
|> group()
|> sum()
注意:虽然我使用了mean() 聚合转换,但应注意的是,我本可以使用last()。 Last()是一个选择转换,它返回表中的最后一个值。 Mean()返回表中的行平均值。由于查询的表只包含一行,mean()有效! ?
如果您想了解更多关于Flux的信息,以下是一些有用的链接
如您所见,监控系统数据(超出系统和应用程序指标)并不复杂。这需要一点时间来了解Flux的工作方式,但结果是值得的。为这些仪表盘构建的所有查询均使用fluxlang创建。
在这里您可以下载此仪表板,其中包含Telegraf配置和可执行文件,以构建相同的仪表板或使用您国家的数据自定义。
其他资源
- 如果您想了解如何使用InfluxDB 2.0测试版(包括部署)监控Linux,请参阅此文章(西班牙语)。
- 如果您尚未准备好尝试InfluxDB v2,您可以使用InfluxDB v1.8、Chronograf和Kapacitor(TICK堆栈)进行测试。
- 您可以在InfluxDB社区Slack工作区找到我 @Ignacio Van Droogenbroeck。
- 请在我的社交媒体上告诉我您如何使用此仪表板,以及如果您有任何问题,我将很乐意提供帮助。
如果您想了解更多关于Flux的信息,请注册参加我们于2020年6月8日至9日举办的虚拟动手Flux培训。