我正在使用一个度量“ mem”,该度量仅用于引用一个不会经常改变的值,基本上它是服务器的“总”内存),然后我想与Available_MByte一起使用使用join从另一个度量中获取Available_Memory_Percentage。
为简单起见: 可以说,我们已经为5台主机创建并保存了以下5个文件,并使用telegraf或其他插件加载了值(TotalMemory),并且使这些文件每12小时更新一次。
File#1
FileName: host-host_1.yaml
TotalMemory: 10245
File#2
FileName: host-host_2.yaml
TotalMemory: 20245
File#3`enter code here`
FileName: host-host_3.yaml
TotalMemory: 30245
File#4
FileName: host-host_4.yaml
TotalMemory: 40245
File#5
FileName: host-host_5.yaml
TotalMemory: 50245
现在,我可以在这5个主机的报价脚本中使用 SideloadNode 来为匹配的主机 var groupBy = ['host'] 加载TotalMemory,我将然后参考并用于计算Available_Memory_Percentage。
我尝试加入滴答脚本,但由于根据telegraf的推荐测量,“ mem”使用WMI查询数据,这是每分钟执行的昂贵操作,因此我们每15分钟收集一次“ mem”数据。 但这需要警报中的高延迟,因为每15分钟就会收到一个新的数据点,因此我们发现两个警报之间相差15分钟。
我在https://docs.influxdata.com/kapacitor/v1.5/nodes/sideload_node/上进行了阅读 和 How to define Alerts with exception in InfluxDB/Kapacitor
但是对我来说,如何实现尚不明确。
下面的示例滴答脚本摘录中的以下几行首先使用 m1.total 将值转换为兆字节,然后将百分比计算为 ava_mem_perc
|eval(
lambda: float("m1.total") / float(mb),
lambda: float("m2.Available_MBytes") / float("total_mbytes") * 100.0
)
.as('total_mbytes', 'ava_mem_perc')
.keep()
|log()
|stateDuration(lambda: "ava_mem_perc" <= memory_percentage_alert_threshold)
问号样本
var db = 'ABC'
var rp = 'XYZ'
var measurement = 'mem'
var measurement1 = 'Memory'
var groupBy = ['host']
var name = 'Available_Memory'
var idVar = name
var mem_window_period = 1m
var memory_window_period = 1m
var window_every = 10s
var metric_nm = 'Memory Usage in %'
var memory_percentage_alert_threshold = 90
var mb = 1000 * 1000
var crit_state_duration = 0
var message = 'test'
var idTag = 'alertID'
var levelTag = 'level'
var messageField = 'message'
var durationField = 'duration'
var outputDB = 'test_inf'
var outputRP = 'autogen'
var outputMeasurement = 'Memory_Usage_alerts111'
var triggerType = 'threshold'
// Stream m1
var m1 = stream
|from()
.measurement('mem')
.groupBy('host')
|window()
.period(mem_window_period)
.every(window_every)
.align()
|last('total')
.as('total')
|log()
//流m2
var m2 = stream
|from()
.measurement('Memory')
.groupBy('host')
|window()
.period(memory_window_period)
.every(window_every)
.align()
|last('Available_MBytes')
.as('Available_MBytes')
// .usePointTimes()
|log()
//加入m1和m2
var data = m1
|join(m2)
.as('m1', 'm2')
.tolerance(30m)
.fill('null')
.streamName('Memory')
|eval(
lambda: float("m1.total") / float(mb),
lambda: float("m2.Available_MBytes") / float("total_mbytes") * 100.0
)
.as('total_mbytes', 'ava_mem_perc')
.keep()
|log()
|stateDuration(lambda: "ava_mem_perc" <= memory_percentage_alert_threshold)
.unit(1s)
|log()
// data
|alert()
.details('N/A')
.crit(lambda: "state_duration" >= 2)
.message(message)
.id(idVar)
.idTag(idTag)
.levelTag(levelTag)
.messageField(messageField)
.durationField(durationField)
//.post()
//.header()
// .stateChangesOnly()
|httpOut('output')
|influxDBOut()
.create()
.database(outputDB)
.retentionPolicy(outputRP)
.measurement(outputMeasurement)
.tag('alertName', name)
.tag('triggerType', triggerType)
我确实看到了警报,但延迟时间最多为30分钟,此外,由于“总计”不会经常更改,因此,如果我们可以在“报价”中引用“总值”,则可以改善延迟的性能等待流为测量“ mem”带来新的数据点。