# 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**
JSON Path: `$.error`
Discard unchanged with heartbeat: `1h`
**Preprocessing**
JSON Path: `$.organizations`
**Preprocessing**
JSON Path: `$.devices`
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**
JSON Path: `$.error`
Discard unchanged with heartbeat: `1h`
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**
JSON Path: `$.error`
Discard unchanged with heartbeat: `1h`
Item for viewing the Change Log for your organization.\nGathering once per 20m by default.
|HTTP agent|meraki.get.configuration.changes**Preprocessing**
Discard unchanged with heartbeat: `2h`
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**
JSON Path: `$.counts.groups`
Meraki adaptive policy custom ACLs count.
|Dependent item|meraki.policies.custom.acls**Preprocessing**
JSON Path: `$.counts.customAcls`
Meraki adaptive policies count.
|Dependent item|meraki.policies**Preprocessing**
JSON Path: `$.counts.policies`
Meraki adaptive allow policies count.
|Dependent item|meraki.policies.allow**Preprocessing**
JSON Path: `$.counts.allowPolicies`
Meraki adaptive deny policies count.
|Dependent item|meraki.policies.deny**Preprocessing**
JSON Path: `$.counts.denyPolicies`
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**
JSON Path: `$.status`
JavaScript: `The text is too long. Please see the template.`
Meraki license expire time in seconds left.
|Dependent item|meraki.license.expire**Preprocessing**
JSON Path: `$.expirationDate`
JavaScript: `The text is too long. Please see the template.`
**Preprocessing**
JSON Path: `$.uplinks`
Network uplink status.
|Dependent item|meraki.uplink.status[{#NETWORK.NAME}, {#INTERFACE}, {#UPLINK.ROLE}]**Preprocessing**
JSON Path: `The text is too long. Please see the template.`
JavaScript: `The text is too long. Please see the template.`
**Preprocessing**
JSON Path: `$.vpnStats`
VPN connection stats raw.
|Dependent item|meraki.vpn.stat.raw[{#NETWORK.ID}, {#SENDER.UPLINK}, {#PEER.NETWORK.ID}, {#RECEIVER.UPLINK}]**Preprocessing**
JSON Path: `The text is too long. Please see the template.`
VPN connection avg latency.
|Dependent item|meraki.vpn.stat.latency.avg[{#NETWORK.ID}, {#SENDER.UPLINK}, {#PEER.NETWORK.ID}, {#RECEIVER.UPLINK}]**Preprocessing**
JSON Path: `$.avgLatencyMs`
VPN connection min latency.
|Dependent item|meraki.vpn.stat.latency.min[{#NETWORK.ID}, {#SENDER.UPLINK}, {#PEER.NETWORK.ID}, {#RECEIVER.UPLINK}]**Preprocessing**
JSON Path: `$.minLatencyMs`
VPN connection max latency.
|Dependent item|meraki.vpn.stat.latency.max[{#NETWORK.ID}, {#SENDER.UPLINK}, {#PEER.NETWORK.ID}, {#RECEIVER.UPLINK}]**Preprocessing**
JSON Path: `$.maxLatencyMs`
VPN connection loss avg.
|Dependent item|meraki.vpn.stat.loss.avg[{#NETWORK.ID}, {#SENDER.UPLINK}, {#PEER.NETWORK.ID}, {#RECEIVER.UPLINK}]**Preprocessing**
JSON Path: `$.avgLossPercentage`
VPN connection loss min.
|Dependent item|meraki.vpn.stat.loss.min[{#NETWORK.ID}, {#SENDER.UPLINK}, {#PEER.NETWORK.ID}, {#RECEIVER.UPLINK}]**Preprocessing**
JSON Path: `$.minLossPercentage`
VPN connection loss max.
|Dependent item|meraki.vpn.stat.loss.max[{#NETWORK.ID}, {#SENDER.UPLINK}, {#PEER.NETWORK.ID}, {#RECEIVER.UPLINK}]**Preprocessing**
JSON Path: `$.maxLossPercentage`
VPN connection jitter avg.
|Dependent item|meraki.vpn.stat.jitter.avg[{#NETWORK.ID}, {#SENDER.UPLINK}, {#PEER.NETWORK.ID}, {#RECEIVER.UPLINK}]**Preprocessing**
JSON Path: `$.avgJitter`
VPN connection jitter min.
|Dependent item|meraki.vpn.stat.jitter.min[{#NETWORK.ID}, {#SENDER.UPLINK}, {#PEER.NETWORK.ID}, {#RECEIVER.UPLINK}]**Preprocessing**
JSON Path: `$.minJitter`
VPN connection jitter max.
|Dependent item|meraki.vpn.stat.jitter.max[{#NETWORK.ID}, {#SENDER.UPLINK}, {#PEER.NETWORK.ID}, {#RECEIVER.UPLINK}]**Preprocessing**
JSON Path: `$.maxJitter`
VPN connection mos avg.
|Dependent item|meraki.vpn.stat.mos.avg[{#NETWORK.ID}, {#SENDER.UPLINK}, {#PEER.NETWORK.ID}, {#RECEIVER.UPLINK}]**Preprocessing**
JSON Path: `$.avgMos`
VPN connection mos min.
|Dependent item|meraki.vpn.stat.mos.min[{#NETWORK.ID}, {#SENDER.UPLINK}, {#PEER.NETWORK.ID}, {#RECEIVER.UPLINK}]**Preprocessing**
JSON Path: `$.minMos`
VPN connection mos max.
|Dependent item|meraki.vpn.stat.mos.max[{#NETWORK.ID}, {#SENDER.UPLINK}, {#PEER.NETWORK.ID}, {#RECEIVER.UPLINK}]**Preprocessing**
JSON Path: `$.maxMos`
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**
JSON Path: `$.error`
Discard unchanged with heartbeat: `1h`
Device operational status
Network: {$NETWORK.ID}
MAC: {$MAC}
|Dependent item|meraki.device.status**Preprocessing**
JSON Path: `$.device[0].status`
JavaScript: `The text is too long. Please see the template.`
Device public ip
Network: {$NETWORK.ID}
MAC: {$MAC}
|Dependent item|meraki.device.public.ip**Preprocessing**
JSON Path: `$.device[0].publicIp`
**Preprocessing**
JSON Path: `$.uplinksLL`
Loss percent of the device uplink.
Network: {#NETWORK.ID}.
Device serial: {#SERIAL}.
|Dependent item|meraki.device.loss.pct[{#IP},{#UPLINK}]**Preprocessing**
JSON Path: `The text is too long. Please see the template.`
⛔️Custom on fail: Set value to: `-1`
Latency of the device uplink.
Network: {#NETWORK.ID}.
Device serial: {#SERIAL}.
|Dependent item|meraki.device.latency[{#IP},{#UPLINK}]**Preprocessing**
JSON Path: `The text is too long. Please see the template.`
⛔️Custom on fail: Set value to: `-1000`
Custom multiplier: `0.001`