Send alert email
This page documents an earlier version of InfluxDB. InfluxDB v2.7 is the latest stable version. View this page in the v2.7 documentation.
Send an alert email using a third-party service, such as SendGrid, Amazon Simple Email Service (SES), Mailjet, or Mailgun. To send an alert email, complete the following steps:
- Create a check to identify the data to monitor and the status to alert on.
- Set up your preferred email service (sign up, retrieve API credentials, and send test email):
- SendGrid: See Getting Started With the SendGrid API
- AWS Simple Email Service (SES): See Using the Amazon SES API. Your AWS SES request, including the
url
(endpoint), authentication, and the structure of the request may vary. For more information, see Amazon SES API requests and Authenticating requests to the Amazon SES API. - Mailjet: See Getting Started with Mailjet
- Mailgun: See Mailgun Signup
- Create an alert email task to call your email service and send an alert email.
In the procedure below, we use the Task page in the InfluxDB UI (user interface) to create a task. Explore other ways to create a task.
Create an alert email task
In the InfluxDB UI, select Tasks in the navigation menu on the left.
Tasks
Click Create Task.
In the Name field, enter a descriptive name, for example, Send alert email, and then enter how often to run the task in the Every field, for example,
10m
. For more detail, such as using cron syntax or including an offset, see Task configuration options.In the right panel, enter the following detail in your task script (see examples below):
- Import the Flux HTTP package.
- (Optional) Store your API key as a secret for reuse. First, add your API key as a secret, and then import the Flux InfluxDB Secrets package.
- Query the
statuses
measurement in the_monitoring
bucket to retrieve all statuses generated by your check. - Set the time range to monitor; use the same interval that the task is scheduled to run. For example,
range (start: -task.every)
. - Set the
_level
to alert on, for example,crit
,warn
,info
, orok
. - Use the
map()
function to evaluate the criteria to send an alert usinghttp.post()
. - Specify your email service
url
(endpoint), include applicable requestheaders
, and verify your requestdata
format follows the format specified for your email service.
Examples
SendGrid AWS SES Mailjet Mailgun
The example below uses the SendGrid API to send an alert email when more than 3 critical statuses occur since the previous task run.
import "http"
import "json"
// Import the Secrets package if you store your API key as a secret.
// For detail on how to do this, see Step 4 above.
import "influxdata/influxdb/secrets"
// Retrieve the secret if applicable. Otherwise, skip this line
// and add the API key as the Bearer token in the Authorization header.
SENDGRID_APIKEY = secrets.get(key: "SENDGRID_APIKEY")
numberOfCrits = from(bucket: "_monitoring")
|> range(start: -task.every)
|> filter(fn: (r) => r._measurement == "statuses" and r._level == "crit")
|> count()
numberOfCrits
|> map(
fn: (r) => if r._value > 3 then
{r with _value: http.post(
url: "https://api.sendgrid.com/v3/mail/send",
headers: {"Content-Type": "application/json", "Authorization": "Bearer ${SENDGRID_APIKEY}"},
data: json.encode(
v: {
"personalizations": [
{
"to": [
{
"email": "jane.doe@example.com"
}
]
}
],
"from": {
"email": "john.doe@example.com"
},
"subject": "InfluxDB critical alert",
"content": [
{
"type": "text/plain",
"value": "There have been ${r._value} critical statuses."
}
]
}
)
)}
else
{r with _value: 0},
)
The example below uses the AWS SES API v2 to send an alert email when more than 3 critical statuses occur since the last task run.
Your AWS SES request, including the url
(endpoint), authentication, and the structure of the request may vary. For more information, see Amazon SES API requests and Authenticating requests to the Amazon SES API. We recommend signing your AWS API requests using the Signature Version 4 signing process.
import "http"
import "json"
// Import the Secrets package if you store your API credentials as secrets.
// For detail on how to do this, see Step 4 above.
import "influxdata/influxdb/secrets"
// Retrieve the secrets if applicable. Otherwise, skip this line
// and add the API key as the Bearer token in the Authorization header.
AWS_AUTH_ALGORITHM = secrets.get(key: "AWS_AUTH_ALGORITHM")
AWS_CREDENTIAL = secrets.get(key: "AWS_CREDENTIAL")
AWS_SIGNED_HEADERS = secrets.get(key: "AWS_SIGNED_HEADERS")
AWS_CALCULATED_SIGNATURE = secrets.get(key: "AWS_CALCULATED_SIGNATURE")
numberOfCrits = from(bucket: "_monitoring")
|> range(start: -task.every)
|> filter(fn: (r) => r.measurement == "statuses" and r._level == "crit")
|> count()
numberOfCrits
|> map(
fn: (r) => if r._value > 3 then
{r with _value: http.post(
url: "https://email.your-aws-region.amazonaws.com/sendemail/v2/email/outbound-emails",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer ${AWS_AUTH_ALGORITHM}${AWS_CREDENTIAL}${AWS_SIGNED_HEADERS}${AWS_CALCULATED_SIGNATURE}"},
data: json.encode(v: {
"Content": {
"Simple": {
"Body": {
"Text": {
"Charset": "UTF-8",
"Data": "There have been ${r._value} critical statuses."
}
},
"Subject": {
"Charset": "UTF-8",
"Data": "InfluxDB critical alert"
}
}
},
"Destination": {
"ToAddresses": [
"john.doe@example.com"
]
}
}
)
)}
else
{r with _value: 0},
)
For details on the request syntax, see SendEmail API v2 reference.
The example below uses the Mailjet Send API to send an alert email when more than 3 critical statuses occur since the last task run.
To view your Mailjet API credentials, sign in to Mailjet and open the API Key Management page.
import "http"
import "json"
// Import the Secrets package if you store your API keys as secrets.
// For detail on how to do this, see Step 4 above.
import "influxdata/influxdb/secrets"
// Retrieve the secrets if applicable. Otherwise, skip this line
// and add the API keys as Basic credentials in the Authorization header.
MAILJET_APIKEY = secrets.get(key: "MAILJET_APIKEY")
MAILJET_SECRET_APIKEY = secrets.get(key: "MAILJET_SECRET_APIKEY")
numberOfCrits = from(bucket: "_monitoring")
|> range(start: -task.every)
|> filter(fn: (r) => r.measurement == "statuses" and "r.level" == "crit")
|> count()
numberOfCrits
|> map(
fn: (r) => if r._value > 3 then
{r with
_value: http.post(
url: "https://api.mailjet.com/v3.1/send",
headers: {
"Content-type": "application/json",
"Authorization": "Basic ${MAILJET_APIKEY}:${MAILJET_SECRET_APIKEY}"
},
data: json.encode(
v: {
"Messages": [
{
"From": {"Email": "jane.doe@example.com"},
"To": [{"Email": "john.doe@example.com"}],
"Subject": "InfluxDB critical alert",
"TextPart": "There have been ${r._value} critical statuses.",
"HTMLPart": "<h3>${r._value} critical statuses</h3><p>There have been ${r._value} critical statuses.",
},
],
},
),
),
}
else
{r with _value: 0},
)
The example below uses the Mailgun API to send an alert email when more than 3 critical statuses occur since the last task run.
To view your Mailgun API keys, sign in to Mailjet and open Account Security - API security. Mailgun requires that a domain be specified via Mailgun. A domain is automatically created for you when you first set up your account. You must include this domain in your url
endpoint (for example, https://api.mailgun.net/v3/YOUR_DOMAIN
or https://api.eu.mailgun.net/v3/YOUR_DOMAIN
. If you’re using a free version of Mailgun, you can set up a maximum of five authorized recipients (to receive email alerts) for your domain. To view your Mailgun domains, sign in to Mailgun and view the Domains page.
import "http"
import "json"
// Import the Secrets package if you store your API key as a secret.
// For detail on how to do this, see Step 4 above.
import "influxdata/influxdb/secrets"
// Retrieve the secret if applicable. Otherwise, skip this line
// and add the API key as the Bearer token in the Authorization header.
MAILGUN_APIKEY = secrets.get(key: "MAILGUN_APIKEY")
numberOfCrits = from(bucket: "_monitoring")
|> range(start: -task.every)
|> filter(fn: (r) => r["_measurement"] == "statuses")
|> filter(fn: (r) => r["_level"] == "crit")
|> count()
numberOfCrits
|> map(
fn: (r) => if r._value > 1 then
{r with _value: http.post(
url: "https://api.mailgun.net/v3/YOUR_DOMAIN/messages",
headers: {
"Content-type": "application/json",
"Authorization": "Basic api:${MAILGUN_APIKEY}"
},
data: json.encode(v: {
"from": "Username <mailgun@YOUR_DOMAIN_NAME>",
"to": "email@example.com",
"subject": "InfluxDB critical alert",
"text": "There have been ${r._value} critical statuses."
}
)
)}
else
{r with _value: 0},
)
Related
alert email notifications check