# Cisco SD-WAN by HTTP ## Overview This template is designed for the effortless deployment of Cisco SD-WAN monitoring by Zabbix via HTTP and doesn't require any external scripts. ## Requirements Zabbix version: 7.0 and higher. ## Tested versions This template has been tested on: - Cisco SD-WAN 20.6.0 ## Configuration > Zabbix should be configured according to the instructions in the [Templates out of the box](https://www.zabbix.com/documentation/7.0/manual/config/templates_out_of_the_box) section. ## Setup 1. Put your username and password from Cisco SD-WAN vManage into {$SDWAN.API.USERNAME} and {$SDWAN.API.PASSWORD} macros. 2. Set your Cisco SD-WAN vManage URL as {$SDWAN.API.URL} macro value. **NOTES** The Cisco SD-WAN API token will be generated automatically by the Authentication item every {$SDWAN.AUTH.FREQUENCY}. Don't change the {$SDWAN.AUTH.FREQUENCY} macro value if it's not required. The generated Cisco SD-WAN API token and the session ID will be used in all Cisco SD-WAN templates and items. These values will be kept in {$SDWAN.AUTH.TOKEN} and {$SDWAN.AUTH.SESSION} macros of each discovered host. **IMPORTANT** Values of {$SDWAN.AUTH.TOKEN} and {$SDWAN.AUTH.SESSION} macros are stored as plain (not secret) text by default. >Please, refer to the [vendor documentation](https://www.cisco.com/c/en/us/td/docs/routers/sdwan/configuration/sdwan-xe-gs-book/cisco-sd-wan-API-cross-site-request-forgery-prevention.html) about the Cisco SD-WAN REST API Token-Based Authentication. ### Macros used |Name|Description|Default| |----|-----------|-------| |{$SDWAN.API.URL}|
Cisco SD-WAN Monitor API URL.
|| |{$SDWAN.API.USERNAME}|Cisco SD-WAN Monitor API username.
|| |{$SDWAN.API.PASSWORD}|Cisco SD-WAN Monitor API password.
|| |{$SDWAN.AUTH.FREQUENCY}|The update interval for the Cisco SD-WAN Authentication item, which also equals the access token regeneration request frequency. Check the template documentation notes carefully for more details.
|`1h`| |{$SDWAN.DATA.TIMEOUT}|A response timeout for an API.
|`15s`| |{$SDWAN.DEVICE.NAME.MATCHES}|This macro is used in device discovery. Can be overridden on the host or linked template level.
|`.*`| |{$SDWAN.DEVICE.NAME.NOT_MATCHES}|This macro is used in device discovery. Can be overridden on the host or linked template level.
|`CHANGE_IF_NEEDED`| |{$SDWAN.HTTP_PROXY}|HTTP proxy for API requests. You can specify it using the format [protocol://][username[:password]@]proxy.example.com[:port]. See the documentation at https://www.zabbix.com/documentation/7.0/manual/config/items/itemtypes/http
|| ### Items |Name|Description|Type|Key and additional info| |----|-----------|----|-----------------------| |SD-WAN: Authentication|Cisco SD-WAN authentication with service account parameters and temporary-generated token usage.
Returns an authentication token and session id; it is required only once and is used for all dependent script items.
A session will expire after 30 minutes of inactivity or after 24 hours, which is the total lifespan of a session.
Check the template documentation for the details.
|Script|sd_wan.authentication| |SD-WAN: Authentication item errors|Item for gathering all the data item errors.
|Dependent item|sd_wan.auth.errors**Preprocessing**
JSON Path: `$.error`
Discard unchanged with heartbeat: `1h`
Item for gathering all devices from Cisco SD-WAN API.
|Dependent item|sd_wan.get.devices**Preprocessing**
JavaScript: `The text is too long. Please see the template.`
Item for gathering all the data item errors.
|Dependent item|sd_wan.get.devices.errors**Preprocessing**
JSON Path: `$.error`
Discard unchanged with heartbeat: `1h`
Number of invalid certificates.
|Dependent item|sd_wan.invalid_certificates**Preprocessing**
JSON Path: `$.devices[?(@.cert_valid != "Valid")].length()`
The total number of all devices.
|Dependent item|sd_wan.total.devices**Preprocessing**
JSON Path: `$.devices.length()`
Discard unchanged with heartbeat: `1h`
The total number of vEdge devices.
|Dependent item|sd_wan.vedge.devices**Preprocessing**
JSON Path: `$.devices[?(@.type == "vedge")].length()`
Discard unchanged with heartbeat: `1h`
The total number of vBond devices.
|Dependent item|sd_wan.vbond.devices**Preprocessing**
JSON Path: `$.devices[?(@.type == "vbond")].length()`
Discard unchanged with heartbeat: `1h`
The total number of vSmart devices.
|Dependent item|sd_wan.vsmart.devices**Preprocessing**
JSON Path: `$.devices[?(@.type == "vsmart")].length()`
Discard unchanged with heartbeat: `1h`
The total number of vManage devices.
|Dependent item|sd_wan.vmanage.devices**Preprocessing**
JSON Path: `$.devices[?(@.type == "vmanage")].length()`
Discard unchanged with heartbeat: `1h`
Discovering devices from Cisco SD-WAN API.
|Dependent item|sd_wan.devices.discovery**Preprocessing**
JSON Path: `$.devices`
Cisco SD-WAN Monitor API URL.
|| |{$SDWAN.TOKEN}|Cisco SD-WAN Monitor API token.
|| |{$SDWAN.DATA.TIMEOUT}|Response timeout for an API.
|`15s`| |{$SDWAN.CPU.UTIL.CRIT}|Critical threshold of the CPU utilization, expressed in %.
|`90`| |{$SDWAN.MEMORY.UTIL.MAX}|Critical threshold of the memory utilization, expressed in %.
|`90`| |{$SDWAN.MEMORY.AVAILABLE.MIN}|This macro is used as a threshold in the memory available trigger.
|`100K`| |{$SDWAN.IF.UTIL.MAX}|This macro is used as a threshold in the interface utilization trigger. Can be used with the interface name as context.
|`90`| |{$SDWAN.IF.ERRORS.WARN}|Threshold of the error packets rate for the warning trigger. Can be used with the interface name as context.
|`2`| |{$SDWAN.FS.PUSED.MAX.CRIT}|Critical threshold of the filesystem utilization. Can be used with the filesystem name as context.
|`90`| |{$SDWAN.FS.PUSED.MAX.WARN}|Warning threshold of the filesystem utilization. Can be used with the filesystem name as context.
|`80`| |{$SDWAN.LA.PER.CPU.MAX.WARN}|Load per CPU considered sustainable. Tune if needed.
|`1.5`| |{$SDWAN.LLD.FILTER.FSNAME.MATCHES}|Filter of discoverable filesystems by name.
|`.*`| |{$SDWAN.LLD.FILTER.FSNAME.NOT_MATCHES}|Filter to exclude discoverable filesystems by name.
|`CHANGE_IF_NEEDED`| |{$SDWAN.LLD.FILTER.IFNAME.MATCHES}|Filter of discoverable interfaces by name.
|`.*`| |{$SDWAN.LLD.FILTER.IFNAME.NOT_MATCHES}|Filter to exclude discoverable interfaces by name.
|`CHANGE_IF_NEEDED`| |{$SDWAN.HTTP_PROXY}|HTTP proxy for API requests. You can specify it using the format [protocol://][username[:password]@]proxy.example.com[:port]. See the documentation at https://www.zabbix.com/documentation/7.0/manual/config/items/itemtypes/http
|| |{$IFCONTROL}|Macro for operational state of the interface for the link down trigger. Can be used with the interface name as context.
|`1`| |{$SDWAN.ROUTES.FREQUENCY}|Update interval for the Routes item, expressed in hours.
|`1h`| ### Items |Name|Description|Type|Key and additional info| |----|-----------|----|-----------------------| |SD-WAN: Get interfaces data|Item for gathering device interfaces from Cisco SD-WAN API.
|Script|sd_wan.get.interfaces| |SD-WAN: Device interfaces item errors|Item for gathering errors of the device interfaces.
|Dependent item|sd_wan.get.interfaces.errors**Preprocessing**
JSON Path: `$.error`
Discard unchanged with heartbeat: `1h`
Item for gathering device routes from Cisco SD-WAN API.
|Script|sd_wan.get.routes| |SD-WAN: Device routes item errors|Item for gathering errors of the device routes.
|Dependent item|sd_wan.get.routes.errors**Preprocessing**
JSON Path: `$.error`
Discard unchanged with heartbeat: `1h`
Item for gathering device data from Cisco SD-WAN API.
|Script|sd_wan.get.device| |SD-WAN: Device data item errors|Item for gathering errors of the device item.
|Dependent item|sd_wan.get.device.errors**Preprocessing**
JSON Path: `$.error`
Discard unchanged with heartbeat: `1h`
The number of control connections.
|Dependent item|sd_wan.device.control_conn**Preprocessing**
JSON Path: `$.controlConnections`
⛔️Custom on fail: Set value to: `0`
Matches regular expression: `^[0-9]+$`
⛔️Custom on fail: Set value to: `0`
Validity status of the device certificate.
|Dependent item|sd_wan.device.certificate_validity**Preprocessing**
JSON Path: `$["certificate-validity"]`
⛔️Custom on fail: Set value to: `Unknown`
JavaScript: `The text is too long. Please see the template.`
Total memory, expressed in bytes.
|Dependent item|sd_wan.device.memory.total**Preprocessing**
JSON Path: `$.mem_total`
The amount of physical memory (in bytes) immediately available for the allocation to a process or for a system use in the device.
|Dependent item|sd_wan.device.memory.avail**Preprocessing**
JSON Path: `$.mem_free`
The amount of physical memory (in bytes) used by the kernel buffers.
|Dependent item|sd_wan.device.memory.buffers**Preprocessing**
JSON Path: `$.mem_buffers`
The amount of physical memory (in bytes) used by the page cache and slabs.
|Dependent item|sd_wan.device.memory.cached**Preprocessing**
JSON Path: `$.mem_cached`
The amount of physical memory (in bytes) used by applications on the device.
|Dependent item|sd_wan.device.memory.used**Preprocessing**
JSON Path: `$.mem_used`
Calculated percentage of the memory used, in %.
|Calculated|sd_wan.device.memory.util| |SD-WAN: Number of CPUs|The total number of CPU.
|Dependent item|sd_wan.device.cpu.num**Preprocessing**
JSON Path: `$.total_cpu_count`
The average number of processes being or waiting executed over past 1 minute.
|Dependent item|sd_wan.device.cpu.load[avg1]**Preprocessing**
JSON Path: `$.min1_avg`
The average number of processes being or waiting executed over past 5 minutes.
|Dependent item|sd_wan.device.cpu.load[avg5]**Preprocessing**
JSON Path: `$.min5_avg`
The average number of processes being or waiting executed over past 15 minutes.
|Dependent item|sd_wan.device.cpu.load[avg15]**Preprocessing**
JSON Path: `$.min15_avg`
The time the CPU has spent doing nothing.
|Dependent item|sd_wan.device.cpu.util[idle]**Preprocessing**
JSON Path: `$.cpu_idle`
The time the CPU has spent running the kernel and its processes.
|Dependent item|sd_wan.device.cpu.util[system]**Preprocessing**
JSON Path: `$.cpu_system`
The time the CPU has spent running users' processes that are not niced.
|Dependent item|sd_wan.device.cpu.util[user]**Preprocessing**
JSON Path: `$.cpu_user`
CPU utilization, expressed in %.
|Dependent item|sd_wan.device.cpu.util**Preprocessing**
JavaScript: `return (100 - value);`
Reachability to the vManager and/or the entire network.
|Dependent item|sd_wan.device.reachability**Preprocessing**
JSON Path: `$.reachability`
JavaScript: `The text is too long. Please see the template.`
The device current state.
|Dependent item|sd_wan.device.state**Preprocessing**
JSON Path: `$.state`
JavaScript: `The text is too long. Please see the template.`
The description of the device current state.
|Dependent item|sd_wan.device.state_descr**Preprocessing**
JSON Path: `$.state_description`
Discard unchanged with heartbeat: `1h`
The device operating system.
|Dependent item|sd_wan.device.os**Preprocessing**
JSON Path: `$["device-os"]`
Discard unchanged with heartbeat: `1d`
The architecture of the operating system.
|Dependent item|sd_wan.device.arch**Preprocessing**
JSON Path: `$.platform`
Discard unchanged with heartbeat: `1d`
The device role in the network.
|Dependent item|sd_wan.device.role**Preprocessing**
JSON Path: `$.device_role`
⛔️Custom on fail: Set value to: `-1`
The model name of the device.
|Dependent item|sd_wan.device.model**Preprocessing**
JSON Path: `$["device-model"]`
The total number of processes in any state.
|Dependent item|sd_wan.device.proc.num**Preprocessing**
JSON Path: `$.procs`
The device serial number.
|Dependent item|sd_wan.device.serialnumber**Preprocessing**
JSON Path: `$["board-serial"]`
The system host name.
|Dependent item|sd_wan.device.hostname**Preprocessing**
JSON Path: `$["host-name"]`
Discard unchanged with heartbeat: `12h`
The system uptime is calculated on the basis of boot time.
|Dependent item|sd_wan.device.uptime**Preprocessing**
JSON Path: `$["uptime-date"]`
JavaScript: `The text is too long. Please see the template.`
The version of the device software.
|Dependent item|sd_wan.device.version**Preprocessing**
JSON Path: `$.version`
Discard unchanged with heartbeat: `12h`
The system is running out of free memory.
|`min(/Cisco SD-WAN device by HTTP/sd_wan.device.memory.util,5m)>{$SDWAN.MEMORY.UTIL.MAX}`|Average|**Depends on**:The load average per CPU is too high. The system might be slow to respond.
|`min(/Cisco SD-WAN device by HTTP/sd_wan.device.cpu.load[avg1],5m)/last(/Cisco SD-WAN device by HTTP/sd_wan.device.cpu.num)>{$SDWAN.LA.PER.CPU.MAX.WARN} and last(/Cisco SD-WAN device by HTTP/sd_wan.device.cpu.load[avg5])>0 and last(/Cisco SD-WAN device by HTTP/sd_wan.device.cpu.load[avg15])>0`|Average|| |SD-WAN: High CPU utilization|CPU utilization is too high. The system might be slow to respond.
|`min(/Cisco SD-WAN device by HTTP/sd_wan.device.cpu.util,5m)>{$SDWAN.CPU.UTIL.CRIT}`|Warning|**Depends on**:Device is not reachable to the vManager and/or the entire network.
|`last(/Cisco SD-WAN device by HTTP/sd_wan.device.reachability)<>0`|Warning|| |SD-WAN: Device state is not green|The device current state is not green.
|`last(/Cisco SD-WAN device by HTTP/sd_wan.device.state)<>0 and length(last(/Cisco SD-WAN device by HTTP/sd_wan.device.state_descr))>0`|Average|| |SD-WAN: Operating system description has changed|Operating system description has changed. Possible reasons that system has been updated or replaced. Ack to close.
|`last(/Cisco SD-WAN device by HTTP/sd_wan.device.os,#1)<>last(/Cisco SD-WAN device by HTTP/sd_wan.device.os,#2) and length(last(/Cisco SD-WAN device by HTTP/sd_wan.device.os))>0`|Info|**Manual close**: YesDevice serial number has changed. Acknowledge to close the problem manually.
|`last(/Cisco SD-WAN device by HTTP/sd_wan.device.serialnumber,#1)<>last(/Cisco SD-WAN device by HTTP/sd_wan.device.serialnumber,#2) and length(last(/Cisco SD-WAN device by HTTP/sd_wan.device.serialnumber))>0`|Info|**Manual close**: Yes| |SD-WAN: System name has changed|System name has changed. Ack to close.
|`last(/Cisco SD-WAN device by HTTP/sd_wan.device.hostname,#1)<>last(/Cisco SD-WAN device by HTTP/sd_wan.device.hostname,#2) and length(last(/Cisco SD-WAN device by HTTP/sd_wan.device.hostname))>0`|Info|**Manual close**: Yes| |SD-WAN: Device has been restarted|The host uptime is less than 10 minutes
|`last(/Cisco SD-WAN device by HTTP/sd_wan.device.uptime)<10m`|Info|**Manual close**: Yes| ### LLD rule Network interfaces discovery |Name|Description|Type|Key and additional info| |----|-----------|----|-----------------------| |Network interfaces discovery|Discovering device interfaces from Cisco SD-WAN API.
|Dependent item|sd_wan.interfaces.discovery**Preprocessing**
JavaScript: `The text is too long. Please see the template.`
Discard unchanged with heartbeat: `3h`
Item for gathering data for the {#IFNAME} interface.
|Dependent item|sd_wan.device.if.get_data["{#IFKEY}"]**Preprocessing**
JSON Path: `$.data[?(@["vdevice-dataKey"] == "{#IFKEY}")].first()`
⛔️Custom on fail: Discard value
Current admin status of the interface.
|Dependent item|sd_wan.device.if.adm.status["{#IFKEY}"]**Preprocessing**
JSON Path: `$["if-admin-status"]`
JavaScript: `The text is too long. Please see the template.`
Current operational status of the interface.
|Dependent item|sd_wan.device.if.status["{#IFKEY}"]**Preprocessing**
JSON Path: `$["if-oper-status"]`
JavaScript: `The text is too long. Please see the template.`
Current bandwidth of the interface.
|Dependent item|sd_wan.device.if.speed["{#IFKEY}"]**Preprocessing**
JSON Path: `$["speed-mbps"]`
Custom multiplier: `1000000`
The total number of octets received on the interface.
|Dependent item|sd_wan.device.if.in["{#IFKEY}"]**Preprocessing**
JSON Path: `$["rx-octets"]`
⛔️Custom on fail: Set value to: `0`
Custom multiplier: `8`
The total number of octets transmitted out of the interface.
|Dependent item|sd_wan.device.if.out["{#IFKEY}"]**Preprocessing**
JSON Path: `$["tx-octets"]`
⛔️Custom on fail: Set value to: `0`
Custom multiplier: `8`
The number of inbound packets that were chosen to be discarded.
|Dependent item|sd_wan.device.if.in.discards["{#IFKEY}"]**Preprocessing**
JSON Path: `$["rx-drops"]`
⛔️Custom on fail: Set value to: `0`
The number of inbound IPv6 packets that were chosen to be discarded.
|Dependent item|sd_wan.device.if.in.v6.discards["{#IFKEY}"]**Preprocessing**
JSON Path: `$["ipv6-rx-drops"]`
⛔️Custom on fail: Set value to: `-1`
The number of inbound packets that were contain errors.
|Dependent item|sd_wan.device.if.in.errors["{#IFKEY}"]**Preprocessing**
JSON Path: `$["rx-errors"]`
⛔️Custom on fail: Set value to: `0`
The number of inbound IPv4 packets that were contain errors.
|Dependent item|sd_wan.device.if.in.v6.errors["{#IFKEY}"]**Preprocessing**
JSON Path: `$["ipv6-rx-errors"]`
⛔️Custom on fail: Set value to: `-1`
The number of outbound packets that were chosen to be discarded.
|Dependent item|sd_wan.device.if.out.discards["{#IFKEY}"]**Preprocessing**
JSON Path: `$["tx-drops"]`
⛔️Custom on fail: Set value to: `0`
The number of outbound IPv6 packets that were chosen to be discarded.
|Dependent item|sd_wan.device.if.out.v6.discards["{#IFKEY}"]**Preprocessing**
JSON Path: `$["ipv6-tx-drops"]`
⛔️Custom on fail: Set value to: `-1`
The number of outbound packets that were contain errors.
|Dependent item|sd_wan.device.if.out.errors["{#IFKEY}"]**Preprocessing**
JSON Path: `$["tx-errors"]`
⛔️Custom on fail: Set value to: `0`
The number of outbound IPv6 packets that were contain errors.
|Dependent item|sd_wan.device.if.out.v6.errors["{#IFKEY}"]**Preprocessing**
JSON Path: `$["ipv6-tx-errors"]`
⛔️Custom on fail: Set value to: `-1`
This trigger expression works as follows:
1. It can be triggered if the operational status is down.
2. `{$IFCONTROL:"{#IFNAME}"}=1` - a user can redefine context macro to value - 0. That marks this interface as not important. No new trigger will be fired if this interface is down.
3. `{TEMPLATE_NAME:METRIC.diff()}=1` - the trigger fires only if the operational status was up to (1) sometime before (so, it does not fire for the 'eternal off' interfaces).
WARNING: If closed manually, it will not fire again on the next poll because of .diff.
This Ethernet connection has transitioned down from its known maximum speed. This might be a sign of autonegotiation issues. Acknowledge to close the problem manually.
|`change(/Cisco SD-WAN device by HTTP/sd_wan.device.if.speed["{#IFKEY}"])<0 and last(/Cisco SD-WAN device by HTTP/sd_wan.device.if.speed["{#IFKEY}"])>0 and last(/Cisco SD-WAN device by HTTP/sd_wan.device.if.status["{#IFKEY}"])<>0`|Info|**Manual close**: YesThe network interface utilization is close to its estimated maximum bandwidth.
|`(avg(/Cisco SD-WAN device by HTTP/sd_wan.device.if.in["{#IFKEY}"],15m)>({$SDWAN.IF.UTIL.MAX:"{#IFNAME}"}/100)*last(/Cisco SD-WAN device by HTTP/sd_wan.device.if.speed["{#IFKEY}"]) or avg(/Cisco SD-WAN device by HTTP/sd_wan.device.if.out["{#IFKEY}"],15m)>({$SDWAN.IF.UTIL.MAX:"{#IFNAME}"}/100)*last(/Cisco SD-WAN device by HTTP/sd_wan.device.if.speed["{#IFKEY}"])) and last(/Cisco SD-WAN device by HTTP/sd_wan.device.if.speed["{#IFKEY}"])>0`|Warning|**Manual close**: YesIt recovers when it is below 80% of the `{$SDWAN.IF.ERRORS.WARN:"{#IFNAME}"}` threshold.
|`min(/Cisco SD-WAN device by HTTP/sd_wan.device.if.in.errors["{#IFKEY}"],5m)>{$SDWAN.IF.ERRORS.WARN:"{#IFNAME}"} or min(/Cisco SD-WAN device by HTTP/sd_wan.device.if.out.errors["{#IFKEY}"],5m)>{$SDWAN.IF.ERRORS.WARN:"{#IFNAME}"} or min(/Cisco SD-WAN device by HTTP/sd_wan.device.if.in.v6.errors["{#IFKEY}"],5m)>{$SDWAN.IF.ERRORS.WARN:"{#IFNAME}"} or min(/Cisco SD-WAN device by HTTP/sd_wan.device.if.out.v6.errors["{#IFKEY}"],5m)>{$SDWAN.IF.ERRORS.WARN:"{#IFNAME}"}`|Warning|**Manual close**: YesDiscovering device filesystems from Cisco SD-WAN API.
|Dependent item|sd_wan.fs.discovery**Preprocessing**
JavaScript: `The text is too long. Please see the template.`
Discard unchanged with heartbeat: `3h`
Item for gathering data for the {#FSNAME} filesystem.
|Dependent item|sd_wan.device.fs.get_data["{#FSNAME}"]**Preprocessing**
JavaScript: `The text is too long. Please see the template.`
The size of the storage pool, in bytes.
|Dependent item|sd_wan.device.fs.total["{#FSNAME}"]**Preprocessing**
JSON Path: `$.size`
JavaScript: `The text is too long. Please see the template.`
The available size of the storage pool, in bytes.
|Dependent item|sd_wan.device.fs.avail["{#FSNAME}"]**Preprocessing**
JSON Path: `$.avail`
JavaScript: `The text is too long. Please see the template.`
The used size of the dataset, in bytes.
|Dependent item|sd_wan.device.fs.used["{#FSNAME}"]**Preprocessing**
JSON Path: `$.used`
JavaScript: `The text is too long. Please see the template.`
Space utilization, expressed in %.
|Dependent item|sd_wan.device.fs.pused["{#FSNAME}"]**Preprocessing**
JSON Path: `$.use`
Utilization of the space is above {$VFS.FS.PUSED.MAX.CRIT:"{{FSNAME}}"}
|`last(/Cisco SD-WAN device by HTTP/sd_wan.device.fs.pused["{#FSNAME}"])>{$SDWAN.FS.PUSED.MAX.CRIT:"{#FSNAME}"}`|Average|**Manual close**: Yes| |["{#FSNAME}"]: Disk space is low|Utilization of the space is above {$VFS.FS.PUSED.MAX.CRIT:"{{FSNAME}}"}
|`last(/Cisco SD-WAN device by HTTP/sd_wan.device.fs.pused["{#FSNAME}"])>{$SDWAN.FS.PUSED.MAX.WARN:"{#FSNAME}"}`|Warning|**Manual close**: YesDiscovering Application-Aware routes from Cisco SD-WAN API.
|Dependent item|sd_wan.routes.discovery**Preprocessing**
JSON Path: `$.data`
⛔️Custom on fail: Set value to: `[]`
Item for gathering data for the route {#LOCAL} => {#REMOTE}.
|Dependent item|sd_wan.routes.get_data[{#LOCAL},{#REMOTE}]**Preprocessing**
JSON Path: `The text is too long. Please see the template.`
⛔️Custom on fail: Discard value
Discard unchanged with heartbeat: `3h`
The amount of time it takes for a data packet to travel through the route.
|Dependent item|sd_wan.routes.latency[{#LOCAL},{#REMOTE}]**Preprocessing**
JSON Path: `$.latency`
A change in the time it takes for a data packet to travel through the route.
|Dependent item|sd_wan.routes.jitter[{#LOCAL},{#REMOTE}]**Preprocessing**
JSON Path: `$.jitter`
Lost packets of data not reached the destination after being transmitted through the route.
|Dependent item|sd_wan.routes.loss[{#LOCAL},{#REMOTE}]**Preprocessing**
JSON Path: `$.loss_percentage`