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

导航至

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

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

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

我通常使用 InfluxDB、Chronograf、Grafana、Zabbix 等类似解决方案来监控服务和系统。然而,直到此时,我还没有使用它们来处理和 可视化 其他类型的数据。由于医疗数据是 时间戳数据,因此使用时间序列数据库是合理的。

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

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培训。