FIWARE Orion 运行时错误

FIWARE Orion Runtime Error

我正在使用 FIWARE Orion(在 docker 图像中),我面临着丢失一些记录的可能性。我查看了日志并出现了一些错误,如下所示:

time=Sunday 17 Dec 21:03:13 2017.743Z | lvl=ERROR | corr=N/A | trans=N/A | from=N/A | srv=N/A | subsrv=N/A | comp=Orion | op=safeMongo.cpp[287]:setStringVector | msg=Runtime Error (element 0 in array was supposed to be an string but type=3 from caller mongoSubCacheItemInsert:225)

根据 http://fiware-orion.readthedocs.io/en/0.26.1/admin/logs/ 这些类型的错误(运行时)"may cause the Context Broker to fail" 和 "should be reported to the Orion development team using the appropriate channel" 这正是我正在做的。

任何帮助,将不胜感激。

非常感谢您。

编辑: Orion 版本为 1.5.0-next

编辑: 已升级到 1.10.0

编辑: 执行后 ps ax | grep contextBroker 我收到以下结果:

23470 ?        Ssl    4:24 /usr/bin/contextBroker -fg -multiservice -dbhost mongodb

编辑: 该问题周期性发生。实际上,它每分钟发生一次:

time=Wednesday 20 Dec 20:50:27 2017.235Z
time=Wednesday 20 Dec 20:51:27 2017.237Z
etc.

Orion 1.5.0-next 表示 1.5.0(2016 年 10 月发布)和 1.6.0(2016 年 12 月发布)之间的某个 运行 版本。在最好的情况下,你的版本是一年前的,这已经是相当长的时间了。

因此,我建议您升级到最新可用的 Orion 版本(在撰写本文时,该版本为 1.10.0,于 2017 年 12 月发布)。我们已经解决了 1.6.0 和 1.10.0 之间的变化增量中的一些 "overlogging" 问题,您提到的问题可能就是其中之一。

如果升级后问题依旧,请在答案的评论中说明,我们会继续调试。

诊断

60 秒的周期正好是默认配置的订阅缓存刷新间隔(您的 CLI 确认您没有对订阅缓存使用不同的设置)。

详细查看 line refered by the log trace in Orion 1.10.0 source code:

setStringVectorF(sub, CSUB_CONDITIONS, &(cSubP->notifyConditionV));

日志错误意味着 Orion 需要数据库订阅集合文档中 CSUB_CONDITIONS 字段的字符串数组,但数组中的某些(或全部)元素不是字符串但是一个对象(类型 3 表示对象,如 BSON specification 详细信息)。

CSUB_CONDITIONS常量corresponds to conditions field at DB. Note this field changed at Orion 1.3.0. Before 1.3.0, for instance 1.2.0,它是一个对象数组:

"conditions" : [
    {
        "type" : "ONCHANGE",
        "value" : [ "temperature " ]
    }
]

From 1.3.0 on,简化为字符串数组:

"conditions" : [ "temperature" ]

所以我的假设是,在过去的某个时刻,Orion 实例被更新为跨越 1.3.0 边界但没有应用 the procedure to migrate data(或者应用了程序但以某种方式失败)。

解决方案

鉴于您处于 Orion 数据库中的数据可能不一致的情况,最干净的解决方案是删除您的数据库。或者,至少 csubs 集合。

但是,这只有在您可以轻松地重新生成要删除的数据的情况下才有可能。如果那不可行,您可以尝试 the procedure to migrate data。特别是,csub_merge_condvalues.py 脚本应该可以解决这个问题,尽管我建议应用完整的程序来解决其他潜在的不一致问题。

考虑到迁移程序设计为在开始使用新的 Orion 版本之前应用。看来您已经将 post-1.3.0 Orion 与 1.3.0 之前的数据一起使用了一段时间,因此您的数据可能以某种程序无法修复的意外方式发生了变化。无论如何,即使在这种情况下,程序总比没有好:)

请注意,如果您正在使用 multiple services-multiservice CLI 参数似乎如此),您必须将 clean/migration 过程应用于每个服务数据库。