使用 Telegraf 和 InfluxDB 跟踪南美洲的 COVID-19 数据

导航至

本文由 InfluxDB 社区成员 Ignacio Van Droogenbroeck 撰写。 InfluxDB Community member Ignacio Van Droogenbroeck

Ignacio 是一位常驻乌拉圭的 DevOps 工程师。他大约在十年前开始写 博客,内容关于 IT 基础设施、云、Docker、Linux 和可观测性。 

我想更好地了解 COVID-19 在南美洲的发展情况。由于我最近开始使用 InfluxDB,即 开源时间序列数据库,我使用 InfluxData 的平台创建了一个关于病例和死亡人数的仪表板。

我通常使用 InfluxDB, Chronograf, Grafana, Zabbix 和其他类似解决方案来监控服务和系统。但是,在此之前,我还没有使用它们来处理和可视化其他类型的数据。由于医疗保健数据是时间戳数据,因此时间序列数据库是有意义的。

对于这种情况,我构建了一个关于阿根廷、玻利维亚、巴西、智利、巴拉圭和乌拉圭的 COVID-19 病例和死亡人数的仪表板。这些指标包括 24 小时内新增病例的变化。作为参考,我还包括了一个全球病例和死亡人数面板。我使用的 API 正在从 约翰斯·霍普金斯大学 COVID-19 跟踪器中提取实时数据。这是仪表板

dashboard 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 动手培训。