使用SideloadNode加载和引用变量

时间:2019-07-19 11:03:37

标签: influxdb telegraf kapacitor

我正在使用一个度量“ 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”带来新的数据点。

0 个答案:

没有答案