# DELL PowerEdge R820 by HTTP ## Overview This is a template for monitoring DELL PowerEdge R820 servers with iDRAC 8/9 firmware 4.32 and later with Redfish API enabled via Zabbix HTTP agent that works without any external scripts. ## Requirements Zabbix version: 7.0 and higher. ## Tested versions This template has been tested on: - DELL PowerEdge R820 ## 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\. Enable Redfish API in Dell iDRAC interface of your server. 2\. Create a user for monitoring with read-only permissions in Dell iDRAC interface. 3\. Create a host for Dell server with iDRAC IP as Zabbix agent interface. 4\. Link the template to the host. 5\. Customize values of {$API.URL}, {$API.USER}, {$API.PASSWORD} macros. ### Macros used |Name|Description|Default| |----|-----------|-------| |{$API.URL}|
The Dell iDRAC Redfish API URL in the format `
The Dell iDRAC username.
|`The Dell iDRAC user password.
|`Link status trigger will be fired only for interfaces that have the context macro equaled 1.
|`1`| ### Items |Name|Description|Type|Key and additional info| |----|-----------|----|-----------------------| |Dell R820: Get system|Returns the metrics of a system.
|HTTP agent|dell.server.system.get**Preprocessing**
JavaScript: `The text is too long. Please see the template.`
This attribute defines the overall rollup status of all components in the system being monitored by the remote access card. Includes system, storage, IO devices, iDRAC, CPU, memory, etc.
|Dependent item|dell.server.status**Preprocessing**
JSON Path: `$.status`
Discard unchanged with heartbeat: `6h`
This attribute defines the model name of the system.
|Dependent item|dell.server.hw.model**Preprocessing**
JSON Path: `$.model`
Discard unchanged with heartbeat: `6h`
This attribute defines the service tag of the system.
|Dependent item|dell.server.hw.serialnumber**Preprocessing**
JSON Path: `$.serialnumber`
Discard unchanged with heartbeat: `6h`
This attribute defines the firmware version of a remote access card.
|Dependent item|dell.server.hw.firmware**Preprocessing**
JSON Path: `$.firmware`
Discard unchanged with heartbeat: `6h`
The availability of Redfish API on the server.
Possible values:
0 unavailable
1 available
|Simple check|net.tcp.service[https]| ### Triggers |Name|Description|Expression|Severity|Dependencies and additional info| |----|-----------|----------|--------|--------------------------------| |Dell R820: Server is in a critical state|Please check the device for faults.
|`find(/DELL PowerEdge R820 by HTTP/dell.server.status,,"like","Critical")=1`|High|| |Dell R820: Server is in warning state|Please check the device for warnings.
|`find(/DELL PowerEdge R820 by HTTP/dell.server.status,,"like","Warning")=1`|Warning|**Depends on**:Device serial number has changed. Acknowledge to close the problem manually.
|`last(/DELL PowerEdge R820 by HTTP/dell.server.hw.serialnumber,#1)<>last(/DELL PowerEdge R820 by HTTP/dell.server.hw.serialnumber,#2) and length(last(/DELL PowerEdge R820 by HTTP/dell.server.hw.serialnumber))>0`|Info|**Manual close**: Yes| |Dell R820: Firmware has changed|Firmware version has changed. Acknowledge to close the problem manually.
|`last(/DELL PowerEdge R820 by HTTP/dell.server.hw.firmware,#1)<>last(/DELL PowerEdge R820 by HTTP/dell.server.hw.firmware,#2) and length(last(/DELL PowerEdge R820 by HTTP/dell.server.hw.firmware))>0`|Info|**Manual close**: Yes| |Dell R820: Redfish API service is unavailable|The service is unavailable or does not accept TCP connections.
|`last(/DELL PowerEdge R820 by HTTP/net.tcp.service[https])=0`|High|| ### LLD rule Temperature discovery |Name|Description|Type|Key and additional info| |----|-----------|----|-----------------------| |Temperature discovery|Discovery of temperature sensors.
|HTTP agent|temp.discovery**Preprocessing**
JavaScript: `The text is too long. Please see the template.`
Discard unchanged with heartbeat: `6h`
Returns the metrics of a sensor.
|HTTP agent|dell.server.sensor.temp.get[{#SENSOR_NAME}]| |Dell R820: {#SENSOR_NAME} Value|The sensor value.
|Dependent item|dell.server.sensor.temp.value[{#SENSOR_NAME}]**Preprocessing**
JSON Path: `$.Reading`
The status of the job. Possible values: OK, Warning, Critical.
|Dependent item|dell.server.sensor.temp.status[{#SENSOR_NAME}]**Preprocessing**
JSON Path: `$.Status.Health`
Discard unchanged with heartbeat: `6h`
Please check the device for faults.
|`find(/DELL PowerEdge R820 by HTTP/dell.server.sensor.temp.status[{#SENSOR_NAME}],,"like","Critical")=1`|High|| |Dell R820: {#SENSOR_NAME} is in warning state|Please check the device for warnings.
|`find(/DELL PowerEdge R820 by HTTP/dell.server.sensor.temp.status[{#SENSOR_NAME}],,"like","Warning")=1`|Warning|**Depends on**:Discovery of PSU sensors.
|HTTP agent|psu.discovery**Preprocessing**
JavaScript: `The text is too long. Please see the template.`
Discard unchanged with heartbeat: `6h`
Returns the metrics of a sensor.
|HTTP agent|dell.server.sensor.psu.get[{#SENSOR_NAME}]| |Dell R820: {#SENSOR_NAME} Status|The status of the job. Possible values: OK, Warning, Critical.
|Dependent item|dell.server.sensor.psu.status[{#SENSOR_NAME}]**Preprocessing**
JSON Path: `$.Status.Health`
Discard unchanged with heartbeat: `6h`
Please check the device for faults.
|`find(/DELL PowerEdge R820 by HTTP/dell.server.sensor.psu.status[{#SENSOR_NAME}],,"like","Critical")=1`|High|| |Dell R820: {#SENSOR_NAME} is in warning state|Please check the device for warnings.
|`find(/DELL PowerEdge R820 by HTTP/dell.server.sensor.psu.status[{#SENSOR_NAME}],,"like","Warning")=1`|Warning|**Depends on**:Discovery of FAN sensors.
|HTTP agent|fan.discovery**Preprocessing**
JavaScript: `The text is too long. Please see the template.`
Discard unchanged with heartbeat: `6h`
Returns the metrics of a sensor.
|HTTP agent|dell.server.sensor.fan.get[{#SENSOR_NAME}]| |Dell R820: {#SENSOR_NAME} Speed|The sensor value.
|Dependent item|dell.server.sensor.fan.speed[{#SENSOR_NAME}]**Preprocessing**
JSON Path: `$.Reading`
The status of the job. Possible values: OK, Warning, Critical.
|Dependent item|dell.server.sensor.fan.status[{#SENSOR_NAME}]**Preprocessing**
JSON Path: `$.Status.Health`
Discard unchanged with heartbeat: `6h`
Please check the device for faults.
|`find(/DELL PowerEdge R820 by HTTP/dell.server.sensor.fan.status[{#SENSOR_NAME}],,"like","Critical")=1`|High|| |Dell R820: {#SENSOR_NAME} is in warning state|Please check the device for warnings.
|`find(/DELL PowerEdge R820 by HTTP/dell.server.sensor.fan.status[{#SENSOR_NAME}],,"like","Warning")=1`|Warning|**Depends on**:Discovery of disk array controllers.
|HTTP agent|array.discovery**Preprocessing**
JavaScript: `The text is too long. Please see the template.`
Discard unchanged with heartbeat: `6h`
The status of the job. Possible values: OK, Warning, Critical.
|HTTP agent|dell.server.hw.diskarray.status[{#CNTLR_NAME}{#SLOT}]**Preprocessing**
JSON Path: `$.Status.Health`
Discard unchanged with heartbeat: `6h`
Please check the device for faults.
|`find(/DELL PowerEdge R820 by HTTP/dell.server.hw.diskarray.status[{#CNTLR_NAME}{#SLOT}],,"like","Critical")=1`|High|| |Dell R820: {#CNTLR_NAME} in slot {#SLOT} is in warning state|Please check the device for warnings.
|`find(/DELL PowerEdge R820 by HTTP/dell.server.hw.diskarray.status[{#CNTLR_NAME}{#SLOT}],,"like","Warning")=1`|Warning|**Depends on**:Discovery of a cache of disk array controllers.
|HTTP agent|array.cache.discovery**Preprocessing**
JavaScript: `The text is too long. Please see the template.`
Discard unchanged with heartbeat: `6h`
The status of the job. Possible values: OK, Warning, Critical.
|HTTP agent|dell.server.hw.diskarray.cache.battery.status[{#BATTERY_NAME}]**Preprocessing**
JSON Path: `$.Oem.Dell.DellControllerBattery.PrimaryStatus`
Discard unchanged with heartbeat: `6h`
Please check the device for faults.
|`find(/DELL PowerEdge R820 by HTTP/dell.server.hw.diskarray.cache.battery.status[{#BATTERY_NAME}],,"like","Critical")=1`|High|| |Dell R820: {#BATTERY_NAME} is in warning state|Please check the device for warnings.
|`find(/DELL PowerEdge R820 by HTTP/dell.server.hw.diskarray.cache.battery.status[{#BATTERY_NAME}],,"like","Warning")=1`|Warning|**Depends on**:Discovery of physical disks.
|HTTP agent|physicaldisk.discovery**Preprocessing**
JavaScript: `The text is too long. Please see the template.`
Discard unchanged with heartbeat: `6h`
Returns the metrics of a physical disk.
|HTTP agent|dell.server.hw.physicaldisk.get[{#DISK_NAME}]| |Dell R820: {#DISK_NAME} Status|The status of the job. Possible values: OK, Warning, Critical.
|Dependent item|dell.server.hw.physicaldisk.status[{#DISK_NAME}]**Preprocessing**
JSON Path: `$.Status.Health`
Discard unchanged with heartbeat: `6h`
The serial number of this drive.
|Dependent item|dell.server.hw.physicaldisk.serialnumber[{#DISK_NAME}]**Preprocessing**
JSON Path: `$.SerialNumber`
Discard unchanged with heartbeat: `6h`
The model number of the drive.
|Dependent item|dell.server.hw.physicaldisk.model[{#DISK_NAME}]**Preprocessing**
JSON Path: `$.Model`
Discard unchanged with heartbeat: `6h`
The type of media contained in this drive. Possible values: HDD, SSD, SMR, null.
|Dependent item|dell.server.hw.physicaldisk.media_type[{#DISK_NAME}]**Preprocessing**
JSON Path: `$.MediaType`
Discard unchanged with heartbeat: `6h`
The size, in bytes, of this drive.
|Dependent item|dell.server.hw.physicaldisk.size[{#DISK_NAME}]**Preprocessing**
JSON Path: `$.CapacityBytes`
Discard unchanged with heartbeat: `6h`
Please check the device for faults.
|`find(/DELL PowerEdge R820 by HTTP/dell.server.hw.physicaldisk.status[{#DISK_NAME}],,"like","Critical")=1`|High|| |Dell R820: {#DISK_NAME} is in warning state|Please check the device for warnings.
|`find(/DELL PowerEdge R820 by HTTP/dell.server.hw.physicaldisk.status[{#DISK_NAME}],,"like","Warning")=1`|Warning|**Depends on**:{#DISK_NAME} serial number has changed. Acknowledge to close the problem manually.
|`last(/DELL PowerEdge R820 by HTTP/dell.server.hw.physicaldisk.serialnumber[{#DISK_NAME}],#1)<>last(/DELL PowerEdge R820 by HTTP/dell.server.hw.physicaldisk.serialnumber[{#DISK_NAME}],#2) and length(last(/DELL PowerEdge R820 by HTTP/dell.server.hw.physicaldisk.serialnumber[{#DISK_NAME}]))>0`|Info|**Manual close**: Yes| ### LLD rule Virtual disk discovery |Name|Description|Type|Key and additional info| |----|-----------|----|-----------------------| |Virtual disk discovery|Discovery of virtual disks.
|HTTP agent|virtualdisk.discovery**Preprocessing**
JavaScript: `The text is too long. Please see the template.`
Discard unchanged with heartbeat: `6h`
Returns the metrics of a virtual disk.
|HTTP agent|dell.server.hw.virtualdisk.get[{#DISK_NAME}]| |Dell R820: {#DISK_NAME} Status|The status of the job. Possible values: OK, Warning, Critical.
|Dependent item|dell.server.hw.virtualdisk.status[{#DISK_NAME}]**Preprocessing**
JSON Path: `$.Status.Health`
Discard unchanged with heartbeat: `6h`
This property represents the RAID specific status. Possible values: Blocked, Degraded, Failed, Foreign, Offline, Online, Ready, Unknown, null.
|Dependent item|dell.server.hw.virtualdisk.raidstatus[{#DISK_NAME}]**Preprocessing**
JSON Path: `$.Oem.Dell.DellVirtualDisk.RaidStatus`
Discard unchanged with heartbeat: `6h`
The size in bytes of this Volume.
|Dependent item|dell.server.hw.virtualdisk.size[{#DISK_NAME}]**Preprocessing**
JSON Path: `$.CapacityBytes`
Discard unchanged with heartbeat: `6h`
The known state of the Resource, for example, enabled. Possible values: Enabled, Disabled, StandbyOffline, StandbySpare, InTest, Starting, Absent, UnavailableOffline, Deferring, Quiesced, Updating, Qualified.
|Dependent item|dell.server.hw.virtualdisk.state[{#DISK_NAME}]**Preprocessing**
JSON Path: `$.Status.State`
Discard unchanged with heartbeat: `6h`
Indicates the read cache policy setting for the Volume. Possible values: ReadAhead, AdaptiveReadAhead, Off.
|Dependent item|dell.server.hw.virtualdisk.readpolicy[{#DISK_NAME}]**Preprocessing**
JSON Path: `$.Oem.Dell.DellVirtualDisk.ReadCachePolicy`
Discard unchanged with heartbeat: `6h`
Indicates the write cache policy setting for the Volume. Possible values: WriteThrough, ProtectedWriteBack, UnprotectedWriteBack.
|Dependent item|dell.server.hw.virtualdisk.writepolicy[{#DISK_NAME}]**Preprocessing**
JSON Path: `$.Oem.Dell.DellVirtualDisk.WriteCachePolicy`
Discard unchanged with heartbeat: `6h`
Please check the device for faults.
|`find(/DELL PowerEdge R820 by HTTP/dell.server.hw.virtualdisk.status[{#DISK_NAME}],,"like","Critical")=1`|High|| |Dell R820: {#DISK_NAME} is in warning state|Please check the device for warnings.
|`find(/DELL PowerEdge R820 by HTTP/dell.server.hw.virtualdisk.status[{#DISK_NAME}],,"like","Warning")=1`|Warning|**Depends on**:The NetworkInterface schema describes links to the NetworkAdapter and represents the functionality available to the containing system.
|HTTP agent|net.if.discovery**Preprocessing**
JavaScript: `The text is too long. Please see the template.`
Discard unchanged with heartbeat: `6h`
Returns the metrics of a network interface.
|HTTP agent|dell.server.net.if.get[{#IFNAME}]| |Dell R820: {#IFNAME} Speed|Network port current link speed.
|Dependent item|dell.server.net.if.speed[{#IFNAME}]**Preprocessing**
JSON Path: `$.CurrentLinkSpeedMbps`
Discard unchanged with heartbeat: `6h`
The status of the link between this port and its link partner. Possible values: Down, Up, null.
|Dependent item|dell.server.net.if.status[{#IFNAME}]**Preprocessing**
JSON Path: `$.LinkStatus`
Discard unchanged with heartbeat: `6h`
The known state of the Resource, for example, enabled. Possible values: Enabled, Disabled, StandbyOffline, StandbySpare, InTest, Starting, Absent, UnavailableOffline, Deferring, Quiesced, Updating, Qualified.
|Dependent item|dell.server.net.if.state[{#IFNAME}]**Preprocessing**
JSON Path: `$.Status.State`
Discard unchanged with heartbeat: `6h`
The status of the job. Possible values: OK, Warning, Critical.
|Dependent item|dell.server.net.if.health[{#IFNAME}]**Preprocessing**
JSON Path: `$.Status.Health`
Discard unchanged with heartbeat: `6h`
This trigger expression works as follows:
1. It can be triggered if the operations 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, do not fire for the 'eternal off' interfaces.)
WARNING: if closed manually - it will not fire again on the next poll, because of .diff.
Please check the device for faults.
|`find(/DELL PowerEdge R820 by HTTP/dell.server.net.if.health[{#IFNAME}],,"like","Critical")=1`|High|| |Dell R820: {#IFNAME} is in warning state|Please check the device for warnings.
|`find(/DELL PowerEdge R820 by HTTP/dell.server.net.if.health[{#IFNAME}],,"like","Warning")=1`|Warning|**Depends on**: