Include images in HTTP POST notifications

Hello everyone. Can we include images of graph, when sending, for example, HTTP POST notifications?
Also, can we group notifications like if some metric is high and crit, can I include current value of cpu, ram, network status in one message?
It will be simplier to investigate a problem.

Hello @colt.mister,
No you can’t send images of graphs. That would be really cool though. I encourage you to create a feature request here:

Yes you can send multiple values in one message. For example that type of task might look like this:

(this specific tasks sees whether data is within a standard deviation for the threshold so it’s a little more complicated)

// Step 1: import Flux packages
import "influxdata/influxdb/monitor"
import "influxdata/influxdb/schema"
import "math"

// Step 2: define your task options. 
// Always include an offset to avoid read and write conflicts. Period and every are defined by the every parameter.
option task = {
name: "generic",
every: 10s,
offset: 2s,
}

// Step 3: Define your thresholds.
infoVal = <info_level>
warnVal = <warn_level>
critVal = <crit_level>
infoSig = 1.0
warnSig = 2.0
critSig = 3.0

// Step 4: Query for data.
Data is grouped by tags or host by default so no need to groupBy('host') as with line 28 in generic_batch_example.tick
data = from(bucket: "<bucket>")
   |> range(start: -task.every)
   |> filter(fn: (r) => r._measurement == "<measurement>")
   |> filter(fn: (r) => r.host == "hostValue1" or r.host == "hostValue2")
   |> filter(fn: (r) => r._field == "stat")

// Step 5: Calculate the mean and standard deviation instead of .sigma and extract the scalar value. 

// Calculate mean from sample and extract the value with findRecord()
mean_val = (data
   |> mean(column: "_value")
   // Insert yield() statements to visualize how your data is being transformed. 
   // |> yield(name: "mean_val")
   |> findRecord(fn: (key) => true, idx: 0))._value

// Calculate standard deviation from sample and extract the value with findRecord()
stddev_val = (data
   |> stddev()
   // Insert yield() statements to visualize how your data is being transformed. 
   // |> yield(name: "stddev")
   |> findRecord(fn: (key) => true, idx: 0))._value

// Step 6: Create a custom message to alert on data
alert = (level, type, eventValue, extraInfo)  => {
slack.message(
      // Will send alerts to the #notifications-testing channel in the InfluxData Slack Community
      url: "https://hooks.slack.com/services/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 ",
      text: "An alert \"${string(v: type)}\" event has occurred! The number of field values= \"${string(v: eventValue)}\". And here's some extra info: \"${string(v: eventValue)}\".",
      color: "warning",
      )
      return level
      }
data
   // Step 7: Map across values and return the number of stddev to the level as well as a custom slack message defined in the alert() function.
   |> map(
       fn: (r) => ({r with
level: if r._value < mean_val + math.abs(x: stddev_val) and r._value > mean_val - math.abs(x: stddev_val) or r._value > infoVal then
             alert(level: 1, type: info, eventValue: r._value, extraInfo: r.<whatever column val>)
           else if r._value < mean_val + math.abs(x: stddev_val) * float(v: 2) and r.airTemperature > mean_val - math.abs(x: stddev_val) * float(v: 2) or r._value > okVal then
             alert(level: 2, type: ok, eventValue: r._value, extraInfo: r.<whatever column val>)
           else if r._value < mean_val + math.abs(x: stddev_val) * float(v: 3) and r.airTemperature > mean_val - math.abs(x: stddev_val) * float(v: 3) or r._value > warnVal then
             alert(level: 3, type: warn, eventValue: r._value, extraInfo: r.<whatever column val>)
           else
              alert(level: 4, type: crit, eventValue: r._value, extraInfo: r.<whatever column val>)
)

But pay attention to:

      text: "An alert \"${string(v: type)}\" event has occurred! The number of field values= \"${string(v: eventValue)}\". And here's some extra info: \"${string(v: eventValue)}\".",
      color: "warning",
      )
      return level
      }

And how that’s called in the last line or map() funciton.

Here’s the blog that explains the script:

I don’t know where your understanding of FLux is, so please let me know if you need more help! Or what does and doesn’t make sense.

1 Like

Hello @Anaisdg!
Thanks for the script, I appreciate your time for this. We will see, how we can use it.
Nice tip to create a feature request for the Flux, I will create it.

@colt.mister,
Of course! Please let me know if you have any more questions!