Skip to content

Macros

Macros are shorthands to either portion of rules or pure SQL enhanced with placeholders.

Macros can be defined through the lnms command. Using the config.php is discouraged but supported. A macro can either be truthful (boolean test) or return a value (integer, float, string) that can be used in the rule.

Example for adding a a macro that returns the delta of a sensor:

lnms config:set alert.macros.rule.sensor_delta_current 'ABS(%sensors.sensor_current - %sensors.sensor_prev)'

Example for adding macro through config.php that is a boolean test:

$config['alert']['macros']['rule']['is_debian'] = '%devices.features ~ "@debian@"';

These rules can then be used in the alerting rules. Example:

... macros.sensor_delta_current > 10 AND macros.rule.is_debian = 1 ...

Writing Macros

The naming of the macro determines the type of the macro. If the macro name ends with _perc it interpreted as integer allowing for a comparison of the value. Any other name is a boolean test that will appear as yes or no selection in the rule.

The macro can contain placeholders that are replaced with the actual values when the rule is evaluated. The placeholders are prefixed with % that represents the actual value of the sensor, port, device, etc. For example %sensors.sensor_current will be replaced with the actual value of the sensor. While the prefix % is optional, it is recommended to use it to avoid ambiguity.

The contents of a macro can be any valid SQL statement or valid rule expression.

Pre-defined Macros

Billing

Over quota (Boolean)

Entity: macros.bill_quota_over_quota

Description: true or false if the bill is over quota.

Source: ((bills.total_data \/ bills.bill_quota)*100) && bills.bill_type = "quota"

Over usage (Boolean)

Entity: macros.bill_cdr_over_quota

Description: true or false if the bill is over usage.

Source: ((bills.rate_95th \/ bills.bill_cdr)*100) && bills.bill_type = "cdr"

Components

Component (Boolean)

Entity: macros.component

Description: Only select components that aren't deleted, ignored or disabled.

Source: (component.disabled = 0 && component.ignore = 0)

Component (Critical) (Boolean)

Entity: macros.component_critical

Description: Only select components that are in a critical state.

Source: (component.status = 2 && macros.component)

Component (Up) (Boolean)

Entity: macros.component_normal

Description: Only select components that are in a normal state.

Source: (component.status = 0 && macros.component)

Component (Warning) (Boolean)

Entity: macros.component_warning

Description: Only select components that are in a warning state.

Source: (component.status = 1 && macros.component)

Device

Device (Boolean)

Entity: macros.device

Description: Only select devices that aren't deleted, ignored or disabled.

Source: (devices.disabled = 0 AND devices.ignore = 0)

Device component down [JunOS]

Entity: macros.device_component_down_junos

Description: Device component is down such as Fan, PSU, etc for JunOS devices.

source. sensors.sensor_class = "state" && sensors.sensor_current != "6" && (sensors.sensor_type = "jnxFruState" || sensors.sensor_type = "jnxFruTable") && sensors.sensor_current != "2" && sensors.sensor_alert = "1"

Device component down [Cisco]

Entity: macros.device_component_down_cisco

Description: Device component is down such as Fan, PSU, etc for Cisco devices.

Example: sensors.sensor_current != "1" && sensors.sensor_current != "5" && sensors.sensor_type REGEXP "^cisco.*State$" && sensors.sensor_alert = "1"

Device is up (Boolean)

Entity: macros.device_up

Description: Only select devices that are up.

Implies: macros.device

Source: (devices.status = 1 AND macros.device)

Device is down (Boolean)

Entity: macros.device_down

Description: Only select devices that are down.

Implies: macros.device

Source: (devices.status = 0 AND macros.device)

Time

Now (Datetime)

Entity: macros.now

Description: Alias of MySQL built-in NOW() function.

Source: NOW()

Past N Minutes (Datetime)

Entity: macros.past_$m

Description: Returns a MySQL Timestamp dated $ Minutes in the past. $ can only be a supported Resolution.

Example: macros.past_5m is Last 5 Minutes.

Resolution: 5,10,15,30,60

Source: DATE_SUB(NOW(),INTERVAL $ MINUTE)

Packet Loss

Entity: (macros.packet_loss_5m)

Description: Packet loss % value for the device within the last 5 minutes. BROKEN, only return 100 (down) or 0.

Example: macros.packet_loss_5m > 50

Entity: (macros.packet_loss_15m)

Description: Packet loss % value for the device within the last 15 minutes. BROKEN, only return 100 (down) or 0.

Example: macros.packet_loss_15m > 50

Ports

Port (Boolean)

Entity: macros.port

Description: Only select ports that aren't deleted, ignored or disabled.

Source: (ports.deleted = 0 AND ports.ignore = 0 AND ports.disabled = 0)

Port out error percent (Decimal)

Entity: macros.port_out_error_perc

Description: Return port out error percent.

Source: ((ports.ifOutErrors_rate / ports.ifOutUcastPkts_rate)*100)

Port in error percent (Decimal)

Entity: macros.port_in_error_perc

Description: Return port in error percent.

Source: ((ports.ifInErrors_rate / ports.ifInUcastPkts_rate)*100)

Port is up (Boolean)

Entity: macros.port_up

Description: Only select ports that are up and also should be up.

Implies: macros.port

Source: (ports.ifOperStatus = up AND ports.ifAdminStatus = up AND macros.port)

Port is down (Boolean)

Entity: macros.port_down

Description: Only select ports that are down.

Implies: macros.port

Source: (ports.ifOperStatus != "up" AND ports.ifAdminStatus != "down" AND macros.port)

Port-Usage in Percent (Decimal)

Entity: macros.port_usage_perc

Description: Return port-usage (max value of in and out) in percent.

Source: ((SELECT IF(ports.ifOutOctets_rate>ports.ifInOctets_rate, ports.ifOutOctets_rate, ports.ifInOctets_rate)*8) / ports.ifSpeed)*100

Ports in usage perc (Int)

Entity: macros.port_in_usage_perc

Description:

Source: ((ports.ifInOctets_rate*8) \/ ports.ifSpeed)*100

Ports out usage perc (Int)

Entity: ((ports.ifOutOctets_rate*8)/ports.ifSpeed)*100

Description:

Source: ((ports.ifOutOctets_rate*8) \/ ports.ifSpeed)*100

Port now down (Boolean)

Entity: macros.port_now_down

Description: Ports that were previously up and have now gone down.

Source: ports.ifOperStatus != ports.ifOperStatus_prev && ports.ifOperStatus_prev = "up" && ports.ifAdminStatus = "up" && macros.port

Port has xDP neighbour (Boolean)

Entity: macros.port_has_xdp_neighbours

Description: Ports that have an xDP (lldp, cdp, etc) neighbour.

Source: (macros.port && links.local_port_id = ports.port_id)

Port has xDP neighbour already known in LibreNMS (Boolean)

Entity: macros.port_has_xdp_neighbours_device

Description: Ports that have an xDP (lldp, cdp, etc) neighbour that is already known in LibreNMS.

Source: (macros.port_has_xdp_neighbours && links.remote_port_id IS NOT NULL)

Sensors

Sensor (Boolean)

Entity: macros.sensor

Description: Only select sensors that aren't ignored.

Source: (sensors.sensor_alert = 1)

Entity: macros.sensor_port_link

Description: Only selects sensors that have a port linked to them, the port is up and the device is up.

Source: (sensors.entPhysicalIndex_measured = "port" AND sensors.entPhysicalIndex = ports.ifIndex AND macros.port_up AND macros.port_up)

State Sensors critical (Boolean)

Entity: macros.state_sensor_critical

Description: Only select state sensors that are in a critical state.

Source: (sensors.sensor_current = state_translations.state_value AND state_translations.state_generic_value = 2)

State Sensors ok (Boolean)

Entity: macros.state_sensor_ok

Description: Only select state sensors that are in a ok state.

Source: (sensors.sensor_current = state_translations.state_value AND state_translations.state_generic_value = 0)

State Sensors unknown (Boolean)

Entity: macros.state_sensor_unknown

Description: Only select state sensors that are in a unknown state.

Source: (sensors.sensor_current = state_translations.state_value AND state_translations.state_generic_value = 3)

State Sensors warning (Boolean)

Entity: macros.state_sensor_warning

Description: Only select state sensors that are in a warning state.

Source: (sensors.sensor_current = state_translations.state_value AND state_translations.state_generic_value = 1)

Misc

PDU over amperage [APC]

Entity: macros.pdu_over_amperage_apc

Description: APC PDU over amperage

Source: sensors.sensor_class = "current" && sensors.sensor_descr = "Bank Total" && sensors.sensor_current > sensors.sensor_limit && devices.os = "apc"

Custom Macros

Below are some examples of custom macros that can be be added.

Sensor Delta Current (Decimal)

Entity: macros.sensor_delta_current

Description: Returns the delta of a sensor.

Source: ABS(sensors.sensor_current - sensors.sensor_prev)

Sensor Change percent (Decimal)

Entity: macros.sensor_change_perc

Description: Returns the percent change of a sensor.

Source: ABS((CAST(sensors.sensor_current as double) - sensors.sensor_prev)/sensors.sensor_current * 100)