# Cisco Meraki dashboard by HTTP ## Overview This template is designed for the effortless deployment of Cisco Meraki dashboard 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 Meraki API 1.24.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 You must set {$MERAKI.TOKEN} and {$MERAKI.API.URL} macros. Create the token in the Meraki dashboard (see Meraki [documentation](https://developer.cisco.com/meraki/api-latest/#!authorization/authorization) for instructions). Set this token as {$MERAKI.TOKEN} macro value in Zabbix. Set your Meraki dashboard URl as {$MERAKI.API.URL} macro value in Zabbix (e.g., api.meraki.com/api/v1). ### Macros used |Name|Description|Default| |----|-----------|-------| |{$MERAKI.TOKEN}|

Cisco Meraki Dashboard API Token.

|| |{$MERAKI.API.URL}|

Cisco Meraki Dashboard API URL. e.g api.meraki.com/api/v1

|`api.meraki.com/api/v1`| |{$MERAKI.ORGANIZATION.NAME.MATCHES}|

This macro is used in organizations discovery. Can be overridden on the host or linked template level.

|`.+`| |{$MERAKI.ORGANIZATION.NAME.NOT_MATCHES}|

This macro is used in organizations discovery. Can be overridden on the host or linked template level.

|`CHANGE_IF_NEEDED`| |{$MERAKI.DEVICE.NAME.MATCHES}|

This macro is used in devices discovery. Can be overridden on the host or linked template level.

|`.+`| |{$MERAKI.DEVICE.NAME.NOT_MATCHES}|

This macro is used in devices discovery. Can be overridden on the host or linked template level.

|`CHANGE_IF_NEEDED`| |{$MERAKI.HTTP_PROXY}|

HTTP proxy for API requests. You can specify it using the format [protocol://][username[:password]@]proxy.example.com[:port]. See documentation at https://www.zabbix.com/documentation/7.0/manual/config/items/itemtypes/http

|| ### Items |Name|Description|Type|Key and additional info| |----|-----------|----|-----------------------| |Meraki: Get data|

Item for gathering all the organizations and devices from Meraki API.

|Script|meraki.get.data| |Meraki: Data item errors|

Item for gathering all the data item errors.

|Dependent item|meraki.get.data.errors

**Preprocessing**

| ### Triggers |Name|Description|Expression|Severity|Dependencies and additional info| |----|-----------|----------|--------|--------------------------------| |Meraki: There are errors in 'Get data' metric||`length(last(/Cisco Meraki dashboard by HTTP/meraki.get.data.errors))>0`|Warning|| ### LLD rule Organizations discovery |Name|Description|Type|Key and additional info| |----|-----------|----|-----------------------| |Organizations discovery||Dependent item|meraki.organization.discovery

**Preprocessing**

| ### LLD rule Devices discovery |Name|Description|Type|Key and additional info| |----|-----------|----|-----------------------| |Devices discovery||Dependent item|meraki.devices.discovery

**Preprocessing**

| # Cisco Meraki organization by HTTP ### Macros used |Name|Description|Default| |----|-----------|-------| |{$MERAKI.TOKEN}|

Cisco Meraki Dashboard API Token.

|| |{$MERAKI.API.URL}|

Cisco Meraki Dashboard API URL. e.g api.meraki.com/api/v1

|`api.meraki.com/api/v1`| |{$MERAKI.LICENSE.EXPIRE}|

Time in seconds for license to expire.

|`86400`| |{$MERAKI.CONFIG.CHANGE.TIMESPAN}|

Timespan for gathering config change log. Used in the metric config and in the URL query.

|`1200`| |{$MERAKI.HTTP_PROXY}|

HTTP proxy for API requests. You can specify it using the format [protocol://][username[:password]@]proxy.example.com[:port]. See documentation at https://www.zabbix.com/documentation/7.0/manual/config/items/itemtypes/http

|| ### Items |Name|Description|Type|Key and additional info| |----|-----------|----|-----------------------| |Meraki: Get list of the networks|

Item for gathering all the networks of organization from Meraki API.

|Script|meraki.get.networks| |Meraki: Networks item errors|

Item for gathering all the networks item errors.

|Dependent item|meraki.get.networks.errors

**Preprocessing**

| |Meraki: Get list of the vpn stats|

Item for gathering all the vpn stats of the organization.

|Script|meraki.get.vpn.stats| |Meraki: VPN item errors|

Item for gathering all the vpn item errors.

|Dependent item|meraki.get.vpn.stats.errors

**Preprocessing**

| |Meraki: Get list of configuration changes|

Item for viewing the Change Log for your organization.\nGathering once per 20m by default.

|HTTP agent|meraki.get.configuration.changes

**Preprocessing**

| |Meraki: Get list of adaptive policy aggregate statistics|

Item for adaptive policy aggregate statistics for an organization.

|HTTP agent|meraki.get.adaptive.policy| |Meraki: Groups|

Meraki adaptive policy groups count.

|Dependent item|meraki.policies.groups

**Preprocessing**

| |Meraki: Custom ACLs|

Meraki adaptive policy custom ACLs count.

|Dependent item|meraki.policies.custom.acls

**Preprocessing**

| |Meraki: Policies|

Meraki adaptive policies count.

|Dependent item|meraki.policies

**Preprocessing**

| |Meraki: Allow policies|

Meraki adaptive allow policies count.

|Dependent item|meraki.policies.allow

**Preprocessing**

| |Meraki: Deny policies|

Meraki adaptive deny policies count.

|Dependent item|meraki.policies.deny

**Preprocessing**

| |Meraki: Get licenses info|

Return an overview of the license state for an organization.

|HTTP agent|meraki.get.licenses| |Meraki: License status|

Meraki license status.

|Dependent item|meraki.license.status

**Preprocessing**

| |Meraki: License expire|

Meraki license expire time in seconds left.

|Dependent item|meraki.license.expire

**Preprocessing**

| ### Triggers |Name|Description|Expression|Severity|Dependencies and additional info| |----|-----------|----------|--------|--------------------------------| |Meraki: There are errors in 'Get networks' metric||`length(last(/Cisco Meraki organization by HTTP/meraki.get.networks.errors))>0`|Warning|| |Meraki: There are errors in 'Get VPNs' metric||`length(last(/Cisco Meraki organization by HTTP/meraki.get.vpn.stats.errors))>0`|Warning|| |Meraki: Configuration has been changed||`length(last(/Cisco Meraki organization by HTTP/meraki.get.configuration.changes))>3`|Warning|| |Meraki: License status is not OK||`last(/Cisco Meraki organization by HTTP/meraki.license.status)<>1`|Warning|| |Meraki: License expires in less than {$MERAKI.LICENSE.EXPIRE} seconds||`last(/Cisco Meraki organization by HTTP/meraki.license.expire)<{$MERAKI.LICENSE.EXPIRE} and last(/Cisco Meraki organization by HTTP/meraki.license.expire)>=0`|Warning|| ### LLD rule Uplinks discovery |Name|Description|Type|Key and additional info| |----|-----------|----|-----------------------| |Uplinks discovery||Dependent item|meraki.uplinks.discovery

**Preprocessing**

| ### Item prototypes for Uplinks discovery |Name|Description|Type|Key and additional info| |----|-----------|----|-----------------------| |Uplink [{#INTERFACE}]: [{#UPLINK.ROLE}]: [{#NETWORK.NAME}]: status|

Network uplink status.

|Dependent item|meraki.uplink.status[{#NETWORK.NAME}, {#INTERFACE}, {#UPLINK.ROLE}]

**Preprocessing**

| ### Trigger prototypes for Uplinks discovery |Name|Description|Expression|Severity|Dependencies and additional info| |----|-----------|----------|--------|--------------------------------| |Uplink [{#INTERFACE}]: [{#UPLINK.ROLE}]: [{#NETWORK.NAME}]: status is failed||`last(/Cisco Meraki organization by HTTP/meraki.uplink.status[{#NETWORK.NAME}, {#INTERFACE}, {#UPLINK.ROLE}])=0`|Warning|| ### LLD rule VPN stats discovery |Name|Description|Type|Key and additional info| |----|-----------|----|-----------------------| |VPN stats discovery||Dependent item|meraki.vpn.stats.discovery

**Preprocessing**

| ### Item prototypes for VPN stats discovery |Name|Description|Type|Key and additional info| |----|-----------|----|-----------------------| |VPN [{#NETWORK.NAME}]=>[{#PEER.NETWORK.NAME}]: stats raw|

VPN connection stats raw.

|Dependent item|meraki.vpn.stat.raw[{#NETWORK.ID}, {#SENDER.UPLINK}, {#PEER.NETWORK.ID}, {#RECEIVER.UPLINK}]

**Preprocessing**

| |VPN [{#NETWORK.NAME}][{#SENDER.UPLINK}]=>[{#PEER.NETWORK.NAME}][{#RECEIVER.UPLINK}]: latency avg|

VPN connection avg latency.

|Dependent item|meraki.vpn.stat.latency.avg[{#NETWORK.ID}, {#SENDER.UPLINK}, {#PEER.NETWORK.ID}, {#RECEIVER.UPLINK}]

**Preprocessing**

| |VPN [{#NETWORK.NAME}][{#SENDER.UPLINK}]=>[{#PEER.NETWORK.NAME}][{#RECEIVER.UPLINK}]: latency min|

VPN connection min latency.

|Dependent item|meraki.vpn.stat.latency.min[{#NETWORK.ID}, {#SENDER.UPLINK}, {#PEER.NETWORK.ID}, {#RECEIVER.UPLINK}]

**Preprocessing**

| |VPN [{#NETWORK.NAME}][{#SENDER.UPLINK}]=>[{#PEER.NETWORK.NAME}][{#RECEIVER.UPLINK}]: latency max|

VPN connection max latency.

|Dependent item|meraki.vpn.stat.latency.max[{#NETWORK.ID}, {#SENDER.UPLINK}, {#PEER.NETWORK.ID}, {#RECEIVER.UPLINK}]

**Preprocessing**

| |VPN [{#NETWORK.NAME}][{#SENDER.UPLINK}]=>[{#PEER.NETWORK.NAME}][{#RECEIVER.UPLINK}]: loss avg, %|

VPN connection loss avg.

|Dependent item|meraki.vpn.stat.loss.avg[{#NETWORK.ID}, {#SENDER.UPLINK}, {#PEER.NETWORK.ID}, {#RECEIVER.UPLINK}]

**Preprocessing**

| |VPN [{#NETWORK.NAME}][{#SENDER.UPLINK}]=>[{#PEER.NETWORK.NAME}][{#RECEIVER.UPLINK}]: loss min, %|

VPN connection loss min.

|Dependent item|meraki.vpn.stat.loss.min[{#NETWORK.ID}, {#SENDER.UPLINK}, {#PEER.NETWORK.ID}, {#RECEIVER.UPLINK}]

**Preprocessing**

| |VPN [{#NETWORK.NAME}][{#SENDER.UPLINK}]=>[{#PEER.NETWORK.NAME}][{#RECEIVER.UPLINK}]: loss max, %|

VPN connection loss max.

|Dependent item|meraki.vpn.stat.loss.max[{#NETWORK.ID}, {#SENDER.UPLINK}, {#PEER.NETWORK.ID}, {#RECEIVER.UPLINK}]

**Preprocessing**

| |VPN [{#NETWORK.NAME}][{#SENDER.UPLINK}]=>[{#PEER.NETWORK.NAME}][{#RECEIVER.UPLINK}]: jitter avg|

VPN connection jitter avg.

|Dependent item|meraki.vpn.stat.jitter.avg[{#NETWORK.ID}, {#SENDER.UPLINK}, {#PEER.NETWORK.ID}, {#RECEIVER.UPLINK}]

**Preprocessing**

| |VPN [{#NETWORK.NAME}][{#SENDER.UPLINK}]=>[{#PEER.NETWORK.NAME}][{#RECEIVER.UPLINK}]: jitter min|

VPN connection jitter min.

|Dependent item|meraki.vpn.stat.jitter.min[{#NETWORK.ID}, {#SENDER.UPLINK}, {#PEER.NETWORK.ID}, {#RECEIVER.UPLINK}]

**Preprocessing**

| |VPN [{#NETWORK.NAME}][{#SENDER.UPLINK}]=>[{#PEER.NETWORK.NAME}][{#RECEIVER.UPLINK}]: jitter max|

VPN connection jitter max.

|Dependent item|meraki.vpn.stat.jitter.max[{#NETWORK.ID}, {#SENDER.UPLINK}, {#PEER.NETWORK.ID}, {#RECEIVER.UPLINK}]

**Preprocessing**

| |VPN [{#NETWORK.NAME}][{#SENDER.UPLINK}]=>[{#PEER.NETWORK.NAME}][{#RECEIVER.UPLINK}]: mos avg|

VPN connection mos avg.

|Dependent item|meraki.vpn.stat.mos.avg[{#NETWORK.ID}, {#SENDER.UPLINK}, {#PEER.NETWORK.ID}, {#RECEIVER.UPLINK}]

**Preprocessing**

| |VPN [{#NETWORK.NAME}][{#SENDER.UPLINK}]=>[{#PEER.NETWORK.NAME}][{#RECEIVER.UPLINK}]: mos min|

VPN connection mos min.

|Dependent item|meraki.vpn.stat.mos.min[{#NETWORK.ID}, {#SENDER.UPLINK}, {#PEER.NETWORK.ID}, {#RECEIVER.UPLINK}]

**Preprocessing**

| |VPN [{#NETWORK.NAME}][{#SENDER.UPLINK}]=>[{#PEER.NETWORK.NAME}][{#RECEIVER.UPLINK}]: mos max|

VPN connection mos max.

|Dependent item|meraki.vpn.stat.mos.max[{#NETWORK.ID}, {#SENDER.UPLINK}, {#PEER.NETWORK.ID}, {#RECEIVER.UPLINK}]

**Preprocessing**

| # Cisco Meraki device by HTTP ### Macros used |Name|Description|Default| |----|-----------|-------| |{$MERAKI.TOKEN}|

Cisco Meraki Dashboard API Token.

|| |{$MERAKI.API.URL}|

Cisco Meraki Dashboard API URL. e.g api.meraki.com/api/v1

|`api.meraki.com/api/v1`| |{$MERAKI.DEVICE.LOSS}|

Devices uplink loss threshold in percents.

|`15`| |{$MERAKI.DEVICE.LATENCY}|

Devices uplink latency threshold in seconds.

|`0.15`| |{$MERAKI.HTTP_PROXY}|

HTTP proxy for API requests. You can specify it using the format [protocol://][username[:password]@]proxy.example.com[:port]. See documentation at https://www.zabbix.com/documentation/7.0/manual/config/items/itemtypes/http

|| |{$MERAKI.DEVICE.UPLINK.MATCHES}|

This macro is used in loss and latency checks discovery. Can be overridden on the host or linked template level.

|`.+`| |{$MERAKI.DEVICE.UPLINK.NOT_MATCHES}|

This macro is used in loss and latency checks discovery. Can be overridden on the host or linked template level.

|`^$`| |{$MERAKI.DEVICE.LOSS.LATENCY.IP.MATCHES}|

This macro is used in loss and latency checks discovery. Can be overridden on the host or linked template level.

|`^((25[0-5]\|(2[0-4]\|1\d\|[1-9]\|)\d)\.?\b){4}$`| |{$MERAKI.DEVICE.LOSS.LATENCY.IP.NOT_MATCHES}|

This macro is used in loss and latency checks discovery. Can be overridden on the host or linked template level.

|`^$`| ### Items |Name|Description|Type|Key and additional info| |----|-----------|----|-----------------------| |Meraki: Get device data|

Item for gathering device data from Meraki API.

|Script|meraki.get.device| |Meraki: Device data item errors|

Item for gathering errors of the device item.

|Dependent item|meraki.get.device.errors

**Preprocessing**

| |Meraki: status|

Device operational status

Network: {$NETWORK.ID}

MAC: {$MAC}

|Dependent item|meraki.device.status

**Preprocessing**

| |Meraki: public ip|

Device public ip

Network: {$NETWORK.ID}

MAC: {$MAC}

|Dependent item|meraki.device.public.ip

**Preprocessing**

| ### Triggers |Name|Description|Expression|Severity|Dependencies and additional info| |----|-----------|----------|--------|--------------------------------| |Meraki: There are errors in 'Get Device data' metric||`length(last(/Cisco Meraki device by HTTP/meraki.get.device.errors))>0`|Warning|| |Meraki: Status is not online||`last(/Cisco Meraki device by HTTP/meraki.device.status)<>1`|Warning|| ### LLD rule Uplinks loss and quality discovery |Name|Description|Type|Key and additional info| |----|-----------|----|-----------------------| |Uplinks loss and quality discovery||Dependent item|meraki.device.uplinks.discovery

**Preprocessing**

| ### Item prototypes for Uplinks loss and quality discovery |Name|Description|Type|Key and additional info| |----|-----------|----|-----------------------| |Uplink [{#IP}]: [{#UPLINK}]: Loss, %|

Loss percent of the device uplink.

Network: {#NETWORK.ID}.

Device serial: {#SERIAL}.

|Dependent item|meraki.device.loss.pct[{#IP},{#UPLINK}]

**Preprocessing**

| |Uplink [{#IP}]: [{#UPLINK}]: Latency|

Latency of the device uplink.

Network: {#NETWORK.ID}.

Device serial: {#SERIAL}.

|Dependent item|meraki.device.latency[{#IP},{#UPLINK}]

**Preprocessing**

| ### Trigger prototypes for Uplinks loss and quality discovery |Name|Description|Expression|Severity|Dependencies and additional info| |----|-----------|----------|--------|--------------------------------| |Uplink [{#IP}]: [{#UPLINK}]: loss > {$MERAKI.DEVICE.LOSS}%||`min(/Cisco Meraki device by HTTP/meraki.device.loss.pct[{#IP},{#UPLINK}],#3)>{$MERAKI.DEVICE.LOSS}`|Warning|| |Uplink [{#IP}]: [{#UPLINK}]: latency > {$MERAKI.DEVICE.LATENCY}||`min(/Cisco Meraki device by HTTP/meraki.device.latency[{#IP},{#UPLINK}],#3)>{$MERAKI.DEVICE.LATENCY}`|Warning|| ## 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)