Join Kapacitor:通过连接计算两个流之间的差异
完全披露:我还发表了这个问题的一个变体 我有一个嵌入式设备作为加热系统的一部分,该系统每5秒通过Mosquito MQTT代理发布两个温度值,每个温度值发布到一个单独的MQTT主题。“mydevice/sensor1”是预热温度,“mydevice/sensor2”是后加热温度。这些值几乎是在同一时间发布的,因此两条消息之间的延迟通常不会超过半秒,但它们并不完全同步 Telegraf订阅了同一个代理,并很高兴地将这些测量结果放入名为“Telegraf.autogen”的XDB数据库中。这两个测量值都显示在一个名为“mqtt_consumer”的测量值下,该测量值带有一个名为“value”的字段。在XDB中,我可以通过使用“topic”标记进行过滤来区分主题标记的值: 这一切似乎都运转正常 我想做的是计算这两个主题值之间的差异,对于每对输入值,以计算温差,并最终计算加热系统传递的能量(流速恒定且已知)。我尝试在Grafana中使用InfluxDB查询来实现这一点,但这似乎相当困难(我失败了),所以我想我应该尝试使用TICKscript将我的过程分解为几个小步骤 我一直在编写一个脚本,根据以下示例计算差异: 然而,在我的情况下,我没有两个单独的测量。相反,我使用topic标记作为过滤器,从单个“mqtt_使用者”度量创建两个独立的流。然后我尝试用1s公差连接这些值(值总是在足够短的时间内发布)。我正在使用Join Kapacitor:通过连接计算两个流之间的差异,join,difference,influxdb,telegraf,kapacitor,Join,Difference,Influxdb,Telegraf,Kapacitor,完全披露:我还发表了这个问题的一个变体 我有一个嵌入式设备作为加热系统的一部分,该系统每5秒通过Mosquito MQTT代理发布两个温度值,每个温度值发布到一个单独的MQTT主题。“mydevice/sensor1”是预热温度,“mydevice/sensor2”是后加热温度。这些值几乎是在同一时间发布的,因此两条消息之间的延迟通常不会超过半秒,但它们并不完全同步 Telegraf订阅了同一个代理,并很高兴地将这些测量结果放入名为“Telegraf.autogen”的XDB数据库中。这两个测量
httpOut
生成一个调试视图(旁白:这只会每10秒更新一次,丢失每秒的值,即使我的流以5秒的间隔运行-为什么?我可以在新的数据库中看到这些值都存在)
一旦我让他们加入,我将评估值的差异,并将其存储在一个名为“diff”的新数据库中
以下是我目前的脚本:
var sensor1 = stream
|from()
.database('telegraf')
.retentionPolicy('autogen')
.measurement('mqtt_consumer')
.where(lambda: "topic" == 'mydevice/sensor1')
.groupBy(*)
|httpOut('sensor1')
var sensor2 = stream
|from()
.database('telegraf')
.retentionPolicy('autogen')
.measurement('mqtt_consumer')
.where(lambda: "topic" == 'mydevice/sensor2')
.groupBy(*)
|httpOut('sensor2')
sensor1
|join(sensor2)
.as('value1', 'value2')
.tolerance(1s)
|httpOut('join')
|eval(lambda: "sensor1.value1" - "sensor1.value2")
.as('diff')
|httpOut('diff')
|influxDBOut()
.create()
.database('mydb')
.retentionPolicy('myrp')
.measurement('diff')
不幸的是,我的脚本无法通过join
节点传递任何项目。在kapacitor show
中,我可以看到httpOut
节点都在向join
节点传递项目,但它没有传递任何项目。kapacitor日志也没有显示任何明显的信息。httpOut('join')
的HTTP GET返回:
{"series":null}
我有两个问题:
join
节点不产生任何输出?我可以做些什么来进一步调试它尝试在两个传感器中添加|平均节点,以计算场的平均值:
var sensor1 = stream
|from()
.database('telegraf')
.retentionPolicy('autogen')
.measurement('mqtt_consumer')
.where(lambda: "topic" == 'mydevice/sensor1')
.groupBy(*)
|mean('field1')
|httpOut('sensor1')
连接后,应使用新分配的流名称或原始流名称:
sensor1
|join(sensor2)
.as('value1', 'value2')
.tolerance(1s)
|httpOut('join')
|eval(lambda: "value1.field1" - "value2.field2")
.as('diff')
|httpOut('diff')
|influxDBOut()
.create()
.database('mydb')
.retentionPolicy('myrp')
.measurement('diff')
其中平均字段是根据我之前的评论计算的字段。试试看
此外,为了进一步调试,请尝试将日志节点添加到您希望查看的位置
希望这有帮助!关于尝试在两个传感器中添加|平均节点,以计算场的平均值:
var sensor1 = stream
|from()
.database('telegraf')
.retentionPolicy('autogen')
.measurement('mqtt_consumer')
.where(lambda: "topic" == 'mydevice/sensor1')
.groupBy(*)
|mean('field1')
|httpOut('sensor1')
连接后,应使用新分配的流名称或原始流名称:
sensor1
|join(sensor2)
.as('value1', 'value2')
.tolerance(1s)
|httpOut('join')
|eval(lambda: "value1.field1" - "value2.field2")
.as('diff')
|httpOut('diff')
|influxDBOut()
.create()
.database('mydb')
.retentionPolicy('myrp')
.measurement('diff')
其中平均字段是根据我之前的评论计算的字段。试试看
此外,为了进一步调试,请尝试将日志节点添加到您希望查看的位置
希望这有帮助!关于您的问题解决了吗?因为我想我有一个类似的,不生产(或接收任何输出)。不,不是真的。我最终使用了另一种方法,在发送到Telegraf之前,我计算了所需的值。您解决了问题吗?因为我想我有一个类似的,不生产(或接收任何输出)。不,不是真的。我最终使用了另一种方法,在发送到Telegraf之前,我计算了所需的值。