influxdata / kapacitor

Open source framework for processing, monitoring, and alerting on time series data
MIT License
2.31k stars 492 forks source link

difference 2 metrics #1791

Closed ookolodko closed 6 years ago

ookolodko commented 6 years ago

Hi. I have a problem with the difference of 2 indicators. Please, help. How can I implement it? Where do I make a mistake? Thanks.


var db = 'test_metrics' var rp = '90_days' var measurement = 'tets-game-test' var groupBy = ['server'] var whereFilter = lambda: ("attribute" == '99thPercentile') AND ("name" == 'game.test') AND ("server" == 'localhost')

var whereFilter2 = lambda: ("attribute" == '99thPercentile') AND ("name" == 'game.test2') AND ("server" == 'localhost')

var name = 'diff-test-alert' var idVar = name + ':{{.Group}}' var message = ' {{ .ID }} is {{ .Level }}, value: {{ index .Fields "value" }} ' var idTag = 'alertID' var levelTag = 'level' var messageField = 'message' var durationField = 'duration' var outputDB = 'chronograf' var outputRP = 'autogen' var outputMeasurement = 'alerts'

var triggerType = 'threshold' var details = 'Status: {{ .Level }}

var crit = 0

var data = stream |from() .database(db) .retentionPolicy(rp) .measurement(measurement) .groupBy(groupBy) .where(whereFilter) |eval(lambda: "value") .as('value')

var data2 = stream |from() .database(db) .retentionPolicy(rp) .measurement(measurement) .groupBy(groupBy) .where(whereFilter2) |eval(lambda: "value") .as('value')

var trigger = data // Join data and data2 for difference |join(data2) .as('data', 'data2') // difference |eval(lambda: "data2.value" - "data.value") // Give the resulting field a name .as('value') |alert() .crit(lambda: "value" > crit) .stateChangesOnly() .message(message) .id(idVar) .idTag(idTag) .levelTag(levelTag) .messageField(messageField) .durationField(durationField) .details(details) .log('/tmp/alerts.log')

trigger |eval(lambda: float("value")) .as('value') .keep() |influxDBOut() .create() .database(outputDB) .retentionPolicy(outputRP) .measurement(outputMeasurement) .tag('alertName', name) .tag('triggerType', triggerType)

trigger |httpOut('output')


ookolodko commented 6 years ago

Hi. The problem is solved.


var crit = 1

var data1 = stream |from() .database(db) .retentionPolicy(rp) .measurement(measurement) .groupBy(groupBy) .where(whereFilter) |eval(lambda: "value") .as('value')

var data2 = stream |from() .database(db) .retentionPolicy(rp) .measurement(measurement) .groupBy(groupBy) .where(whereFilter2) |eval(lambda: "value") .as('value')

var data = data1 |join(data2) .as('data1', 'data2')

var trigger = data |alert() .crit(lambda: "data1.value" - "data2.value" == crit)