使用 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> Chronograf 仪表板显示阿根廷、玻利维亚、巴西、智利、巴拉圭和乌拉圭的 COVID-19 病例和死亡人数</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 Beta 监控 Linux(包括部署),请查看这篇文章(西班牙语)。
- 如果您尚未准备好试用 InfluxDB v2,您可以尝试使用 InfluxDB v1.8、Chronograf 和 Kapacitor (TICK Stack)。
- 可以在 InfluxDB 社区 Slack 工作区 @Ignacio Van Droogenbroeck 上找到我
- 如果您正在使用此仪表板以及如何使用,请在 社交媒体 上告诉我。如果您有任何问题,我很乐意提供帮助。
如果您有兴趣了解更多关于 Flux 的信息,请注册参加我们于 2020 年 6 月 8-9 日举行的虚拟 Flux 动手培训。