dot Redis 8 来了——而且是开源的

了解更多

使用 Redis 数据源为 Grafana 构建的 3 个真实应用程序

更新 3/29/21: https://coronavirusapi.com/ 最近关闭了对其数据的免费访问权限,使其仅对注册的急救人员可用。 虽然这不幸意味着冠状病毒病例可视化项目演示将不再起作用,但当您需要在 Grafana Worldmap 面板上显示 RedisTimeSeries 数据时,我们的提示仍然适用于许多其他实现。

在之前的帖子中,我们介绍并展示了如何使用新的 用于 Grafana 的 Redis 数据源

在这篇文章中,我们希望探索一些真实的例子,旨在为您提供关于可以在 Redis 中存储并在 Grafana 中可视化的许多有趣数据集的想法。 我们将介绍三种不同的应用程序

  1. 天气仪表板
  2. 冠状病毒病例可视化
  3. 快闪店演示

1. 天气仪表板

我真的认为世界需要另一个天气仪表板吗? 是的,我愿意!

当然,大多数时候我并不是一个天气爱好者。 我经常不太关心天气如何。 即使我关心,最好的天气仪表板通常只是从我家向外看的窗户。 但有时,也许当我找到一些空闲时间出去拍照或放飞我的无人机时,我内心的天气爱好者就会觉醒。

当然,最大的问题是我应该去哪里? 在我家在新泽西州的几个小时车程内有很多有趣的地方,而且天气可能因地而异。 我真正想要的是一个在一个屏幕上显示十几个地点的天气的仪表板,这样我可以一目了然地比较情况。 至关重要的是,我不想只比较彼此相邻的地点。

同样重要的是,我喜欢使用数字。 我知道当云量在 20% - 50% 之间时,风景摄影效果最好。 对于放飞我的无人机,低于 10 英里/小时的风速是理想的,10 - 20 英里/小时很困难,任何高于 20 英里/小时的风速都可能很危险。 所以像这样的可爱天气图标对我来说没什么用处

考虑到这一点,以下是我如何使用 Redis 构建天气仪表板。

幸运的是,现在可以通过各种天气 API 广泛获得原始天气数据,其中许多是免费的(有一些限制)。 我选择使用 OpenWeatherMap API,因为它的免费计划为我提供了我需要的一切:48 小时的每小时预报、7 天的每日预报和当前情况。

我编写了一个简单的 Python 脚本从 API 中提取数据,并使用 RedisTimeSeries 模块将每小时/每日预报放入 Redis 数据库中,并将当前情况放入另一组时间序列中以获取历史记录。

我的天气仪表板遵循我的两个强制性仪表板规则:

  1. 所有数据都应显示在一个屏幕上,无需滚动。
  2. 一个人应该能够尽快了解仪表板上显示的情况。
我使用 Python、Grafana 和 RedisTimeSeries 模块在 Redis 中构建的天气仪表板的屏幕截图。

仪表板的顶部部分显示一个地点的当前情况,该地点可以是主要的或最喜欢的,也可以只是从可用地点列表中选择(仪表板的左上角有一个 Grafana 模板变量选择列表)。 它还显示适合该地点特定活动的时间段。 Grafana 允许我突出显示温度的低/高区域、风速的危险区域、显示云量的程度,并标记白天和夜间的时间段。

底部部分按活动对地点进行分组,使其易于比较它们。 圆圈越大,某个地点在某个活动中适合的时间就越多。

2. 冠状病毒病例可视化

我喜欢旅行,但 2020 年让数百万人连续几个月待在家里(我希望不是永远!)。 现在,随着许多州逐渐开始重新开放,聪明地旅行并了解您出发地和目的地地点的 COVID-19 情况非常重要。 这意味着不仅要注意当前的画面,还要注意长期趋势。

这就是我的 Grafana 美国各州冠状病毒仪表板显示的内容。 它基于 Coronavirus API 数据,并加载到 RedisTimeSeries 模块中。

带有美国地图和所选州图表的 Grafana 仪表板的动画屏幕截图。

除了标准图表表示之外,数据也绘制在地图上。 Redis 数据源插件未获得 Grafana Worldmap 面板的官方支持,但您可以通过两个简单的步骤使其工作:

步骤 1:将转换“标签到字段”应用于时间序列输出结果

步骤 2:将地图参数“位置数据”更改为表格模式并映射相关字段

这两个步骤将允许您将时间序列值粘贴到地图上的相关点,该点由 RedisTimeSeries 的“geohash”标签设置。 标签“state”用于在地图上显示位置的名称。

3. 快闪店演示

我是 Redis Streams 的忠实粉丝,Redis Streams 是 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 Streams、RedisTimeSeries、RedisGears 和 Redis 数据源如何协同工作,我们创建了具有动态仪表板的 快闪店演示

用于可视化快闪店的产品、客户和订单处理的 Grafana 仪表板的动画屏幕截图。

此 Grafana 仪表板显示

  • 可用产品:产品键的值,随着订单完成而减少
  • 客户订购、订单处理和订单完成:队列的长度:客户、队列:订单和队列:完成流
  • 客户溢出:客户提交的订单与已完成订单之间的差异
  • 客户订购:5 秒内创建的订单
  • 队列中的订单:等待处理的订单
  • 完成流程:5 秒内完成的订单

请查看此项目的 GitHub 仓库,了解我们如何生成负载、使用的 RedisGears 脚本,以及如何配置 Redis 数据源以使用 TS.RANGE 命令查询 RedisTimeSeries 数据。

结论

这三个真实场景展示了如何将 Redis 数据源用于带有各种 Redis 模块的 Grafana。我们希望它们能启发您使用此技术并构建自己的应用程序。

您并不孤单。自 Redis 数据源插件发布在 Grafana 仓库以来,它已被下载超过 10,000 次,并被包含在 可以改进您的 Grafana 仪表板的热门社区插件中,并增加了对 Redis 集群、Sentinel、Unix 套接字和访问控制列表 (ACL) 的支持 (ACL)。

但这还不是全部。请继续关注 Redis 技术博客,了解一个激动人心的项目,该项目将 Grafana 流媒体功能与交互性相结合,使 Grafana 超越了使用 redis-cli 面板的可观测性。