视频

了解更多
更新 3/29/21:https://coronavirusapi.com/ 近期关闭了对数据的免费访问权限,使其仅对注册的第一响应者可用。虽然这不幸地意味着新冠病毒案例可视化项目演示将不再起作用,但我们的提示对于您需要在 Grafana 世界地图面板上显示 RedisTimeSeries 数据的许多其他实现仍然有用。
在之前的文章中,我们介绍并展示了如何使用新的 Grafana 的 Redis 数据源
在这篇文章中,我们想要探索一些现实生活中的示例,旨在为您提供有关您可以在 Redis 中存储和在 Grafana 中可视化的许多有趣数据集的想法。我们将介绍三个不同的应用程序
我真的认为世界需要另一个天气仪表板吗?是的,我认为!
当然,大多数时候我对天气并不十分感兴趣。我经常不太关心天气状况。即使我关心,最好的天气仪表板通常就是我房子外的一扇窗户。但是有时,也许当我找到一些空闲时间外出拍照或驾驶我的无人机时,我的内心天气狂热者就会苏醒过来。
当然,最大的问题是,我应该去哪里?在我的新泽西州的房子附近,开车几小时就能到达许多有趣的地方,而天气状况可能大不相同。我真正想要的是一个仪表板,它在一个屏幕上显示十几个地点的天气,这样我就可以一目了然地比较各个地点的状况。至关重要的是,我不仅想比较彼此靠近的地点。
同样重要的是,我喜欢使用数字。我知道风景摄影在云量在 20% 到 50% 之间时效果最佳。对于驾驶我的无人机来说,风速低于 10 英里每小时是理想的,10 到 20 英里每小时是困难的,而任何高于 20 英里每小时的风速都可能很危险。因此,像这样的可爱天气图标对我没有太大用处
考虑到这一点,以下是我如何使用 Redis 构建天气仪表板。
幸运的是,原始天气数据现在可以通过各种天气 API 获得,其中许多 API 是免费的(有一些限制)。我选择使用 OpenWeatherMap API,因为它免费的计划提供了我需要的一切:48 小时每小时预报、7 天每天预报和当前状况。
我编写了一个简单的 Python 脚本,从 API 中提取数据并将每小时/每天预报放入 Redis 数据库,使用 RedisTimeSeries 模块,并将当前状况放入另一组时间序列以供历史记录。
我的天气仪表板遵循我的两个强制性仪表板规则:
仪表板的顶部显示了一个地点的当前状况,该地点可以是主要地点、收藏地点,也可以是从可用地点列表中选择的地点(仪表板左上角有一个 Grafana 模板变量选择列表)。它还显示了在该地点进行特定活动时有利的时间段。Grafana 允许我突出显示温度的低/高区域、风速的危险区域、显示云量,并标记白天和黑夜的时间段。
底部部分按活动对地点进行分组,便于比较。圆圈越大,表示在特定地点进行特定活动的时长越长。
我喜欢旅行,但 2020 年让数百万人在家中待了几个月(我希望不要永远待在家!)。现在,随着许多州逐步开始重新开放,明智地旅行并了解您的出发地和目的地的 COVID-19 情况非常重要。这意味着不仅要注意当前情况,还要注意长期趋势。
这是我的 Grafana 美国州新冠病毒仪表板 显示的内容。它基于 新冠病毒 API 数据,加载到 RedisTimeSeries 模块中。
除了标准图形表示之外,数据还在地图上绘制。 Redis 数据源插件 未获得 Grafana 世界地图面板 的官方支持,但您只需两个简单的步骤就可以让它正常工作:
步骤 1:对时间序列输出结果应用“标签到字段”转换
步骤 2:将地图参数“位置数据”更改为表格模式,并映射相关字段
这两个步骤将允许您将时间序列值粘贴到地图上的相关点,该点由 RedisTimeSeries 的“geohash”标签设置。标签“state”用于在地图上显示位置的名称。
我非常喜欢 Redis 流,这是在 Redis 5.0 中引入的一种新的数据类型,我一直都在寻找一种快速简单的解决方案来监控数据处理的队列。在开发 Redis 数据源时,我们的团队开始探索 RedisGears——这是一个动态框架,允许开发人员编写和执行 函数,在 Redis 中实现数据流,同时抽象出数据的分布和部署,用于另一个项目,我们决定将它们一起用于这个快闪店的演示数据管道。
RedisGears 支持几种类型的读取器,它们对不同类型的输入数据进行操作。为了监视流消息,我们在事件模式下使用了 StreamReader。在这种模式下,读取器是在添加了新消息到流后生成的事件响应中执行的。
# Add Time-Series def tsAdd(x): xlen = execute('XLEN', x['key']) execute('TS.ADD', 'ts:len:'+x['key'], '*', xlen) execute('TS.ADD', 'ts:enqueue:' + x['key'], '*', x['value']) # Stream Reader for any Queue gb = GearsBuilder('StreamReader') gb.countby(lambda x: x['key']).map(tsAdd) gb.register(prefix='queue:*', duration=5000, batch=10000, trimStream=False)
StreamReader 接受多个参数来控制其触发方式。在本例中,我们希望读取器每 5 秒触发一次,或者在收到 10,000 条消息后触发。最后一个选项 trimStream 指定在执行后不修剪流。
我们使用 RedisTimeSeries 来存储传入消息的数量和队列大小样本。正如在 关于 Grafana 的 Redis 数据源插件的介绍性博客文章 中解释的那样,时间序列可以很容易地在 Grafana 中可视化。
为了展示 Redis 流、RedisTimeSeries、RedisGears 和 Redis 数据源如何协同工作,我们创建了 快闪店演示,并提供了一个动态仪表板
此 Grafana 仪表板显示
请查看 此项目的 GitHub 代码库,了解我们如何生成负载、我们使用的 RedisGears 脚本,以及如何配置 Redis 数据源以使用 TS.RANGE 命令查询 RedisTimeSeries 数据。
这三个真实案例展示了如何使用 Redis 数据源与各种 Redis 模块结合,在 Grafana 中实现不同的应用场景。我们希望这些案例能够激发你使用这项技术的灵感,并构建自己的应用程序。
你会发现有很多同行也在使用它。自从 Redis 数据源插件在 Grafana 仓库 中发布以来,它已被下载超过 10,000 次,并被纳入 可以改进 Grafana 仪表盘的热门社区插件 列表中,它还增加了对 Redis 集群、哨兵、Unix 套接字和访问控制列表 (ACL) 的支持。
但这还不是全部。请持续关注 Redis 技术博客,了解一个激动人心的项目,它将 Grafana 的流式传输功能与交互性结合在一起,通过 redis-cli 面板将 Grafana 扩展到可观测性之外。