通过比较两个测量值触发警报
Kapacitor 允许您基于两个或多个测量值创建警报。 在本指南中,我们将比较两个测量值,m1 和 m2,并在这两个测量值不同的时候创建一个警报。 除此之外,我们还将包含一个可以用于绘制这两个测量值之间百分比差异的查询。
比较测量并创建警报
以下的 TICKscript 流式处理 m1 和 m2 测量值,连接它们,比较它们,并在两个测量值不同的情况下触发警报。
var window_size = 1m
// Stream m1
var m1 = stream
|from()
.measurement('m1')
|window()
.period(window_size)
.every(window_size)
.align()
|count('value')
.as('value')
// Stream m2
var m2 = stream
|from()
.measurement('m2')
|window()
.period(window_size)
.every(window_size)
.align()
|count('value')
.as('value')
// Join m1 and m2
var data = m1
|join(m2)
.as('m1', 'm2')
// Compare the joined stream and alert when m1 and m2 values are different
data
|alert()
.crit(lambda: "m1.value" != "m2.value")
.message('values were not equal m1 value is {{ index .Fields "m1.value" }} m2 value is {{ index .Fields "m2.value" }}')
绘制测量值之间百分比差异的图
使用上面定义的 data 数据流来计算 m1 和 m2 之间的差异,将其转换为浮点数,将该差异除以 m1 和 m2 的实际值,然后将其乘以 100。这将为每个给出百分比差异。将差异存储为 diffs 测量中的新字段:
data
// Calculate the difference between m1 and m2
|eval(lambda: "m1.value" - "m2.value")
.as('value_diff')
.keep()
// Calculate the % difference of m1 and m2
|eval(lambda: (float("value_diff") / float("m1.value")) * 100.0, lambda: (float("value_diff") / float("m2.value")) * 100.0)
.as('diff_percentage_m1', 'diff_percentage_m2')
// Store the calculated differences in the 'diffs' measurement
|influxDBOut()
.measurement('diffs')
.database('mydb')
.create()
这可以用于创建类似于的可视化:

完整的 TICKscript
下面是完整的、未注释的TICKscript:
var window_size = 1m
var m1 = stream
|from()
.measurement('m1')
|window()
.period(window_size)
.every(window_size)
.align()
|count('value')
.as('value')
var m2 = stream
|from()
.measurement('m2')
|window()
.period(window_size)
.every(window_size)
.align()
|count('value')
.as('value')
var data = m1
|join(m2)
.as('m1', 'm2')
data
|alert()
.crit(lambda: "m1.value" != "m2.value")
.message('values were not equal m1 value is {{ index .Fields "m1.value" }} m2 value is {{ index .Fields "m2.value" }}')
data
|eval(lambda: "m1.value" - "m2.value")
.as('value_diff')
.keep()
|eval(lambda: (float("value_diff") / float("m1.value")) * 100.0, lambda: (float("value_diff") / float("m2.value")) * 100.0)
.as('diff_percentage_m1', 'diff_percentage_m2')
|influxDBOut()
.measurement('diffs')
.database('mydb')
.create()