0

我正在使用派生节点来计算网络设备的带宽利用率,下面是脚本。

我正在使用 where 子句,因为我想要针对特定​​ Ip 的特定接口发出警报。

// database
var database = 'router'

// measurement from where data is coming
var measurement = 'cisco_router'

// RP from where data is coming
var RP = 'autogen'

// which influx cluster to use
var clus = 'network'

// durations
var period = 7m

var every = 10s

// alerts
var crit = 320

var alertName = 'cisco_router_bandwidth_alert'

var triggerType = 'threshold'

batch
|query(''' SELECT (mean("bandwidth_in") * 8) as "value" FROM "router"."autogen"."cisco_router" where  host = '10.1.11.1' and ( interface_name = 'GigabitEthernet0/0/0' or  interface_name = 'GigabitEthernet0/0/1')  ''')
    .cluster('network')
    .period(7m)
    .every(6m)
    .groupBy(*)
|derivative('value')
    .unit(1s)
    .nonNegative()
    .as('value')
|alert()
    .crit(lambda: "value" > crit)
    .stateChangesOnly()
    .message(' {{.Level}}  for {{ index .Tags "device_name" }} on Port {{ index .Tags "name" }} {{ .Time.Local.Format "2006.01.02 - 15:04:05" }} ')
    .details('''

 <pre>
 ------------------------------------------------------------------
 CLIENT NAME : XXXXXXXX
 ENVIRONMENT : Prod
 DEVICE TYPE : Router
 CATEGORY : {{ index .Tags "type" }}
 IP ADDRESS : {{ index .Tags "host" }}
 DATE : {{ .Time.Local.Format "2006.01.02 - 15:04:05" }}
 INTERFACE NAME : {{ index .Tags "name" }}
 VALUE : {{ index .Fields "value" }}
 SEVERITY : {{.Level}}
 ------------------------------------------------------------------
 </pre>

''')
    .log('/tmp/chronograf/cisco_router_interface_alert.log')
    .levelTag('level')
    .idTag('id')
    .messageField('message')
    .email()
    .to('XXXXXXX')
|influxDBOut()
    .database('chronograf')
    .retentionPolicy(RP)
    .measurement('alerts')
    .tag('alertName', alertName)

但是当我做 kapacitor watch 并且在日志中没有显示任何错误时,它没有显示任何内容。

4

1 回答 1

0

导数() 和其他一些节点,如 stateDuration(),会在每个新的批处理查询中重置它们的状态,这与流模式相反,在流模式中,它们的状态一直保持不变。

实际上,这是因为在批处理模式下,此节点旨在仅跟踪当前批处理点内的变化。

由于您的查询返回单点 - 衍生()没有结果。

尝试将导数移动到查询。并使用 |httpOut() 节点来跟踪每一步的结果——这对理解 kapacitor 逻辑非常有帮助。

这是一些例子:

dbrp "telegraf"."autogen"
var q= batch
    |query('SELECT derivative(mean("bytes_recv"), 1s) AS "bytes_recv_1s" FROM "telegraf"."autogen"."net" WHERE time < now() AND "interface"=\'eth0\' GROUP BY time(10m) fill(none)')
        .period(10m)
        .every(30s).align()
        .groupBy(time(10m))
        .fill('none')
    |last('bytes_recv_1s').as('value')
    |httpOut('query')

请注意,有一个与查询解析相关的错误,需要在查询中指定 GROUP BY 并勾选 https://github.com/influxdata/kapacitor/issues/971 https://github.com/influxdata/kapacitor/issues/ 622

于 2019-04-12T08:30:21.777 回答