使用Metabase和MongoDB实时可视化传感器数据的故事

我认为这部分工作应该投稿到TIS AdventCalendar。

这篇文章的目的是什么?

这项努力旨在尽快地将从传感器收集并储存的数据可视化,通过在Metabase上尽快显示收集到的数据进入mongodb的方式。

如果我记录下在其中出现的问题以及对应的对策或放弃的部分,能否请人告诉我一些意见呢?

mongoDBとMetabaseの組み合わせに起因すると考えられる挙動がいくらかあったので、記事タイトルはmongoDBを明示しています。

整体结构

overview.png

我們主要的動機是希望能夠在多個傳感器的數據積累之後立即進行視覺化使用。

本文提到的使用版本有一些过时,但以下是其中的一个选择。

Metabase: 版本0.39.4
MongoDB: 版本3.6.23

MongoDB – MongoDB is a commonly used database system.

数据的示例

这是一份普通无特色的数据,但我会举例说明。

{
    _id: ObjectId('6139f7249da5cfbe02d0866f'),
    id: 'urn:ngsi-ld:BodyTemp:003',
    type: 'BodyTemp',
    TimeInstant: ISODate('2021-09-09T11:59:32.301Z'),
    temp: 2662
}

数据中存在一个时间戳(在这个例子中是 TimeInstant),针对用于可视化图形的值(在这个例子中是 temp),我们将对其进行处理。

Metabase 美塔普斯

以下是关于如何使用Metabase的内容。
主要记录了遇到的令人不满意的行为和所做的事情。

数据模型

Metabase会自动读取MongoDB的数据库和集合,并设置数据模型。

image.png

しかしながらいくつか期待と異なる独特の挙動をします。
1. _id も id も同じカラム名になってしまう。
1. id はEntity Key(おそらくRDBであればPrimaryKey相当)と認識されてしまう(この例ではCategory と認識されたい)
1. TimeInstant も Timestamp などと認識はされない。

如果不先正确地设置此处的数据模型,它将导致在图形定义界面上不能满意的行为。
具体而言,如果在Metabase的数据模型中将EntityKey识别为筛选条件,那么只能使用一条数据进行可视化。

就我个人观点而言,如果对手是关系数据库(RDB),根据表定义的信息可以适当地创建数据模型。但是,对于像MongoDB这样没有模式的数据库来说,创建数据模型可能会导致错误或产生独特的行为。

时间过滤器

在图表上尝试指定时间范围会导致错误。
虽然根据功能要求不需要实时更新屏幕,
但当想要从UI中选择值集中的部分(如下图中的浅蓝色区域)查看详细信息时,

image.png
image.png

对于默认的h2等数据库,通过这个操作可以指定时间范围进行可视化。

这只是我的观点,但我认为问题可能是由于MongoDB没有时区引起的,但尚未解决。(我甚至没有尝试升级Metabase版本)

仪表盘和筛选条件

我为实验制作了一个仪表板,这样就可以在同一屏幕上查看多个传感器的数值。

da20da77878473b82a7775352b2c0969.png

在时刻过滤器处,仅显示最近几分钟的数据。
这个部分没有太多陷阱,但是屏幕操作变得相对繁琐,并且变得更重了一点。

定期更新的仪表盘更新机制

虽然我们在Metabase中有定期的仪表盘更新功能,但最快的刷新频率只能是每60秒一次。如果不能更频繁地更新屏幕,就无法看到传感器数值的变化,这样就不够有趣了。

所以我们做出了以下的改进。
将更新间隔设置为每60秒一次,URL也会被更改为以下的形式:
https://example.com/dashboard/1?time=past3minutes~#refresh=60

明显地,因为refresh=60看起来有点可疑,我将其更改为refresh=3并在另一个标签页中打开。
这样,每隔3秒画面就会更新一次,形成了一个实时显示的仪表板。
我将此URL添加到收藏夹,作为一个实时显示画面的仪表板。

进行URL的修改时,不知何故刷新的值会恢复原样,所以请以另一个标签页来打开。

发生的问题

实施了类似的事情,然后出现了以下的问题。

CPU资源耗尽

由于 Metabase 使用的 CPU 资源枯竭,导致屏幕无法正确显示。很可能是因为意外地将屏幕更新频率设置为每3秒一次,导致了这个问题。

通过扩展工作环境的实例来解决该问题。
我们在AWS的EC2上使用t3.xlarge节点群来运行k8s,但是当升级到c5.2xlarge时,资源方面有了相当的余裕。
然而,这种情况只是通过金钱解决。

作为一种感觉,如果瓶颈出现在查询内容、索引等与数据库有关的地方,那是很常见的情况,但关于Metabase的CPU为什么那么繁忙的问题,确实有这种感觉。
不过,即使如此,我们会对观察到的事实采取相应的应对措施。

总结

由于这个原因,虽然有些奇怪的行为,但我们通过创意和技巧,成功实现了将传感器数据在几秒内显示在屏幕上的机制。

然而,我觉得对于这个用途来说,Metabase并不合适,所以如果在读过这篇文章后,有任何值得推荐的开源软件,请务必告诉我!

bannerAds