
# 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|
|----|-----------|----|-----------------------|
|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|
|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`

|
|Get devices|
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.`

|
|Get devices item errors|
Item for gathering all the data item errors.
|Dependent item|sd_wan.get.devices.errors
**Preprocessing**

- 
JSON Path: `$.error`

- 
Discard unchanged with heartbeat: `1h`

|
|Invalid certificates|
Number of invalid certificates.
|Dependent item|sd_wan.invalid_certificates
**Preprocessing**

- 
JSON Path: `$.devices[?(@.cert_valid != "Valid")].length()`

|
|Total devices|
The total number of all devices.
|Dependent item|sd_wan.total.devices
**Preprocessing**

- 
JSON Path: `$.devices.length()`

- 
Discard unchanged with heartbeat: `1h`

|
|Number of vEdge devices|
The total number of vEdge devices.
|Dependent item|sd_wan.vedge.devices
**Preprocessing**

- 
JSON Path: `$.devices[?(@.type == "vedge")].length()`

- 
Discard unchanged with heartbeat: `1h`

|
|Number of vBond devices|
The total number of vBond devices.
|Dependent item|sd_wan.vbond.devices
**Preprocessing**

- 
JSON Path: `$.devices[?(@.type == "vbond")].length()`

- 
Discard unchanged with heartbeat: `1h`

|
|Number of vSmart devices|
The total number of vSmart devices.
|Dependent item|sd_wan.vsmart.devices
**Preprocessing**

- 
JSON Path: `$.devices[?(@.type == "vsmart")].length()`

- 
Discard unchanged with heartbeat: `1h`

|
|Number of vManage devices|
The total number of vManage devices.
|Dependent item|sd_wan.vmanage.devices
**Preprocessing**

- 
JSON Path: `$.devices[?(@.type == "vmanage")].length()`

- 
Discard unchanged with heartbeat: `1h`

|

### Triggers

|Name|Description|Expression|Severity|Dependencies and additional info|
|----|-----------|----------|--------|--------------------------------|
|Cisco SD-WAN: Authentication has failed||`length(last(/Cisco SD-WAN by HTTP/sd_wan.auth.errors))>0`|Average||
|Cisco SD-WAN: There are errors in the 'Get devices' metric||`length(last(/Cisco SD-WAN by HTTP/sd_wan.get.devices.errors))>0`|Warning||

### LLD rule Devices discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Devices discovery|
Discovering devices from Cisco SD-WAN API.
|Dependent item|sd_wan.devices.discovery
**Preprocessing**

- 
JSON Path: `$.devices`

|

# Cisco SD-WAN device by HTTP

### Macros used

|Name|Description|Default|
|----|-----------|-------|
|{$SDWAN.API.URL}|
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|
|----|-----------|----|-----------------------|
|Get interfaces data|
Item for gathering device interfaces from Cisco SD-WAN API.
|Script|sd_wan.get.interfaces|
|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`

|
|Get routes data|
Item for gathering device routes from Cisco SD-WAN API.
|Script|sd_wan.get.routes|
|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`

|
|Get device data|
Item for gathering device data from Cisco SD-WAN API.
|Script|sd_wan.get.device|
|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`

|
|Control connections|
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`

|
|Certificate validity|
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|
Total memory, expressed in bytes.
|Dependent item|sd_wan.device.memory.total
**Preprocessing**

- 
JSON Path: `$.mem_total`

|
|Available memory|
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`

|
|Memory (buffers)|
The amount of physical memory (in bytes) used by the kernel buffers.
|Dependent item|sd_wan.device.memory.buffers
**Preprocessing**

- 
JSON Path: `$.mem_buffers`

|
|Memory (cached)|
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`

|
|Used memory|
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`

|
|Memory utilization|
Calculated percentage of the memory used, in %.
|Calculated|sd_wan.device.memory.util|
|Number of CPUs|
The total number of CPU.
|Dependent item|sd_wan.device.cpu.num
**Preprocessing**

- 
JSON Path: `$.total_cpu_count`

|
|Load average (1m avg)|
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`

|
|Load average (5m 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`

|
|Load average (15m 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`

|
|CPU idle time|
The time the CPU has spent doing nothing.
|Dependent item|sd_wan.device.cpu.util[idle]
**Preprocessing**

- 
JSON Path: `$.cpu_idle`

|
|CPU system time|
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`

|
|CPU user time|
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|
CPU utilization, expressed in %.
|Dependent item|sd_wan.device.cpu.util
**Preprocessing**

- 
JavaScript: `return (100 - value);`

|
|Device reachability|
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.`

|
|Device state|
The device current state.
|Dependent item|sd_wan.device.state
**Preprocessing**

- 
JSON Path: `$.state`

- 
JavaScript: `The text is too long. Please see the template.`

|
|Device state description|
The description of the device current state.
|Dependent item|sd_wan.device.state_descr
**Preprocessing**

- 
JSON Path: `$.state_description`

- 
Discard unchanged with heartbeat: `1h`

|
|Operating system|
The device operating system.
|Dependent item|sd_wan.device.os
**Preprocessing**

- 
JSON Path: `$["device-os"]`

- 
Discard unchanged with heartbeat: `1d`

|
|Operating system architecture|
The architecture of the operating system.
|Dependent item|sd_wan.device.arch
**Preprocessing**

- 
JSON Path: `$.platform`

- 
Discard unchanged with heartbeat: `1d`

|
|Device role|
The device role in the network.
|Dependent item|sd_wan.device.role
**Preprocessing**

- 
JSON Path: `$.device_role`

⛔️Custom on fail: Set value to: `-1`

|
|Model name|
The model name of the device.
|Dependent item|sd_wan.device.model
**Preprocessing**

- 
JSON Path: `$["device-model"]`

|
|Number of processes|
The total number of processes in any state.
|Dependent item|sd_wan.device.proc.num
**Preprocessing**

- 
JSON Path: `$.procs`

|
|Serial Number|
The device serial number.
|Dependent item|sd_wan.device.serialnumber
**Preprocessing**

- 
JSON Path: `$["board-serial"]`

|
|System name|
The system host name.
|Dependent item|sd_wan.device.hostname
**Preprocessing**

- 
JSON Path: `$["host-name"]`

- 
Discard unchanged with heartbeat: `12h`

|
|System uptime|
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.`

|
|Version|
The version of the device software.
|Dependent item|sd_wan.device.version
**Preprocessing**

- 
JSON Path: `$.version`

- 
Discard unchanged with heartbeat: `12h`

|

### Triggers

|Name|Description|Expression|Severity|Dependencies and additional info|
|----|-----------|----------|--------|--------------------------------|
|Cisco SD-WAN: There are errors in the 'Get interfaces data' metric||`length(last(/Cisco SD-WAN device by HTTP/sd_wan.get.interfaces.errors))>0`|Warning||
|Cisco SD-WAN: There are errors in the 'Get routes data' metric||`length(last(/Cisco SD-WAN device by HTTP/sd_wan.get.routes.errors))>0`|Warning||
|Cisco SD-WAN: There are errors in the 'Get device data' metric||`length(last(/Cisco SD-WAN device by HTTP/sd_wan.get.device.errors))>0`|Warning||
|Cisco SD-WAN: Device certificate is invalid||`last(/Cisco SD-WAN device by HTTP/sd_wan.device.certificate_validity)=1`|Warning||
|Cisco SD-WAN: Lack of available memory||`max(/Cisco SD-WAN device by HTTP/sd_wan.device.memory.avail,5m)<{$SDWAN.MEMORY.AVAILABLE.MIN} and last(/Cisco SD-WAN device by HTTP/sd_wan.device.memory.total)>0`|Average||
|Cisco SD-WAN: High memory utilization|
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**:

- Cisco SD-WAN: Lack of available memory
|
|Cisco SD-WAN: Load average is too high|
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||
|Cisco 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**:

- Cisco SD-WAN: Load average is too high
|
|Cisco SD-WAN: Device is not reachable|
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||
|Cisco 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||
|Cisco 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**: Yes
**Depends on**:

- Cisco SD-WAN: Device has been replaced
|
|Cisco SD-WAN: Device has been replaced|
Device 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|
|Cisco 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|
|Cisco 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 prototypes for Network interfaces discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Interface ["{#IFNAME}"]: Get data|
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

|
|Interface ["{#IFNAME}"]: Admin status|
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.`

|
|Interface ["{#IFNAME}"]: Operational status|
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.`

|
|Interface ["{#IFNAME}"]: Speed|
Current bandwidth of the interface.
|Dependent item|sd_wan.device.if.speed["{#IFKEY}"]
**Preprocessing**

- 
JSON Path: `$["speed-mbps"]`

- 
Custom multiplier: `1000000`

|
|Interface ["{#IFNAME}"]: Bits received|
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`

- Change per second
- 
Custom multiplier: `8`

|
|Interface ["{#IFNAME}"]: Bits sent|
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`

- Change per second
- 
Custom multiplier: `8`

|
|Interface ["{#IFNAME}"]: Inbound packets discarded|
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`

|
|Interface ["{#IFNAME}"]: Inbound IPv6 packets discarded|
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`

|
|Interface ["{#IFNAME}"]: Inbound packets with errors|
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`

|
|Interface ["{#IFNAME}"]: Inbound IPv6 packets with errors|
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`

|
|Interface ["{#IFNAME}"]: Outbound packets discarded|
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`

|
|Interface ["{#IFNAME}"]: Outbound IPv6 packets discarded|
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`

|
|Interface ["{#IFNAME}"]: Outbound packets with errors|
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`

|
|Interface ["{#IFNAME}"]: Outbound IPv6 packets with errors|
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`

|

### Trigger prototypes for Network interfaces discovery

|Name|Description|Expression|Severity|Dependencies and additional info|
|----|-----------|----------|--------|--------------------------------|
|Cisco SD-WAN: Interface ["{#IFNAME}"]: Link down|
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.
|`{$IFCONTROL:"{#IFNAME}"}=1 and last(/Cisco SD-WAN device by HTTP/sd_wan.device.if.status["{#IFKEY}"])=1 and (last(/Cisco SD-WAN device by HTTP/sd_wan.device.if.status["{#IFKEY}"],#1)<>last(/Cisco SD-WAN device by HTTP/sd_wan.device.if.status["{#IFKEY}"],#2))`|Average|**Manual close**: Yes|
|Cisco SD-WAN: Interface ["{#IFNAME}"]: Ethernet has changed to lower speed than it was before|
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**: Yes
**Depends on**:

- Cisco SD-WAN: Interface ["{#IFNAME}"]: Link down
|
|Cisco SD-WAN: Interface ["{#IFNAME}"]: High bandwidth usage|
The 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**: Yes
**Depends on**:

- Cisco SD-WAN: Interface ["{#IFNAME}"]: Link down
|
|Cisco SD-WAN: Interface ["{#IFNAME}"]: High error rate|
It 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**: Yes
**Depends on**:

- Cisco SD-WAN: Interface ["{#IFNAME}"]: Link down
|

### LLD rule Mounted filesystem discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Mounted filesystem discovery|
Discovering 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 prototypes for Mounted filesystem discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|["{#FSNAME}"]: Get data|
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.`

|
|["{#FSNAME}"]: Total space|
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.`

|
|["{#FSNAME}"]: Available space|
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.`

|
|["{#FSNAME}"]: Used space|
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.`

|
|["{#FSNAME}"]: Space utilization|
Space utilization, expressed in %.
|Dependent item|sd_wan.device.fs.pused["{#FSNAME}"]
**Preprocessing**

- 
JSON Path: `$.use`

|

### Trigger prototypes for Mounted filesystem discovery

|Name|Description|Expression|Severity|Dependencies and additional info|
|----|-----------|----------|--------|--------------------------------|
|Cisco SD-WAN: ["{#FSNAME}"]: Disk space is critically 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.CRIT:"{#FSNAME}"}`|Average|**Manual close**: Yes|
|Cisco SD-WAN: ["{#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**: Yes
**Depends on**:

- Cisco SD-WAN: ["{#FSNAME}"]: Disk space is critically low
|

### LLD rule Route discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Route discovery|
Discovering 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 prototypes for Route discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Route [{#LOCAL} => {#REMOTE}]: Get data|
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`

|
|Route [{#LOCAL} => {#REMOTE}]: Latency|
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`

|
|Route [{#LOCAL} => {#REMOTE}]: Jitter|
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`

|
|Route [{#LOCAL} => {#REMOTE}]: Loss|
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`

|

## Feedback

Please report any issues with the template at [`https://support.zabbix.com`](https://support.zabbix.com)

You can also provide feedback, discuss the template, or ask for help at [`ZABBIX forums`](https://www.zabbix.com/forum/zabbix-suggestions-and-feedback)

