influxdata / chronograf

Open source monitoring and visualization UI for the TICK stack
https://www.influxdata.com/time-series-platform/chronograf/
Other
1.51k stars 258 forks source link

Kapacitor alert message are not completely escaped #764

Closed goller closed 7 years ago

goller commented 7 years ago

if I use this string as my Kapacitor alert message:

{{ index .Tags "load_balancer_name" }}

... the server returns a 500. It looks like the JSON sent to the server is not quite right. Here is the full JSON message I sent to the server:

{"id":"chronograf-v1-ad6e5bf9-a898-479a-ae43-97f15cab790f","query":{"id":"ada726fc-a2e0-4ec1-876f-f1247588997f","database":"telegraf","measurement":"cloudwatch_aws_elb","retentionPolicy":"autogen","fields":[{"field":"healthy_host_count_minimum","funcs":["min"]}],"tags":{},"groupBy":{"time":"1m","tags":["load_balancer_name"]},"areTagsAccepted":true},"every":"30s","alerts":[],"message":"{{ index .Tags \"load_balancer_name:","trigger":"threshold","values":{"operator":"equal to","value":"0"},"name":"ELB zero healthy hosts","tickscript":"var db = 'telegraf'\n\nvar rp = 'autogen'\n\nvar measurement = 'cloudwatch_aws_elb'\n\nvar groupBy = ['load_balancer_name']\n\nvar whereFilter = lambda: TRUE\n\nvar period = 1m\n\nvar every = 30s\n\nvar name = 'ELB zero healthy hosts'\n\nvar idVar = name + ':{{.Group}}'\n\nvar message = ''\n\nvar idTag = 'alertID'\n\nvar levelTag = 'level'\n\nvar messageField = 'message'\n\nvar durationField = 'duration'\n\nvar outputDB = 'chronograf'\n\nvar outputRP = 'autogen'\n\nvar outputMeasurement = 'alerts'\n\nvar triggerType = 'threshold'\n\nvar crit = 0\n\nvar data = stream\n    |from()\n        .database(db)\n        .retentionPolicy(rp)\n        .measurement(measurement)\n        .groupBy(groupBy)\n        .where(whereFilter)\n    |window()\n        .period(period)\n        .every(every)\n        .align()\n    |min('healthy_host_count_minimum')\n        .as('value')\n\nvar trigger = data\n    |alert()\n        .crit(lambda: \"value\" == crit)\n        .stateChangesOnly()\n        .message(message)\n        .id(idVar)\n        .idTag(idTag)\n        .levelTag(levelTag)\n        .messageField(messageField)\n        .durationField(durationField)\n\ntrigger\n    |influxDBOut()\n        .create()\n        .database(outputDB)\n        .retentionPolicy(outputRP)\n        .measurement(outputMeasurement)\n        .tag('alertName', name)\n        .tag('triggerType', triggerType)\n\ntrigger\n    |httpOut('output')\n","links":{"self":"/chronograf/v1/sources/2/kapacitors/2/rules/chronograf-v1-ad6e5bf9-a898-479a-ae43-97f15cab790f","kapacitor":"/chronograf/v1/sources/2/kapacitors/2/proxy?path=%2Fkapacitor%2Fv1%2Ftasks%2Fchronograf-v1-ad6e5bf9-a898-479a-ae43-97f15cab790f","output":"/chronograf/v1/sources/2/kapacitors/2/proxy?path=%2Fkapacitor%2Fv1%2Ftasks%2Fchronograf-v1-ad6e5bf9-a898-479a-ae43-97f15cab790f%2Foutput"},"queryID":"ada726fc-a2e0-4ec1-876f-f1247588997f"}

... here is the portion that is not JSON:

,"message":"{{ index .Tags \"load_balancer_name:","trigger":"threshold",
goller commented 7 years ago

My cache wasn't fresh. I hard-reset fixed this.