MAD-Based Anomaly Detection
The MAD Check plugin delivers real-time anomaly detection at ingest, using Median Absolute Deviation to catch outliers as data lands in InfluxDB 3. It helps teams spot abnormal behavior early, cut alert noise, and respond faster, with configurable thresholds and built-in notifications for infrastructure, IoT, and other fast moving telemetry.
Configuration
Plugin parameters may be specified as key-value pairs in the --trigger-arguments flag (CLI) or in the trigger_arguments field (API) when creating a trigger. Some plugins support TOML configuration files, which can be specified using the plugin’s config_file_path parameter.
If a plugin supports multiple trigger specifications, some parameters may depend on the trigger specification that you use.
Plugin metadata
This plugin includes a JSON metadata schema in its docstring that defines supported trigger types and configuration parameters. This metadata enables the InfluxDB 3 Explorer UI to display and configure the plugin.
Required parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
measurement |
string | required | Source measurement to monitor for anomalies |
mad_thresholds |
string | required | MAD threshold conditions. Format: field:k:window_count:threshold |
senders |
string | required | Dot-separated list of notification channels (e.g., “slack.discord”) |
MAD threshold parameters
| Component | Description | Example |
|---|---|---|
field_name |
The numeric field to monitor | temp |
k |
MAD multiplier for anomaly threshold | 2.5 |
window_count |
Number of recent points for MAD computation | 20 |
threshold |
Count (integer) or duration (e.g., “2m”, “1h”) | 5 or 2m |
Multiple thresholds are separated by @: temp:2.5:20:5@load:3:10:2m
Optional parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
influxdb3_auth_token |
string | env var | API token for InfluxDB 3 (or use INFLUXDB3_AUTH_TOKEN env var) |
state_change_count |
string | “0” | Maximum allowed value flips before suppressing notifications |
notification_count_text |
string | see Default notification templates | Template for count-based alerts with variables: $table, $field, $threshold_count, $tags |
notification_time_text |
string | see Default notification templates | Template for duration-based alerts with variables: $table, $field, $threshold_time, $tags |
notification_path |
string | “notify” | URL path for the notification sending plugin |
port_override |
string | “8181” | Port number where InfluxDB accepts requests |
Default notification templates
- Count: “MAD count alert: Field $field in $table outlier for $threshold_count consecutive points. Tags: $tags”
- Time: “MAD duration alert: Field $field in $table outlier for $threshold_time. Tags: $tags”
Notification channel parameters
Slack
| Parameter | Type | Required | Description |
|---|---|---|---|
slack_webhook_url |
string | Yes | Webhook URL from Slack |
slack_headers |
string | No | Base64-encoded HTTP headers |
Discord
| Parameter | Type | Required | Description |
|---|---|---|---|
discord_webhook_url |
string | Yes | Webhook URL from Discord |
discord_headers |
string | No | Base64-encoded HTTP headers |
HTTP
| Parameter | Type | Required | Description |
|---|---|---|---|
http_webhook_url |
string | Yes | Custom webhook URL for POST requests |
http_headers |
string | No | Base64-encoded HTTP headers |
SMS/WhatsApp (via Twilio)
| Parameter | Type | Required | Description |
|---|---|---|---|
twilio_sid |
string | Yes | Twilio Account SID (or use TWILIO_SID env var) |
twilio_token |
string | Yes | Twilio Auth Token (or use TWILIO_TOKEN env var) |
twilio_from_number |
string | Yes | Sender phone number |
twilio_to_number |
string | Yes | Recipient phone number |
TOML configuration
| Parameter | Type | Default | Description |
|---|---|---|---|
config_file_path |
string | none | TOML config file path relative to PLUGIN_DIR (required for TOML configuration) |
To use a TOML configuration file, set the PLUGIN_DIR environment variable and specify the config_file_path in the trigger arguments. This is in addition to the --plugin-dir flag when starting InfluxDB 3.
Example TOML configuration
For more information on using TOML configuration files, see the Using TOML Configuration Files section in the influxdb3_plugins/README.md.
Examples
Example 1: Basic count-based anomaly detection
Detect when temperature exceeds 2.5 MADs from the median for 5 consecutive points:
# Create trigger for count-based detection
influxdb3 create trigger \
--database sensors \
--path "gh:influxdata/mad_check/mad_check_plugin.py" \
--trigger-spec "all_tables" \
--trigger-arguments 'measurement=environment,mad_thresholds="temperature:2.5:20:5",senders=slack,slack_webhook_url="$SLACK_WEBHOOK_URL"' \
temp_anomaly_detector
# Write test data with an anomaly
influxdb3 write \
--database sensors \
"environment,room=office temperature=22.1"
influxdb3 write \
--database sensors \
"environment,room=office temperature=22.3"
influxdb3 write \
--database sensors \
"environment,room=office temperature=45.8" # Anomaly
# Continue writing anomalous values...
Set SLACK_WEBHOOK_URL to your Slack incoming webhook URL.
Expected output
- Plugin maintains a 20-point window of recent temperature values
- Computes median and MAD from this window
- When temperature exceeds median ± 2.5*MAD for 5 consecutive points, sends Slack notification
- Notification includes: “MAD count alert: Field temperature in environment outlier for 5 consecutive points. Tags: room=office”
Example 2: Duration-based anomaly detection with multiple fields
Monitor CPU load and memory usage with different thresholds:
# Create trigger with multiple thresholds
influxdb3 create trigger \
--database monitoring \
--path "gh:influxdata/mad_check/mad_check_plugin.py" \
--trigger-spec "all_tables" \
--trigger-arguments 'measurement=system_metrics,mad_thresholds="cpu_load:3:30:2m@memory_used:2.5:30:5m",senders=slack.discord,slack_webhook_url="$SLACK_WEBHOOK_URL",discord_webhook_url="$DISCORD_WEBHOOK_URL"' \
system_anomaly_detector
Set SLACK_WEBHOOK_URL and DISCORD_WEBHOOK_URL to your webhook URLs.
Expected output
- Monitors two fields independently:
cpu_load: Alerts when exceeds 3 MADs for 2 minutesmemory_used: Alerts when exceeds 2.5 MADs for 5 minutes
- Sends notifications to both Slack and Discord
Example 3: Anomaly detection with flip suppression
Prevent alert fatigue from rapidly fluctuating values:
# Create trigger with flip suppression
influxdb3 create trigger \
--database iot \
--path "gh:influxdata/mad_check/mad_check_plugin.py" \
--trigger-spec "all_tables" \
--trigger-arguments 'measurement=sensor_data,mad_thresholds="vibration:2:50:10",state_change_count=3,senders=http,http_webhook_url="$HTTP_WEBHOOK_URL",notification_count_text="Vibration anomaly detected on $table. Field: $field, Tags: $tags"' \
vibration_monitor
Set HTTP_WEBHOOK_URL to your HTTP webhook endpoint.
Expected output
- Detects vibration anomalies exceeding 2 MADs for 10 consecutive points
- If values flip between normal/anomalous more than 3 times in the 50-point window, suppresses notifications
- Sends custom formatted message to HTTP endpoint
Ready to get started?
Download InfluxDB 3 and have running in minutes.