
# Pure Storage FlashArray v1 by HTTP

## Overview

This template is designed for the effortless deployment of Pure Storage FlashArray v1 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:
- Pure Storage FlashArray FA-X20R4 (Purity//FA: 6.7.1)

## 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. Create a host for the Pure Storage FlashArray device and assign to it the "Pure Storage FlashArray v1 by HTTP" template.
2. Enter your API token from the FlashArray (Purity//FA) graphical user interface into the `{$PURE.FLASHARRAY.API.TOKEN}` macro.
3. It is possible to authenticate using username and password by entering them from the FlashArray (Purity//FA) graphical user interface into the `{$PURE.FLASHARRAY.API.USERNAME}` and `{$PURE.FLASHARRAY.API.PASSWORD}` macros.
4. Set your FlashArray (Purity//FA) graphical user interface URL as the `{$PURE.FLASHARRAY.API.URL}` macro value.

### Macros used

|Name|Description|Default|
|----|-----------|-------|
|{$PURE.FLASHARRAY.API.URL}|
Pure Storage FlashArray Web interface URL.
||
|{$PURE.FLASHARRAY.API.TOKEN}|
Pure Storage FlashArray API token.
||
|{$PURE.FLASHARRAY.API.USERNAME}|
Pure Storage FlashArray Web interface username.
||
|{$PURE.FLASHARRAY.API.PASSWORD}|
Pure Storage FlashArray Web interface password.
||
|{$PURE.FLASHARRAY.API.VERSION}|
Pure Storage FlashArray API version.
|`1.19`|
|{$PURE.FLASHARRAY.CERT.EXPIRY.WARN}|
Number of days until the certificate expires.
|`7`|
|{$PURE.FLASHARRAY.DATA.TIMEOUT}|
Response timeout for the API.
|`15s`|
|{$PURE.FLASHARRAY.POD.LLD.FILTER.NAME.MATCHES}|
Filter of discoverable storage pods by name.
|`.*`|
|{$PURE.FLASHARRAY.POD.LLD.FILTER.NAME.NOT_MATCHES}|
Filter to exclude discoverable storage pods by name.
|`CHANGE_IF_NEEDED`|
|{$PURE.FLASHARRAY.CERT.LLD.FILTER.NAME.MATCHES}|
Filter of discoverable certificates by name.
|`.*`|
|{$PURE.FLASHARRAY.CERT.LLD.FILTER.NAME.NOT_MATCHES}|
Filter to exclude discoverable certificates by name.
|`CHANGE_IF_NEEDED`|
|{$PURE.FLASHARRAY.CTRL.LLD.FILTER.INDEX.MATCHES}|
Filter of discoverable controllers by index.
|`.*`|
|{$PURE.FLASHARRAY.CTRL.LLD.FILTER.INDEX.NOT_MATCHES}|
Filter to exclude discoverable controllers by index.
|`CHANGE_IF_NEEDED`|
|{$PURE.FLASHARRAY.TEMP.LLD.FILTER.INDEX.MATCHES}|
Filter of discoverable temperature sensors by index.
|`.*`|
|{$PURE.FLASHARRAY.TEMP.LLD.FILTER.INDEX.NOT_MATCHES}|
Filter to exclude discoverable temperature sensors by index.
|`CHANGE_IF_NEEDED`|
|{$PURE.FLASHARRAY.POWER.LLD.FILTER.INDEX.MATCHES}|
Filter of discoverable power supply components by index.
|`.*`|
|{$PURE.FLASHARRAY.POWER.LLD.FILTER.INDEX.NOT_MATCHES}|
Filter to exclude discoverable power supply components by index.
|`CHANGE_IF_NEEDED`|
|{$PURE.FLASHARRAY.FAN.LLD.FILTER.INDEX.MATCHES}|
Filter of discoverable fans by index.
|`.*`|
|{$PURE.FLASHARRAY.FAN.LLD.FILTER.INDEX.NOT_MATCHES}|
Filter to exclude discoverable fans by index.
|`CHANGE_IF_NEEDED`|
|{$PURE.FLASHARRAY.DRIVE.LLD.FILTER.NAME.MATCHES}|
Filter of discoverable storage drives by name.
|`.*`|
|{$PURE.FLASHARRAY.DRIVE.LLD.FILTER.NAME.NOT_MATCHES}|
Filter to exclude discoverable storage drives by name.
|`CHANGE_IF_NEEDED`|
|{$PURE.FLASHARRAY.HOST.LLD.FILTER.NAME.MATCHES}|
Filter of discoverable hosts by name.
|`.*`|
|{$PURE.FLASHARRAY.HOST.LLD.FILTER.NAME.NOT_MATCHES}|
Filter to exclude discoverable hosts by name.
|`CHANGE_IF_NEEDED`|
|{$PURE.FLASHARRAY.HOST.LLD.FILTER.GROUP.MATCHES}|
Filter of discoverable hosts by group.
|`.*`|
|{$PURE.FLASHARRAY.HOST.LLD.FILTER.GROUP.NOT_MATCHES}|
Filter to exclude discoverable hosts by group.
|`CHANGE_IF_NEEDED`|
|{$PURE.FLASHARRAY.NETIF.LLD.FILTER.NAME.MATCHES}|
Filter of discoverable network interfaces by name.
|`.*`|
|{$PURE.FLASHARRAY.NETIF.LLD.FILTER.NAME.NOT_MATCHES}|
Filter to exclude discoverable network interfaces by name.
|`CHANGE_IF_NEEDED`|
|{$PURE.FLASHARRAY.VOLUME.LLD.FILTER.NAME.MATCHES}|
Filter of discoverable storage volumes by name.
|`.*`|
|{$PURE.FLASHARRAY.VOLUME.LLD.FILTER.NAME.NOT_MATCHES}|
Filter to exclude discoverable storage volumes by name.
|`CHANGE_IF_NEEDED`|
|{$PURE.FLASHARRAY.HTTP_PROXY}|
HTTP proxy for API requests. You can specify it using the format [protocol://][username[:password]@]proxy.example.com[:port]. For more details, 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|
Pure Storage FlashArray authentication with username and password or API token usage.

Returns a session ID that is required only once and is used for all dependent script items.

A session will expire after 30 minutes. Check the template documentation for details.
|Script|purestorage.flasharray.auth|
|Authentication item errors|
Collects errors from the authentication item.
|Dependent item|purestorage.flasharray.auth.errors
**Preprocessing**

- 
JSON Path: `$.error`

- 
Discard unchanged with heartbeat: `1h`

|
|Get hardware data|
Collects hardware from the Pure Storage FlashArray API.
|Dependent item|purestorage.flasharray.hardware.get
**Preprocessing**

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

|
|Storage hardware item errors|
Collects errors from hardware retrieval.
|Dependent item|purestorage.flasharray.hardware.errors
**Preprocessing**

- 
JSON Path: `$.error`

- 
Discard unchanged with heartbeat: `1h`

|
|Get hosts|
Collects all hosts from the Pure Storage FlashArray API.
|Dependent item|purestorage.flasharray.hosts.get
**Preprocessing**

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

|
|Storage hosts item errors|
Collects errors from host data retrieval.
|Dependent item|purestorage.flasharray.hosts.errors
**Preprocessing**

- 
JSON Path: `$.error`

- 
Discard unchanged with heartbeat: `1h`

|
|Get volumes|
Collects all volumes from the Pure Storage FlashArray API.
|Dependent item|purestorage.flasharray.volumes.get
**Preprocessing**

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

|
|Storage volumes item errors|
Collects errors from volume retrieval.
|Dependent item|purestorage.flasharray.volumes.errors
**Preprocessing**

- 
JSON Path: `$.error`

- 
Discard unchanged with heartbeat: `1h`

|
|Get certificates|
Collects all certificates from the Pure Storage FlashArray API.
|Dependent item|purestorage.flasharray.certificates.get
**Preprocessing**

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

|
|Certificates item errors|
Collects errors from certificate retrieval.
|Dependent item|purestorage.flasharray.certificates.errors
**Preprocessing**

- 
JSON Path: `$.error`

- 
Discard unchanged with heartbeat: `1h`

|
|Get pods|
Collects all pods from the Pure Storage FlashArray API.
|Dependent item|purestorage.flasharray.pods.get
**Preprocessing**

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

|
|Storage pods item errors|
Collects errors from pod retrieval.
|Dependent item|purestorage.flasharray.pods.errors
**Preprocessing**

- 
JSON Path: `$.error`

- 
Discard unchanged with heartbeat: `1h`

|
|Get network interfaces|
Collects all network interfaces from the Pure Storage FlashArray API.
|Dependent item|purestorage.flasharray.net_ifs.get
**Preprocessing**

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

|
|Storage network interfaces item errors|
Collects errors from network interface retrieval.
|Dependent item|purestorage.flasharray.net_ifs.errors
**Preprocessing**

- 
JSON Path: `$.error`

- 
Discard unchanged with heartbeat: `1h`

|
|Get array data|
Collects array data from the Pure Storage FlashArray API.
|Dependent item|purestorage.flasharray.array.get
**Preprocessing**

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

|
|Storage array item errors|
Collects errors from array data retrieval.
|Dependent item|purestorage.flasharray.array.errors
**Preprocessing**

- 
JSON Path: `$.error`

- 
Discard unchanged with heartbeat: `1h`

|
|Array capacity|
Total capacity of the array.
|Dependent item|purestorage.flasharray.array.capacity
**Preprocessing**

- 
JSON Path: `$.array.space.capacity`

|
|Array data reduction|
The data reduction ratio (DRR) represents the efficiency of data reduction techniques such as compression and deduplication for the array volume.
|Dependent item|purestorage.flasharray.array.drr
**Preprocessing**

- 
JSON Path: `$.array.space.data_reduction`

|
|Array total data reduction|
The total reduction ratio of all data on the array volume that has been processed by the data deduplication and compression engines.
|Dependent item|purestorage.flasharray.array.total_drr
**Preprocessing**

- 
JSON Path: `$.array.space.total_reduction`

|
|Array hostname|
Host name of the array.
|Dependent item|purestorage.flasharray.array.hostname
**Preprocessing**

- 
JSON Path: `$.array.space.hostname`

- 
Discard unchanged with heartbeat: `1d`

|
|Array bytes written per second|
Number of bytes written per second.
|Dependent item|purestorage.flasharray.array.written_bytes.rate
**Preprocessing**

- 
JSON Path: `$.array.monitor.input_per_sec`

|
|Array bytes read per second|
Number of bytes read per second.
|Dependent item|purestorage.flasharray.array.read_bytes.rate
**Preprocessing**

- 
JSON Path: `$.array.monitor.output_per_sec`

|
|Array read requests per second|
Number of read requests processed per second.
|Dependent item|purestorage.flasharray.array.read_requests.rate
**Preprocessing**

- 
JSON Path: `$.array.monitor.reads_per_sec`

|
|Array write requests per second|
Number of write requests processed per second.
|Dependent item|purestorage.flasharray.array.write_requests.rate
**Preprocessing**

- 
JSON Path: `$.array.monitor.writes_per_sec`

|
|Array microseconds per read|
Average time in microseconds required to process an I/O read request from the array. The average time does not include SAN time, queue time, or QoS rate limit time.
|Dependent item|purestorage.flasharray.array.usec_per_read
**Preprocessing**

- 
JSON Path: `$.array.monitor.usec_per_read_op`

|
|Array microseconds per write|
Average time in microseconds required to process an I/O write request to the array. The average time does not include SAN time, queue time, or QoS rate limit time.
|Dependent item|purestorage.flasharray.array.usec_per_write
**Preprocessing**

- 
JSON Path: `$.array.monitor.usec_per_write_op`

|
|Array microseconds per operation|
Average local queue time in microseconds for both read and write operations.
|Dependent item|purestorage.flasharray.array.usec_per_op
**Preprocessing**

- 
JSON Path: `$.array.monitor.local_queue_usec_per_op`

|
|Array shared space|
The physical space occupied by deduplicated data.
|Dependent item|purestorage.flasharray.array.shared_space
**Preprocessing**

- 
JSON Path: `$.array.space.shared_space`

|
|Array used space|
The total physical space occupied by system, shared space, volume, and snapshot data.
|Dependent item|purestorage.flasharray.array.used_space
**Preprocessing**

- 
JSON Path: `$.array.space.total`

|
|Array volumes size|
The physical space occupied by volumes.
|Dependent item|purestorage.flasharray.array.volumes_size
**Preprocessing**

- 
JSON Path: `$.array.space.volumes`

|
|Array snapshots size|
The physical space occupied by snapshots.
|Dependent item|purestorage.flasharray.array.snapshots_size
**Preprocessing**

- 
JSON Path: `$.array.space.snapshots`

|
|Array system size|
The physical space occupied by internal array metadata.
|Dependent item|purestorage.flasharray.array.system_size
**Preprocessing**

- 
JSON Path: `$.array.space.system`

|
|Array thin provisioning|
The percentage of volume sectors that do not contain host-written data because the hosts have not written data to them or the sectors have been explicitly trimmed.
|Dependent item|purestorage.flasharray.array.thin_provisioning
**Preprocessing**

- 
JSON Path: `$.array.space.thin_provisioning`

- 
Custom multiplier: `100`

|
|Array parity|
The percentage of data that is protected.
|Dependent item|purestorage.flasharray.array.parity
**Preprocessing**

- 
JSON Path: `$.array.space.parity`

- 
Custom multiplier: `100`

|
|Array version|
Version of the array.
|Dependent item|purestorage.flasharray.array.version
**Preprocessing**

- 
JSON Path: `$.array.version`

- 
Discard unchanged with heartbeat: `1d`

|
|Remote assist status|
Status of the remote assist connection.
|Dependent item|purestorage.flasharray.remote_assist.status
**Preprocessing**

- 
JSON Path: `$.array.remote_assist.status`

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

- 
Discard unchanged with heartbeat: `6h`

|
|Phone home status|
Current status of a manually-initiated phonehome.
|Dependent item|purestorage.flasharray.phone_home.status
**Preprocessing**

- 
JSON Path: `$.array.phone_home.status`

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

- 
Discard unchanged with heartbeat: `6h`

|

### Triggers

|Name|Description|Expression|Severity|Dependencies and additional info|
|----|-----------|----------|--------|--------------------------------|
|Pure Storage FlashArray: Authentication has failed|
An error occurred when trying to perform authentication in the Pure Storage FlashArray API.
|`length(last(/Pure Storage FlashArray v1 by HTTP/purestorage.flasharray.auth.errors))>0`|Average||
|Pure Storage FlashArray: There are errors in the 'Get hardware data' metric|
An error occurred when trying to get hardware data from the Pure Storage FlashArray API.
|`length(last(/Pure Storage FlashArray v1 by HTTP/purestorage.flasharray.hardware.errors))>0`|Warning||
|Pure Storage FlashArray: There are errors in the 'Get hosts' metric|
An error occurred when trying to get host data from the Pure Storage FlashArray API.
|`length(last(/Pure Storage FlashArray v1 by HTTP/purestorage.flasharray.hosts.errors))>0`|Warning||
|Pure Storage FlashArray: There are errors in the 'Get volumes' metric|
An error occurred when trying to get volume data from the Pure Storage FlashArray API.
|`length(last(/Pure Storage FlashArray v1 by HTTP/purestorage.flasharray.volumes.errors))>0`|Warning||
|Pure Storage FlashArray: There are errors in the 'Get certificates' metric|
An error occurred when trying to get certificate data from the Pure Storage FlashArray API.
|`length(last(/Pure Storage FlashArray v1 by HTTP/purestorage.flasharray.certificates.errors))>0`|Warning||
|Pure Storage FlashArray: There are errors in the 'Get pods' metric|
An error occurred when trying to get pod data from the Pure Storage FlashArray API.
|`length(last(/Pure Storage FlashArray v1 by HTTP/purestorage.flasharray.pods.errors))>0`|Warning||
|Pure Storage FlashArray: There are errors in the 'Get network interfaces' metric|
An error occurred when trying to get network interface data from the Pure Storage FlashArray API.
|`length(last(/Pure Storage FlashArray v1 by HTTP/purestorage.flasharray.net_ifs.errors))>0`|Warning||
|Pure Storage FlashArray: There are errors in the 'Get storage array data' metric|
An error occurred when trying to get array data from the Pure Storage FlashArray API.
|`length(last(/Pure Storage FlashArray v1 by HTTP/purestorage.flasharray.array.errors))>0`|Warning||
|Pure Storage FlashArray: RemoteAssist has been enabled|
Purity's administrator-controlled RemoteAssist feature enables a Technical Support Engineer to communicate directly with the FlashArray via a secure link, effectively establishing an additional administrative session for the duration of the diagnosis and service.
|`last(/Pure Storage FlashArray v1 by HTTP/purestorage.flasharray.remote_assist.status)=1`|High||
|Pure Storage FlashArray: Phone Home has been disabled|
Phone Home connects to the Pure1 service and uploads logs for continuous health monitoring.
|`last(/Pure Storage FlashArray v1 by HTTP/purestorage.flasharray.phone_home.status)=0`|Warning||

### LLD rule Pod discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Pod discovery|
Discovery of storage pods from the Pure Storage FlashArray API.
|Dependent item|purestorage.flasharray.pod.discovery
**Preprocessing**

- 
JSON Path: `$.pods`

- 
Discard unchanged with heartbeat: `3h`

|

### Item prototypes for Pod discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Pod [{#NAME}]: Get data|
Collects data about the {#NAME} pod.
|Dependent item|purestorage.flasharray.pod.get[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.pods[?(@.name == "{#NAME}")].first()`

⛔️Custom on fail: Discard value

|
|Pod [{#NAME}]: Promotion status|
The current promotion status of the {#NAME} pod.
|Dependent item|purestorage.flasharray.pod.status[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.promotion_status`

⛔️Custom on fail: Discard value

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

|
|Pod [{#NAME}]: Number of arrays|
Number of arrays connected to the {#NAME} pod.
|Dependent item|purestorage.flasharray.pod.arrays[{#NAME}]
**Preprocessing**

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

⛔️Custom on fail: Set value to: `0`

|

### LLD rule Drive discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Drive discovery|
Discovery of storage drives from the Pure Storage FlashArray API.
|Dependent item|purestorage.flasharray.drive.discovery
**Preprocessing**

- 
JSON Path: `$.drives`

- 
Discard unchanged with heartbeat: `3h`

|

### Item prototypes for Drive discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Drive [{#NAME}]: Get data|
Collects data about the {#NAME} drive.
|Dependent item|purestorage.flasharray.drive.get[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.drives[?(@.name == "{#NAME}")].first()`

⛔️Custom on fail: Discard value

|
|Drive [{#NAME}]: Capacity|
The capacity of the {#NAME} drive.
|Dependent item|purestorage.flasharray.drive.capacity[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.capacity`

⛔️Custom on fail: Discard value

|
|Drive [{#NAME}]: Status|
The current status of the {#NAME} drive.
|Dependent item|purestorage.flasharray.drive.status[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.status`

⛔️Custom on fail: Discard value

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

|
|Drive [{#NAME}]: Serial number|
Serial number of the {#NAME} drive device.
|Dependent item|purestorage.flasharray.drive.serial[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.hardware.serial`

⛔️Custom on fail: Discard value

- 
Discard unchanged with heartbeat: `1d`

- 
Does not match regular expression: `^null$`

⛔️Custom on fail: Discard value

|

### Trigger prototypes for Drive discovery

|Name|Description|Expression|Severity|Dependencies and additional info|
|----|-----------|----------|--------|--------------------------------|
|Pure Storage FlashArray: Drive [{#NAME}]: Problem on the drive|
Drive {#NAME} status is not "healthy", "updating", or "unused".
|`last(/Pure Storage FlashArray v1 by HTTP/purestorage.flasharray.drive.status[{#NAME}])<>0 and last(/Pure Storage FlashArray v1 by HTTP/purestorage.flasharray.drive.status[{#NAME}])<>2 and last(/Pure Storage FlashArray v1 by HTTP/purestorage.flasharray.drive.status[{#NAME}])<>3`|Average||

### LLD rule Controller discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Controller discovery|
Discovery of controllers from the Pure Storage FlashArray API.
|Dependent item|purestorage.flasharray.ctrl.discovery
**Preprocessing**

- 
JSON Path: `$.controllers`

- 
Discard unchanged with heartbeat: `3h`

|

### Item prototypes for Controller discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Controller [{#NAME}]: Get data|
Collects data about the {#NAME} controller.
|Dependent item|purestorage.flasharray.ctrl.get[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.controllers[?(@.name == "{#NAME}")].first()`

⛔️Custom on fail: Discard value

|
|Controller [{#NAME}]: Status|
The current status of the {#NAME} controller.
|Dependent item|purestorage.flasharray.ctrl.status[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.status`

⛔️Custom on fail: Discard value

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

|
|Controller [{#NAME}]: Mode|
The current mode of the {#NAME} controller.
|Dependent item|purestorage.flasharray.ctrl.mode[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.mode`

⛔️Custom on fail: Discard value

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

|
|Controller [{#NAME}]: Serial number|
Serial number of the {#NAME} controller.
|Dependent item|purestorage.flasharray.ctrl.serial[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.hardware.serial`

⛔️Custom on fail: Discard value

- 
Discard unchanged with heartbeat: `1d`

|
|Controller [{#NAME}]: Model|
Model of the {#NAME} controller.
|Dependent item|purestorage.flasharray.ctrl.model[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.model`

⛔️Custom on fail: Discard value

- 
Discard unchanged with heartbeat: `1d`

|
|Controller [{#NAME}]: Version|
Version of the {#NAME} controller.
|Dependent item|purestorage.flasharray.ctrl.version[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.version`

⛔️Custom on fail: Discard value

- 
Discard unchanged with heartbeat: `1d`

|

### Trigger prototypes for Controller discovery

|Name|Description|Expression|Severity|Dependencies and additional info|
|----|-----------|----------|--------|--------------------------------|
|Pure Storage FlashArray: Controller [{#NAME}]: Controller is not ready|
Controller {#NAME} status is not "ready" or "updating".
|`last(/Pure Storage FlashArray v1 by HTTP/purestorage.flasharray.ctrl.status[{#NAME}])<>1 and last(/Pure Storage FlashArray v1 by HTTP/purestorage.flasharray.ctrl.status[{#NAME}])<>2`|Average||
|Pure Storage FlashArray: Controller [{#NAME}]: Mode has been changed|
The mode of the {#NAME} controller has changed.
|`last(/Pure Storage FlashArray v1 by HTTP/purestorage.flasharray.ctrl.mode[{#NAME}],#1)<>last(/Pure Storage FlashArray v1 by HTTP/purestorage.flasharray.ctrl.mode[{#NAME}],#2)`|Average||

### LLD rule Temperature sensor discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Temperature sensor discovery|
Discovery of temperature sensors from the Pure Storage FlashArray API.
|Dependent item|purestorage.flasharray.temp.discovery
**Preprocessing**

- 
JSON Path: `$.hardware`

- 
Discard unchanged with heartbeat: `3h`

|

### Item prototypes for Temperature sensor discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Sensor [{#NAME}]: Get data|
Collects data about the {#NAME} temperature sensor.
|Dependent item|purestorage.flasharray.temp.get[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.hardware[?(@.name == "{#NAME}")].first()`

⛔️Custom on fail: Discard value

|
|Sensor [{#NAME}]: Status|
The current status of the {#NAME} temperature sensor.
|Dependent item|purestorage.flasharray.temp.status[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.status`

⛔️Custom on fail: Discard value

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

|
|Sensor [{#NAME}]: Temperature|
The current temperature value of the {#NAME} sensor.
|Dependent item|purestorage.flasharray.temp.value[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.temperature`

⛔️Custom on fail: Discard value

|

### Trigger prototypes for Temperature sensor discovery

|Name|Description|Expression|Severity|Dependencies and additional info|
|----|-----------|----------|--------|--------------------------------|
|Pure Storage FlashArray: Sensor [{#NAME}]: Sensor is not healthy|
Temperature sensor {#NAME} status is not "ok".
|`last(/Pure Storage FlashArray v1 by HTTP/purestorage.flasharray.temp.status[{#NAME}])<>0`|Average||

### LLD rule Power supply discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Power supply discovery|
Discovery of power supply components from the Pure Storage FlashArray API.
|Dependent item|purestorage.flasharray.power.discovery
**Preprocessing**

- 
JSON Path: `$.hardware`

- 
Discard unchanged with heartbeat: `3h`

|

### Item prototypes for Power supply discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Power supply [{#NAME}]: Get data|
Collects data about the {#NAME} power supply component.
|Dependent item|purestorage.flasharray.power.get[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.hardware[?(@.name == "{#NAME}")].first()`

⛔️Custom on fail: Discard value

|
|Power supply [{#NAME}]: Status|
The current status of the {#NAME} power supply component.
|Dependent item|purestorage.flasharray.power.status[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.status`

⛔️Custom on fail: Discard value

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

|
|Power supply [{#NAME}]: Serial number|
Serial number of the {#NAME} power supply component.
|Dependent item|purestorage.flasharray.power.serial[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.serial`

⛔️Custom on fail: Discard value

- 
Discard unchanged with heartbeat: `1d`

|
|Power supply [{#NAME}]: Model|
Model of the {#NAME} power supply component.
|Dependent item|purestorage.flasharray.power.model[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.model`

⛔️Custom on fail: Discard value

- 
Discard unchanged with heartbeat: `1d`

|
|Power supply [{#NAME}]: Voltage|
The current voltage value of the {#NAME} power supply component.
|Dependent item|purestorage.flasharray.power.value[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.voltage`

⛔️Custom on fail: Discard value

|

### Trigger prototypes for Power supply discovery

|Name|Description|Expression|Severity|Dependencies and additional info|
|----|-----------|----------|--------|--------------------------------|
|Pure Storage FlashArray: Power supply [{#NAME}]: Power supply is not healthy|
Power supply component {#NAME} status is not "ok".
|`last(/Pure Storage FlashArray v1 by HTTP/purestorage.flasharray.power.status[{#NAME}])<>0`|Average||

### LLD rule Fan discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Fan discovery|
Discovery of fans from the Pure Storage FlashArray API.
|Dependent item|purestorage.flasharray.fan.discovery
**Preprocessing**

- 
JSON Path: `$.hardware`

- 
Discard unchanged with heartbeat: `3h`

|

### Item prototypes for Fan discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Fan [{#NAME}]: Get data|
Collects data about the {#NAME} fan.
|Dependent item|purestorage.flasharray.fan.get[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.hardware[?(@.name == "{#NAME}")].first()`

⛔️Custom on fail: Discard value

|
|Fan [{#NAME}]: Status|
The current status of the {#NAME} fan.
|Dependent item|purestorage.flasharray.fan.status[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.status`

⛔️Custom on fail: Discard value

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

|

### Trigger prototypes for Fan discovery

|Name|Description|Expression|Severity|Dependencies and additional info|
|----|-----------|----------|--------|--------------------------------|
|Pure Storage FlashArray: Fan [{#NAME}]: Fan is not healthy|
Fan {#NAME} status is not "ok".
|`last(/Pure Storage FlashArray v1 by HTTP/purestorage.flasharray.fan.status[{#NAME}])<>0`|Average||

### LLD rule Host discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Host discovery|
Discovery of storage hosts from the Pure Storage FlashArray API.
|Dependent item|purestorage.flasharray.host.discovery
**Preprocessing**

- 
JSON Path: `$.hosts`

- 
Discard unchanged with heartbeat: `3h`

|

### Item prototypes for Host discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Host [{#NAME}]: Get data|
Collects data about the {#NAME} host.
|Dependent item|purestorage.flasharray.host.get[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.hosts[?(@.name == "{#NAME}")].first()`

⛔️Custom on fail: Discard value

|
|Host [{#NAME}]: Size|
The physical space occupied on the {#NAME} host volume.
|Dependent item|purestorage.flasharray.host.size[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.space.size`

⛔️Custom on fail: Discard value

|
|Host [{#NAME}]: Data reduction|
The data reduction ratio (DRR) represents the efficiency of data reduction techniques such as compression and deduplication for the {#NAME} host volume.
|Dependent item|purestorage.flasharray.host.drr[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.space.data_reduction`

|
|Host [{#NAME}]: Total data reduction|
The total reduction ratio of all data on the {#NAME} host volume that has been processed by the data deduplication and compression engines.
|Dependent item|purestorage.flasharray.host.total_drr[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.space.total_reduction`

|
|Host [{#NAME}]: Bytes written per second|
Number of bytes written to the {#NAME} host volume per second.
|Dependent item|purestorage.flasharray.host.written_bytes.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.monitor.input_per_sec`

|
|Host [{#NAME}]: Bytes read per second|
Number of bytes read from the {#NAME} host volume per second.
|Dependent item|purestorage.flasharray.host.read_bytes.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.monitor.output_per_sec`

|
|Host [{#NAME}]: Read requests per second|
Number of read requests processed on the {#NAME} host volume per second.
|Dependent item|purestorage.flasharray.host.read_requests.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.monitor.reads_per_sec`

|
|Host [{#NAME}]: Write requests per second|
Number of write requests processed on the {#NAME} host volume per second.
|Dependent item|purestorage.flasharray.host.write_requests.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.monitor.writes_per_sec`

|
|Host [{#NAME}]: Microseconds per read|
Average time in microseconds required to process an I/O read request from the {#NAME} host volume.
|Dependent item|purestorage.flasharray.host.usec_per_read[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.monitor.usec_per_read_op`

|
|Host [{#NAME}]: Microseconds per write|
Average time in microseconds required to process an I/O write request to the {#NAME} host volume.
|Dependent item|purestorage.flasharray.host.usec_per_write[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.monitor.usec_per_write_op`

|
|Host [{#NAME}]: Used space|
The total physical space occupied by all data on the {#NAME} host volume.
|Dependent item|purestorage.flasharray.host.used_space[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.space.total`

|
|Host [{#NAME}]: Snapshots size|
The physical space occupied by snapshots on the {#NAME} host volume.
|Dependent item|purestorage.flasharray.host.snapshots_size[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.space.snapshots`

|
|Host [{#NAME}]: Thin provisioning|
The percentage of sectors in the {#NAME} host volume that do not contain host-written data because the hosts have not written data to them or the sectors have been explicitly trimmed.
|Dependent item|purestorage.flasharray.host.thin_provisioning[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.space.thin_provisioning`

- 
Custom multiplier: `100`

|

### LLD rule Volume discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Volume discovery|
Discovery of storage volumes from the Pure Storage FlashArray API.
|Dependent item|purestorage.flasharray.volume.discovery
**Preprocessing**

- 
JSON Path: `$.volumes`

- 
Discard unchanged with heartbeat: `3h`

|

### Item prototypes for Volume discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Volume [{#NAME}]: Get data|
Collects data about the {#NAME} volume.
|Dependent item|purestorage.flasharray.volume.get[{#SN}]
**Preprocessing**

- 
JSON Path: `$.volumes[?(@.serial == "{#SN}")].first()`

⛔️Custom on fail: Discard value

|
|Volume [{#NAME}]: Size|
The physical space occupied by the {#NAME} volume.
|Dependent item|purestorage.flasharray.volume.size[{#SN}]
**Preprocessing**

- 
JSON Path: `$.size`

⛔️Custom on fail: Discard value

|
|Volume [{#NAME}]: Data reduction|
The data reduction ratio (DRR) represents the efficiency of data reduction techniques such as compression and deduplication for the {#NAME} volume.
|Dependent item|purestorage.flasharray.volume.drr[{#SN}]
**Preprocessing**

- 
JSON Path: `$.space.data_reduction`

|
|Volume [{#NAME}]: Total data reduction|
The total reduction ratio of all data on the {#NAME} volume that has been processed by the data deduplication and compression engines.
|Dependent item|purestorage.flasharray.volume.total_drr[{#SN}]
**Preprocessing**

- 
JSON Path: `$.space.total_reduction`

|
|Volume [{#NAME}]: Bytes written per second|
Number of bytes written to the {#NAME} volume per second.
|Dependent item|purestorage.flasharray.volume.written_bytes.rate[{#SN}]
**Preprocessing**

- 
JSON Path: `$.monitor.input_per_sec`

|
|Volume [{#NAME}]: Bytes read per second|
Number of bytes read from the {#NAME} volume per second.
|Dependent item|purestorage.flasharray.volume.read_bytes.rate[{#SN}]
**Preprocessing**

- 
JSON Path: `$.monitor.output_per_sec`

|
|Volume [{#NAME}]: Read requests per second|
Number of read requests processed on the {#NAME} volume per second.
|Dependent item|purestorage.flasharray.volume.read_requests.rate[{#SN}]
**Preprocessing**

- 
JSON Path: `$.monitor.reads_per_sec`

|
|Volume [{#NAME}]: Write requests per second|
Number of write requests processed on the {#NAME} volume per second.
|Dependent item|purestorage.flasharray.volume.write_requests.rate[{#SN}]
**Preprocessing**

- 
JSON Path: `$.monitor.writes_per_sec`

|
|Volume [{#NAME}]: Microseconds per read|
Average time in microseconds required to process an I/O read request from the {#NAME} volume.
|Dependent item|purestorage.flasharray.volume.usec_per_read[{#SN}]
**Preprocessing**

- 
JSON Path: `$.monitor.usec_per_read_op`

|
|Volume [{#NAME}]: Microseconds per write|
Average time in microseconds required to process an I/O write request to the {#NAME} volume.
|Dependent item|purestorage.flasharray.volume.usec_per_write[{#SN}]
**Preprocessing**

- 
JSON Path: `$.monitor.usec_per_write_op`

|
|Volume [{#NAME}]: Shared space|
The physical space occupied by deduplicated data on the {#NAME} volume.
|Dependent item|purestorage.flasharray.volume.shared_space[{#SN}]
**Preprocessing**

- 
JSON Path: `$.space.shared_space`

- 
Does not match regular expression: `^null$`

⛔️Custom on fail: Set value to: `0`

|
|Volume [{#NAME}]: Used space|
The total physical space occupied by all data on the {#NAME} volume.
|Dependent item|purestorage.flasharray.volume.used_space[{#SN}]
**Preprocessing**

- 
JSON Path: `$.space.total`

|
|Volume [{#NAME}]: Snapshots size|
The physical space occupied by snapshots on the {#NAME} volume.
|Dependent item|purestorage.flasharray.volume.snapshots_size[{#SN}]
**Preprocessing**

- 
JSON Path: `$.space.snapshots`

|
|Volume [{#NAME}]: Thin provisioning|
The percentage of sectors in the {#NAME} volume that do not contain host-written data because the hosts have not written data to them or the sectors have been explicitly trimmed.
|Dependent item|purestorage.flasharray.volume.thin_provisioning[{#SN}]
**Preprocessing**

- 
JSON Path: `$.space.thin_provisioning`

- 
Custom multiplier: `100`

|

### Trigger prototypes for Volume discovery

|Name|Description|Expression|Severity|Dependencies and additional info|
|----|-----------|----------|--------|--------------------------------|
|Pure Storage FlashArray: Volume [{#NAME}]: Volume size has been changed|
Physical space occupied by the {#NAME} volume has been changed.
|`last(/Pure Storage FlashArray v1 by HTTP/purestorage.flasharray.volume.size[{#SN}],#1)<>last(/Pure Storage FlashArray v1 by HTTP/purestorage.flasharray.volume.size[{#SN}],#2)`|Warning||

### LLD rule Certificate discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Certificate discovery|
Discovery of certificates from the Pure Storage FlashArray API.
|Dependent item|purestorage.flasharray.cert.discovery
**Preprocessing**

- 
JSON Path: `$.certs`

- 
Discard unchanged with heartbeat: `3h`

|

### Item prototypes for Certificate discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Certificate [{#NAME}]: Get data|
Collects data about the {#NAME} certificate.
|Dependent item|purestorage.flasharray.cert.get[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.certs[?(@.name == "{#NAME}")].first()`

⛔️Custom on fail: Discard value

|
|Certificate [{#NAME}]: Common name|
The common name field listed in the {#NAME} certificate.
|Dependent item|purestorage.flasharray.cert.cn[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.common_name`

- 
Discard unchanged with heartbeat: `1d`

- 
Does not match regular expression: `^null$`

⛔️Custom on fail: Discard value

|
|Certificate [{#NAME}]: Issued to|
Indicates the entity which holds the {#NAME} certificate.
|Dependent item|purestorage.flasharray.cert.issued_to[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.issued_to`

- 
Discard unchanged with heartbeat: `1d`

- 
Does not match regular expression: `^$`

⛔️Custom on fail: Discard value

|
|Certificate [{#NAME}]: Issued by|
Indicates the authority or organization that issued the {#NAME} certificate, typically including information such as the name of the Certificate Authority (CA) and its digital signature.
|Dependent item|purestorage.flasharray.cert.issued_by[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.issued_by`

- 
Discard unchanged with heartbeat: `1d`

- 
Does not match regular expression: `^$`

⛔️Custom on fail: Discard value

|
|Certificate [{#NAME}]: Valid from|
Indicates the date and time when the {#NAME} certificate takes effect.
|Dependent item|purestorage.flasharray.cert.valid_from[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.valid_from`

- 
Custom multiplier: `0.001`

|
|Certificate [{#NAME}]: Valid to|
Indicates the expiration date and time of the {#NAME} certificate.
|Dependent item|purestorage.flasharray.cert.valid_to[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.valid_to`

- 
Custom multiplier: `0.001`

|

### Trigger prototypes for Certificate discovery

|Name|Description|Expression|Severity|Dependencies and additional info|
|----|-----------|----------|--------|--------------------------------|
|Pure Storage FlashArray: Certificate [{#NAME}]: SSL certificate expires soon|
Consider reissuing and replacing the {#NAME} certificate.
|`last(/Pure Storage FlashArray v1 by HTTP/purestorage.flasharray.cert.valid_to[{#NAME}]) > 0 and (last(/Pure Storage FlashArray v1 by HTTP/purestorage.flasharray.cert.valid_to[{#NAME}]) - now()) / 86400 < {$PURE.FLASHARRAY.CERT.EXPIRY.WARN}`|Average||

### LLD rule Network interface discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Network interface discovery|
Discovery of storage hosts from the Pure Storage FlashArray API.
|Dependent item|purestorage.flasharray.net_if.discovery
**Preprocessing**

- 
JSON Path: `$.interfaces`

- 
Discard unchanged with heartbeat: `3h`

|

### Item prototypes for Network interface discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Interface [{#IFNAME}]: Get data|
Collects data about the {#IFNAME} network interface.
|Dependent item|purestorage.flasharray.net_if.get[{#IFNAME}]
**Preprocessing**

- 
JSON Path: `$.interfaces[?(@.name == "{#IFNAME}")].first()`

⛔️Custom on fail: Discard value

|
|Interface [{#IFNAME}]: Speed|
Current bandwidth of the interface.
|Dependent item|purestorage.flasharray.net_if.speed[{#IFNAME}]
**Preprocessing**

- 
JSON Path: `$.speed`

|
|Interface [{#IFNAME}]: IP address|
Represents the IP address of the {#IFNAME} interface.
|Dependent item|purestorage.flasharray.net_if.ip[{#IFNAME}]
**Preprocessing**

- 
JSON Path: `$.address`

- 
Discard unchanged with heartbeat: `1d`

- 
Does not match regular expression: `^null$`

⛔️Custom on fail: Discard value

|
|Interface [{#IFNAME}]: MAC address|
Represents the MAC address of the {#IFNAME} interface.
|Dependent item|purestorage.flasharray.net_if.mac[{#IFNAME}]
**Preprocessing**

- 
JSON Path: `$.hwaddr`

- 
Discard unchanged with heartbeat: `1d`

- 
Does not match regular expression: `^null$`

⛔️Custom on fail: Discard value

|
|Interface [{#IFNAME}]: Gateway|
Represents the IP address of the gateway for the {#IFNAME} interface.
|Dependent item|purestorage.flasharray.net_if.gateway[{#IFNAME}]
**Preprocessing**

- 
JSON Path: `$.gateway`

- 
Discard unchanged with heartbeat: `1d`

- 
Does not match regular expression: `^null$`

⛔️Custom on fail: Discard value

|

### Trigger prototypes for Network interface discovery

|Name|Description|Expression|Severity|Dependencies and additional info|
|----|-----------|----------|--------|--------------------------------|
|Pure Storage FlashArray: 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(/Pure Storage FlashArray v1 by HTTP/purestorage.flasharray.net_if.speed[{#IFNAME}])<0 and last(/Pure Storage FlashArray v1 by HTTP/purestorage.flasharray.net_if.speed[{#IFNAME}])>0`|Info|**Manual close**: Yes|

# Pure Storage FlashArray v2 by HTTP

## Overview

This template is designed for the effortless deployment of Pure Storage FlashArray v2 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:
- Pure Storage FlashArray FA-X20R4 (Purity//FA: 6.7.1)

## 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. Create a host for the Pure Storage FlashArray device and assign to it the "Pure Storage FlashArray v2 by HTTP" template.
2. Enter your API token from the FlashArray (Purity//FA) graphical user interface into the `{$PURE.FLASHARRAY.API.TOKEN}` macro.
3. Set your FlashArray (Purity//FA) graphical user interface URL as the `{$PURE.FLASHARRAY.API.URL}` macro value.

### Macros used

|Name|Description|Default|
|----|-----------|-------|
|{$PURE.FLASHARRAY.API.URL}|
Pure Storage FlashArray Web interface URL.
||
|{$PURE.FLASHARRAY.API.TOKEN}|
Pure Storage FlashArray API token.
||
|{$PURE.FLASHARRAY.API.VERSION}|
Pure Storage FlashArray API version.
|`2.36`|
|{$PURE.FLASHARRAY.CERT.EXPIRY.WARN}|
Number of days until the certificate expires.
|`7`|
|{$PURE.FLASHARRAY.DATA.TIMEOUT}|
Response timeout for the API.
|`15s`|
|{$PURE.FLASHARRAY.POD.LLD.FILTER.NAME.MATCHES}|
Filter of discoverable storage pods by name.
|`.*`|
|{$PURE.FLASHARRAY.POD.LLD.FILTER.NAME.NOT_MATCHES}|
Filter to exclude discoverable storage pods by name.
|`CHANGE_IF_NEEDED`|
|{$PURE.FLASHARRAY.CERT.LLD.FILTER.NAME.MATCHES}|
Filter of discoverable certificates by name.
|`.*`|
|{$PURE.FLASHARRAY.CERT.LLD.FILTER.NAME.NOT_MATCHES}|
Filter to exclude discoverable certificates by name.
|`CHANGE_IF_NEEDED`|
|{$PURE.FLASHARRAY.CTRL.LLD.FILTER.INDEX.MATCHES}|
Filter of discoverable controllers by index.
|`.*`|
|{$PURE.FLASHARRAY.CTRL.LLD.FILTER.INDEX.NOT_MATCHES}|
Filter to exclude discoverable controllers by index.
|`CHANGE_IF_NEEDED`|
|{$PURE.FLASHARRAY.TEMP.LLD.FILTER.INDEX.MATCHES}|
Filter of discoverable temperature sensors by index.
|`.*`|
|{$PURE.FLASHARRAY.TEMP.LLD.FILTER.INDEX.NOT_MATCHES}|
Filter to exclude discoverable temperature sensors by index.
|`CHANGE_IF_NEEDED`|
|{$PURE.FLASHARRAY.POWER.LLD.FILTER.INDEX.MATCHES}|
Filter of discoverable power supply components by index.
|`.*`|
|{$PURE.FLASHARRAY.POWER.LLD.FILTER.INDEX.NOT_MATCHES}|
Filter to exclude discoverable power supply components by index.
|`CHANGE_IF_NEEDED`|
|{$PURE.FLASHARRAY.FAN.LLD.FILTER.INDEX.MATCHES}|
Filter of discoverable fans by index.
|`.*`|
|{$PURE.FLASHARRAY.FAN.LLD.FILTER.INDEX.NOT_MATCHES}|
Filter to exclude discoverable fans by index.
|`CHANGE_IF_NEEDED`|
|{$PURE.FLASHARRAY.DRIVE.LLD.FILTER.NAME.MATCHES}|
Filter of discoverable storage drives by name.
|`.*`|
|{$PURE.FLASHARRAY.DRIVE.LLD.FILTER.NAME.NOT_MATCHES}|
Filter to exclude discoverable storage drives by name.
|`CHANGE_IF_NEEDED`|
|{$PURE.FLASHARRAY.HOST.LLD.FILTER.NAME.MATCHES}|
Filter of discoverable hosts by name.
|`.*`|
|{$PURE.FLASHARRAY.HOST.LLD.FILTER.NAME.NOT_MATCHES}|
Filter to exclude discoverable hosts by name.
|`CHANGE_IF_NEEDED`|
|{$PURE.FLASHARRAY.HOST.LLD.FILTER.GROUP.MATCHES}|
Filter of discoverable hosts by group.
|`.*`|
|{$PURE.FLASHARRAY.HOST.LLD.FILTER.GROUP.NOT_MATCHES}|
Filter to exclude discoverable hosts by group.
|`CHANGE_IF_NEEDED`|
|{$PURE.FLASHARRAY.NETIF.LLD.FILTER.NAME.MATCHES}|
Filter of discoverable network interfaces by name.
|`.*`|
|{$PURE.FLASHARRAY.NETIF.LLD.FILTER.NAME.NOT_MATCHES}|
Filter to exclude discoverable network interfaces by name.
|`CHANGE_IF_NEEDED`|
|{$PURE.FLASHARRAY.VOLUME.LLD.FILTER.NAME.MATCHES}|
Filter of discoverable storage volumes by name.
|`.*`|
|{$PURE.FLASHARRAY.VOLUME.LLD.FILTER.NAME.NOT_MATCHES}|
Filter to exclude discoverable storage volumes by name.
|`CHANGE_IF_NEEDED`|
|{$PURE.FLASHARRAY.HTTP_PROXY}|
HTTP proxy for API requests. You can specify it using the format [protocol://][username[:password]@]proxy.example.com[:port]. For more details, 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|
Pure Storage FlashArray authentication with API token usage.

Returns a session token; it is required only once and is used for all dependent script items.

A session will expire after 30 minutes. Check the template documentation for the details.
|Script|purestorage.flasharray.auth|
|Authentication item errors|
Collects errors from the authentication item.
|Dependent item|purestorage.flasharray.auth.errors
**Preprocessing**

- 
JSON Path: `$.error`

- 
Discard unchanged with heartbeat: `1h`

|
|Get hardware data|
Collects hardware from the Pure Storage FlashArray API.
|Dependent item|purestorage.flasharray.hardware.get
**Preprocessing**

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

|
|Storage hardware item errors|
Collects errors from hardware retrieval.
|Dependent item|purestorage.flasharray.hardware.errors
**Preprocessing**

- 
JSON Path: `$.error`

- 
Discard unchanged with heartbeat: `1h`

|
|Get hosts|
Collects all hosts from the Pure Storage FlashArray API.
|Dependent item|purestorage.flasharray.hosts.get
**Preprocessing**

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

|
|Storage hosts item errors|
Collects errors from host data retrieval.
|Dependent item|purestorage.flasharray.hosts.errors
**Preprocessing**

- 
JSON Path: `$.error`

- 
Discard unchanged with heartbeat: `1h`

|
|Get volumes|
Collects all volumes from the Pure Storage FlashArray API.
|Dependent item|purestorage.flasharray.volumes.get
**Preprocessing**

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

|
|Storage volumes item errors|
Collects errors from volume retrieval.
|Dependent item|purestorage.flasharray.volumes.errors
**Preprocessing**

- 
JSON Path: `$.error`

- 
Discard unchanged with heartbeat: `1h`

|
|Get certificates|
Collects all certificates from the Pure Storage FlashArray API.
|Dependent item|purestorage.flasharray.certificates.get
**Preprocessing**

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

|
|Certificates item errors|
Collects errors from certificate retrieval.
|Dependent item|purestorage.flasharray.certificates.errors
**Preprocessing**

- 
JSON Path: `$.error`

- 
Discard unchanged with heartbeat: `1h`

|
|Get pods|
Collects all pods from the Pure Storage FlashArray API.
|Dependent item|purestorage.flasharray.pods.get
**Preprocessing**

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

|
|Storage pods item errors|
Collects errors from pod retrieval.
|Dependent item|purestorage.flasharray.pods.errors
**Preprocessing**

- 
JSON Path: `$.error`

- 
Discard unchanged with heartbeat: `1h`

|
|Get network interfaces|
Collects all network interfaces from the Pure Storage FlashArray API.
|Dependent item|purestorage.flasharray.net_ifs.get
**Preprocessing**

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

|
|Storage network interfaces item errors|
Collects errors from network interface retrieval.
|Dependent item|purestorage.flasharray.net_ifs.errors
**Preprocessing**

- 
JSON Path: `$.error`

- 
Discard unchanged with heartbeat: `1h`

|
|Get array data|
Collects array data from the Pure Storage FlashArray API.
|Dependent item|purestorage.flasharray.array.get
**Preprocessing**

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

|
|Storage array item errors|
Collects errors from array data retrieval.
|Dependent item|purestorage.flasharray.array.errors
**Preprocessing**

- 
JSON Path: `$.error`

- 
Discard unchanged with heartbeat: `1h`

|
|Get support information|
Collects support information from the Pure Storage FlashArray API.
|Dependent item|purestorage.flasharray.support.get
**Preprocessing**

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

|
|Support information item errors|
Collects errors from support information retrieval.
|Dependent item|purestorage.flasharray.support.errors
**Preprocessing**

- 
JSON Path: `$.error`

- 
Discard unchanged with heartbeat: `1h`

|
|Get alerts data|
Collects alert data from the Pure Storage FlashArray API.
|Dependent item|purestorage.flasharray.alert.get
**Preprocessing**

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

|
|Alerts data item errors|
Collects errors from alert data retrieval.
|Dependent item|purestorage.flasharray.alert.errors
**Preprocessing**

- 
JSON Path: `$.error`

- 
Discard unchanged with heartbeat: `1h`

|
|Critical alerts|
Number of active alerts in the web interface of Pure Storage FlashArray with a severity level of Critical.
|Dependent item|purestorage.flasharray.alert.critical
**Preprocessing**

- 
JSON Path: `$..[?(@.severity == "critical")].length()`

|
|Warning alerts|
Number of active alerts in the web interface of Pure Storage FlashArray with a severity level of Warning.
|Dependent item|purestorage.flasharray.alert.warning
**Preprocessing**

- 
JSON Path: `$..[?(@.severity == "warning")].length()`

|
|Array capacity|
Total capacity of the array.
|Dependent item|purestorage.flasharray.array.capacity
**Preprocessing**

- 
JSON Path: `$.array.capacity`

|
|Array data reduction|
The data reduction ratio (DRR) represents the efficiency of data reduction techniques such as compression and deduplication for the array volume.
|Dependent item|purestorage.flasharray.array.drr
**Preprocessing**

- 
JSON Path: `$.array.space.data_reduction`

|
|Array total data reduction|
The total reduction ratio of all data on the array volume that has been processed by the data deduplication and compression engines.
|Dependent item|purestorage.flasharray.array.total_drr
**Preprocessing**

- 
JSON Path: `$.array.space.total_reduction`

|
|Array hostname|
Host name of the array.
|Dependent item|purestorage.flasharray.array.hostname
**Preprocessing**

- 
JSON Path: `$.array.name`

- 
Discard unchanged with heartbeat: `1d`

|
|Array bytes written per second|
Number of bytes written per second.
|Dependent item|purestorage.flasharray.array.written_bytes.rate
**Preprocessing**

- 
JSON Path: `$.array.performance.write_bytes_per_sec`

|
|Array bytes read per second|
Number of bytes read per second.
|Dependent item|purestorage.flasharray.array.read_bytes.rate
**Preprocessing**

- 
JSON Path: `$.array.performance.read_bytes_per_sec`

|
|Array read requests per second|
Number of read requests processed per second.
|Dependent item|purestorage.flasharray.array.read_requests.rate
**Preprocessing**

- 
JSON Path: `$.array.performance.reads_per_sec`

|
|Array write requests per second|
Number of write requests processed per second.
|Dependent item|purestorage.flasharray.array.write_requests.rate
**Preprocessing**

- 
JSON Path: `$.array.performance.writes_per_sec`

|
|Array microseconds per read|
Average time in microseconds required to process an I/O read request from the array. The average time does not include SAN time, queue time, or QoS rate limit time.
|Dependent item|purestorage.flasharray.array.usec_per_read
**Preprocessing**

- 
JSON Path: `$.array.performance.usec_per_read_op`

|
|Array microseconds per write|
Average time in microseconds required to process an I/O write request to the array. The average time does not include SAN time, queue time, or QoS rate limit time.
|Dependent item|purestorage.flasharray.array.usec_per_write
**Preprocessing**

- 
JSON Path: `$.array.performance.usec_per_write_op`

|
|Array microseconds per operation|
Average local queue time in microseconds for both read and write operations.
|Dependent item|purestorage.flasharray.array.usec_per_op
**Preprocessing**

- 
JSON Path: `$.array.performance.local_queue_usec_per_op`

|
|Array shared space|
The physical space occupied by deduplicated data.
|Dependent item|purestorage.flasharray.array.shared_space
**Preprocessing**

- 
JSON Path: `$.array.space.shared`

|
|Array used space|
The total space occupied by system, shared space, volume, and snapshot data.
|Dependent item|purestorage.flasharray.array.used_space
**Preprocessing**

- 
JSON Path: `$.array.space.total_used`

⛔️Custom on fail: Discard value

|
|Array physical size|
The total physical space occupied by system, shared space, volume, and snapshot data.
|Dependent item|purestorage.flasharray.array.physical_size
**Preprocessing**

- 
JSON Path: `$.array.space.total_physical`

|
|Array snapshots size|
The physical space occupied by snapshots.
|Dependent item|purestorage.flasharray.array.snapshots_size
**Preprocessing**

- 
JSON Path: `$.array.space.snapshots`

|
|Array system size|
The physical space occupied by internal array metadata.
|Dependent item|purestorage.flasharray.array.system_size
**Preprocessing**

- 
JSON Path: `$.array.space.system`

|
|Array thin provisioning|
The percentage of volume sectors that do not contain host-written data because the hosts have not written data to them or the sectors have been explicitly trimmed.
|Dependent item|purestorage.flasharray.array.thin_provisioning
**Preprocessing**

- 
JSON Path: `$.array.space.thin_provisioning`

- 
Custom multiplier: `100`

|
|Array parity|
The percentage of data that is protected.
|Dependent item|purestorage.flasharray.array.parity
**Preprocessing**

- 
JSON Path: `$.array.parity`

- 
Custom multiplier: `100`

|
|Array OS|
Operating system of the array.
|Dependent item|purestorage.flasharray.array.os
**Preprocessing**

- 
JSON Path: `$.array.os`

- 
Discard unchanged with heartbeat: `1d`

|
|Array version|
Version of the array.
|Dependent item|purestorage.flasharray.array.version
**Preprocessing**

- 
JSON Path: `$.array.version`

- 
Discard unchanged with heartbeat: `1d`

|
|Remote assist status|
Status of the remote assist connection.
|Dependent item|purestorage.flasharray.remote_assist.status
**Preprocessing**

- 
JSON Path: `$.support.remote_assist_active`

- Boolean to decimal
- 
Discard unchanged with heartbeat: `6h`

|
|Phone home status|
Current status of a manually-initiated phone home.
|Dependent item|purestorage.flasharray.phone_home.status
**Preprocessing**

- 
JSON Path: `$.support.phonehome_enabled`

- Boolean to decimal
- 
Discard unchanged with heartbeat: `6h`

|

### Triggers

|Name|Description|Expression|Severity|Dependencies and additional info|
|----|-----------|----------|--------|--------------------------------|
|Pure Storage FlashArray: Authentication has failed|
An error occurred when trying to perform authentication in the Pure Storage FlashArray API.
|`length(last(/Pure Storage FlashArray v2 by HTTP/purestorage.flasharray.auth.errors))>0`|Average||
|Pure Storage FlashArray: There are errors in the 'Get hardware data' metric|
An error occurred when trying to get hardware data from the Pure Storage FlashArray API.
|`length(last(/Pure Storage FlashArray v2 by HTTP/purestorage.flasharray.hardware.errors))>0`|Warning||
|Pure Storage FlashArray: There are errors in the 'Get hosts' metric|
An error occurred when trying to get host data from the Pure Storage FlashArray API.
|`length(last(/Pure Storage FlashArray v2 by HTTP/purestorage.flasharray.hosts.errors))>0`|Warning||
|Pure Storage FlashArray: There are errors in the 'Get volumes' metric|
An error occurred when trying to get volume data from the Pure Storage FlashArray API.
|`length(last(/Pure Storage FlashArray v2 by HTTP/purestorage.flasharray.volumes.errors))>0`|Warning||
|Pure Storage FlashArray: There are errors in the 'Get certificates' metric|
An error occurred when trying to get certificate data from the Pure Storage FlashArray API.
|`length(last(/Pure Storage FlashArray v2 by HTTP/purestorage.flasharray.certificates.errors))>0`|Warning||
|Pure Storage FlashArray: There are errors in the 'Get pods' metric|
An error occurred when trying to get pod data from the Pure Storage FlashArray API.
|`length(last(/Pure Storage FlashArray v2 by HTTP/purestorage.flasharray.pods.errors))>0`|Warning||
|Pure Storage FlashArray: There are errors in the 'Get network interfaces' metric|
An error occurred when trying to get network interface data from the Pure Storage FlashArray API.
|`length(last(/Pure Storage FlashArray v2 by HTTP/purestorage.flasharray.net_ifs.errors))>0`|Warning||
|Pure Storage FlashArray: There are errors in the 'Get storage array data' metric|
An error occurred when trying to get array data from the Pure Storage FlashArray API.
|`length(last(/Pure Storage FlashArray v2 by HTTP/purestorage.flasharray.array.errors))>0`|Warning||
|Pure Storage FlashArray: There are errors in the 'Get support information' metric|
An error occurred when trying to get support information from the Pure Storage FlashArray API.
|`length(last(/Pure Storage FlashArray v2 by HTTP/purestorage.flasharray.support.errors))>0`|Warning||
|Pure Storage FlashArray: There are errors in the 'Get alerts data' metric|
An error occurred when trying to get alert data from the Pure Storage FlashArray API.
|`length(last(/Pure Storage FlashArray v2 by HTTP/purestorage.flasharray.alert.errors))>0`|Warning||
|Pure Storage FlashArray: Critical alerts have been detected|
Recommended to refer to the Pure Storage FlashArray web interface to check the alert details.
|`last(/Pure Storage FlashArray v2 by HTTP/purestorage.flasharray.alert.critical)>0`|High||
|Pure Storage FlashArray: Warning alerts have been detected|
Recommended to refer to the Pure Storage FlashArray web interface to check the alert details.
|`last(/Pure Storage FlashArray v2 by HTTP/purestorage.flasharray.alert.warning)>0`|Warning||
|Pure Storage FlashArray: RemoteAssist has been enabled|
Purity's administrator-controlled RemoteAssist feature enables a Technical Support Engineer to communicate directly with the FlashArray via a secure link, effectively establishing an additional administrative session for the duration of the diagnosis and service.
|`last(/Pure Storage FlashArray v2 by HTTP/purestorage.flasharray.remote_assist.status)=1`|High||
|Pure Storage FlashArray: Phone Home has been disabled|
Phone Home connects to the Pure1 service and uploads logs for continuous health monitoring.
|`last(/Pure Storage FlashArray v2 by HTTP/purestorage.flasharray.phone_home.status)=0`|Warning||

### LLD rule Pod discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Pod discovery|
Discovery of storage pods from the Pure Storage FlashArray API.
|Dependent item|purestorage.flasharray.pod.discovery
**Preprocessing**

- 
JSON Path: `$.pods`

- 
Discard unchanged with heartbeat: `3h`

|

### Item prototypes for Pod discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Pod [{#NAME}]: Get data|
Collects data about the {#NAME} pod.
|Dependent item|purestorage.flasharray.pod.get[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.pods[?(@.name == "{#NAME}")].first()`

⛔️Custom on fail: Discard value

|
|Pod [{#NAME}]: Quota|
The quota limit of the {#NAME} pod.
|Dependent item|purestorage.flasharray.pod.quota[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.quota_limit`

⛔️Custom on fail: Discard value

|
|Pod [{#NAME}]: Status|
The current promotion status of the {#NAME} pod.
|Dependent item|purestorage.flasharray.pod.status[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.promotion_status`

⛔️Custom on fail: Discard value

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

|
|Pod [{#NAME}]: Number of arrays|
Number of arrays connected to the {#NAME} pod.
|Dependent item|purestorage.flasharray.pod.arrays[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.array_count`

⛔️Custom on fail: Set value to: `0`

|

### LLD rule Drive discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Drive discovery|
Discovery of storage drives from the Pure Storage FlashArray API.
|Dependent item|purestorage.flasharray.drive.discovery
**Preprocessing**

- 
JSON Path: `$.drives`

- 
Discard unchanged with heartbeat: `3h`

|

### Item prototypes for Drive discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Drive [{#NAME}]: Get data|
Collects data about the {#NAME} drive.
|Dependent item|purestorage.flasharray.drive.get[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.drives[?(@.name == "{#NAME}")].first()`

⛔️Custom on fail: Discard value

|
|Drive [{#NAME}]: Capacity|
The capacity of the {#NAME} drive.
|Dependent item|purestorage.flasharray.drive.capacity[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.capacity`

⛔️Custom on fail: Discard value

|
|Drive [{#NAME}]: Status|
The current status of the {#NAME} drive.
|Dependent item|purestorage.flasharray.drive.status[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.status`

⛔️Custom on fail: Discard value

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

|
|Drive [{#NAME}]: Serial number|
Serial number of the {#NAME} drive device.
|Dependent item|purestorage.flasharray.drive.serial[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.hardware.serial`

⛔️Custom on fail: Discard value

- 
Discard unchanged with heartbeat: `1d`

- 
Does not match regular expression: `^null$`

⛔️Custom on fail: Discard value

|

### Trigger prototypes for Drive discovery

|Name|Description|Expression|Severity|Dependencies and additional info|
|----|-----------|----------|--------|--------------------------------|
|Pure Storage FlashArray: Drive [{#NAME}]: Problem on the drive|
Drive {#NAME} status is not "healthy", "updating", or "unused".
|`last(/Pure Storage FlashArray v2 by HTTP/purestorage.flasharray.drive.status[{#NAME}])<>0 and last(/Pure Storage FlashArray v2 by HTTP/purestorage.flasharray.drive.status[{#NAME}])<>2 and last(/Pure Storage FlashArray v2 by HTTP/purestorage.flasharray.drive.status[{#NAME}])<>3`|Average||

### LLD rule Controller discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Controller discovery|
Discovery of controllers from the Pure Storage FlashArray API.
|Dependent item|purestorage.flasharray.ctrl.discovery
**Preprocessing**

- 
JSON Path: `$.controllers`

- 
Discard unchanged with heartbeat: `3h`

|

### Item prototypes for Controller discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Controller [{#NAME}]: Get data|
Collects data about the {#NAME} controller.
|Dependent item|purestorage.flasharray.ctrl.get[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.controllers[?(@.name == "{#NAME}")].first()`

⛔️Custom on fail: Discard value

|
|Controller [{#NAME}]: Status|
The current status of the {#NAME} controller.
|Dependent item|purestorage.flasharray.ctrl.status[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.status`

⛔️Custom on fail: Discard value

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

|
|Controller [{#NAME}]: Mode|
The current mode of the {#NAME} controller.
|Dependent item|purestorage.flasharray.ctrl.mode[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.mode`

⛔️Custom on fail: Discard value

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

|
|Controller [{#NAME}]: Serial number|
Serial number of the {#NAME} controller.
|Dependent item|purestorage.flasharray.ctrl.serial[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.hardware.serial`

⛔️Custom on fail: Discard value

- 
Discard unchanged with heartbeat: `1d`

|
|Controller [{#NAME}]: Model|
Model of the {#NAME} controller.
|Dependent item|purestorage.flasharray.ctrl.model[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.model`

⛔️Custom on fail: Discard value

- 
Discard unchanged with heartbeat: `1d`

|
|Controller [{#NAME}]: Version|
Version of the {#NAME} controller.
|Dependent item|purestorage.flasharray.ctrl.version[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.version`

⛔️Custom on fail: Discard value

- 
Discard unchanged with heartbeat: `1d`

|

### Trigger prototypes for Controller discovery

|Name|Description|Expression|Severity|Dependencies and additional info|
|----|-----------|----------|--------|--------------------------------|
|Pure Storage FlashArray: Controller [{#NAME}]: Controller is not ready|
Controller {#NAME} status is not "ready" or "updating".
|`last(/Pure Storage FlashArray v2 by HTTP/purestorage.flasharray.ctrl.status[{#NAME}])<>1 and last(/Pure Storage FlashArray v2 by HTTP/purestorage.flasharray.ctrl.status[{#NAME}])<>2`|Average||
|Pure Storage FlashArray: Controller [{#NAME}]: Mode has been changed|
The mode of the {#NAME} controller has changed.
|`last(/Pure Storage FlashArray v2 by HTTP/purestorage.flasharray.ctrl.mode[{#NAME}],#1)<>last(/Pure Storage FlashArray v2 by HTTP/purestorage.flasharray.ctrl.mode[{#NAME}],#2)`|Average||

### LLD rule Temperature sensor discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Temperature sensor discovery|
Discovery of temperature sensors from the Pure Storage FlashArray API.
|Dependent item|purestorage.flasharray.temp.discovery
**Preprocessing**

- 
JSON Path: `$.hardware`

- 
Discard unchanged with heartbeat: `3h`

|

### Item prototypes for Temperature sensor discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Sensor [{#NAME}]: Get data|
Collects data about the {#NAME} temperature sensor.
|Dependent item|purestorage.flasharray.temp.get[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.hardware[?(@.name == "{#NAME}")].first()`

⛔️Custom on fail: Discard value

|
|Sensor [{#NAME}]: Status|
The current status of the {#NAME} temperature sensor.
|Dependent item|purestorage.flasharray.temp.status[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.status`

⛔️Custom on fail: Discard value

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

|
|Sensor [{#NAME}]: Temperature|
The current temperature value of the {#NAME} sensor.
|Dependent item|purestorage.flasharray.temp.value[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.temperature`

⛔️Custom on fail: Set value to: `0`

|

### Trigger prototypes for Temperature sensor discovery

|Name|Description|Expression|Severity|Dependencies and additional info|
|----|-----------|----------|--------|--------------------------------|
|Pure Storage FlashArray: Sensor [{#NAME}]: Sensor is not healthy|
Temperature sensor {#NAME} status is not "ok".
|`last(/Pure Storage FlashArray v2 by HTTP/purestorage.flasharray.temp.status[{#NAME}])<>0`|Average||

### LLD rule Power supply discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Power supply discovery|
Discovery of power supply components from the Pure Storage FlashArray API.
|Dependent item|purestorage.flasharray.power.discovery
**Preprocessing**

- 
JSON Path: `$.hardware`

- 
Discard unchanged with heartbeat: `3h`

|

### Item prototypes for Power supply discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Power supply [{#NAME}]: Get data|
Collects data about the {#NAME} power supply component.
|Dependent item|purestorage.flasharray.power.get[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.hardware[?(@.name == "{#NAME}")].first()`

⛔️Custom on fail: Discard value

|
|Power supply [{#NAME}]: Status|
The current status of the {#NAME} power supply component.
|Dependent item|purestorage.flasharray.power.status[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.status`

⛔️Custom on fail: Discard value

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

|
|Power supply [{#NAME}]: Serial number|
Serial number of the {#NAME} power supply component.
|Dependent item|purestorage.flasharray.power.serial[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.serial`

⛔️Custom on fail: Discard value

- 
Discard unchanged with heartbeat: `1d`

|
|Power supply [{#NAME}]: Model|
Model of the {#NAME} power supply component.
|Dependent item|purestorage.flasharray.power.model[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.model`

⛔️Custom on fail: Discard value

- 
Discard unchanged with heartbeat: `1d`

|
|Power supply [{#NAME}]: Voltage|
The current voltage value of the {#NAME} power supply component.
|Dependent item|purestorage.flasharray.power.value[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.voltage`

⛔️Custom on fail: Set value to: `0`

|

### Trigger prototypes for Power supply discovery

|Name|Description|Expression|Severity|Dependencies and additional info|
|----|-----------|----------|--------|--------------------------------|
|Pure Storage FlashArray: Power supply [{#NAME}]: Power supply is not healthy|
Power supply component {#NAME} status is not "ok".
|`last(/Pure Storage FlashArray v2 by HTTP/purestorage.flasharray.power.status[{#NAME}])<>0`|Average||

### LLD rule Fan discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Fan discovery|
Discovery of fans from the Pure Storage FlashArray API.
|Dependent item|purestorage.flasharray.fan.discovery
**Preprocessing**

- 
JSON Path: `$.hardware`

- 
Discard unchanged with heartbeat: `3h`

|

### Item prototypes for Fan discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Fan [{#NAME}]: Get data|
Collects data about the {#NAME} fan.
|Dependent item|purestorage.flasharray.fan.get[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.hardware[?(@.name == "{#NAME}")].first()`

⛔️Custom on fail: Discard value

|
|Fan [{#NAME}]: Status|
The current status of the {#NAME} fan.
|Dependent item|purestorage.flasharray.fan.status[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.status`

⛔️Custom on fail: Discard value

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

|

### Trigger prototypes for Fan discovery

|Name|Description|Expression|Severity|Dependencies and additional info|
|----|-----------|----------|--------|--------------------------------|
|Pure Storage FlashArray: Fan [{#NAME}]: Fan is not healthy|
Fan {#NAME} status is not "ok".
|`last(/Pure Storage FlashArray v2 by HTTP/purestorage.flasharray.fan.status[{#NAME}])<>0`|Average||

### LLD rule Host discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Host discovery|
Discovery of storage hosts from the Pure Storage FlashArray API.
|Dependent item|purestorage.flasharray.host.discovery
**Preprocessing**

- 
JSON Path: `$.hosts`

- 
Discard unchanged with heartbeat: `3h`

|

### Item prototypes for Host discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Host [{#NAME}]: Get data|
Collects data about the {#NAME} host.
|Dependent item|purestorage.flasharray.host.get[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.hosts[?(@.name == "{#NAME}")].first()`

⛔️Custom on fail: Discard value

|
|Host [{#NAME}]: Total space provisioned|
The total provisioned space on the {#NAME} host volume.
|Dependent item|purestorage.flasharray.host.size[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.space.total_provisioned`

⛔️Custom on fail: Discard value

|
|Host [{#NAME}]: Used space provisioned|
The provisioned space occupied on the {#NAME} host volume.
|Dependent item|purestorage.flasharray.host.used_provisioned[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.space.used_provisioned`

⛔️Custom on fail: Discard value

|
|Host [{#NAME}]: Data reduction|
The data reduction ratio (DRR) represents the efficiency of data reduction techniques such as compression and deduplication for the {#NAME} host volume.
|Dependent item|purestorage.flasharray.host.drr[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.space.data_reduction`

|
|Host [{#NAME}]: Total data reduction|
The total reduction ratio of all data on the {#NAME} host volume that has been processed by the data deduplication and compression engines.
|Dependent item|purestorage.flasharray.host.total_drr[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.space.total_reduction`

|
|Host [{#NAME}]: Bytes written per second|
Number of bytes written to the {#NAME} host volume per second.
|Dependent item|purestorage.flasharray.host.written_bytes.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.performance.write_bytes_per_sec`

|
|Host [{#NAME}]: Bytes read per second|
Number of bytes read from the {#NAME} host volume per second.
|Dependent item|purestorage.flasharray.host.read_bytes.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.performance.read_bytes_per_sec`

|
|Host [{#NAME}]: Read requests per second|
Number of read requests processed on the {#NAME} host volume per second.
|Dependent item|purestorage.flasharray.host.read_requests.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.performance.reads_per_sec`

|
|Host [{#NAME}]: Write requests per second|
Number of write requests processed on the {#NAME} host volume per second.
|Dependent item|purestorage.flasharray.host.write_requests.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.performance.writes_per_sec`

|
|Host [{#NAME}]: Microseconds per read|
Average time in microseconds required to process an I/O read request from the {#NAME} host volume.
|Dependent item|purestorage.flasharray.host.usec_per_read[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.performance.usec_per_read_op`

|
|Host [{#NAME}]: Microseconds per write|
Average time in microseconds required to process an I/O write request to the {#NAME} host volume.
|Dependent item|purestorage.flasharray.host.usec_per_write[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.performance.usec_per_write_op`

|
|Host [{#NAME}]: Used space|
The total physical space occupied by all data on the {#NAME} host volume.
|Dependent item|purestorage.flasharray.host.used_space[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.space.total_used`

⛔️Custom on fail: Discard value

|
|Host [{#NAME}]: Snapshots size|
The physical space occupied by snapshots on the {#NAME} host volume.
|Dependent item|purestorage.flasharray.host.snapshots_size[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.space.snapshots`

|
|Host [{#NAME}]: Thin provisioning|
The percentage of sectors in the {#NAME} host volume that do not contain host-written data because the hosts have not written data to them or the sectors have been explicitly trimmed.
|Dependent item|purestorage.flasharray.host.thin_provisioning[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.space.thin_provisioning`

- 
Custom multiplier: `100`

|

### LLD rule Volume discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Volume discovery|
Discovery of storage volumes from the Pure Storage FlashArray API.
|Dependent item|purestorage.flasharray.volume.discovery
**Preprocessing**

- 
JSON Path: `$.volumes`

- 
Discard unchanged with heartbeat: `3h`

|

### Item prototypes for Volume discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Volume [{#NAME}]: Get data|
Collects data about the {#NAME} volume.
|Dependent item|purestorage.flasharray.volume.get[{#SN}]
**Preprocessing**

- 
JSON Path: `$.volumes[?(@.serial == "{#SN}")].first()`

⛔️Custom on fail: Discard value

|
|Volume [{#NAME}]: Size|
The physical space occupied by the {#NAME} volume.
|Dependent item|purestorage.flasharray.volume.size[{#SN}]
**Preprocessing**

- 
JSON Path: `$.provisioned`

⛔️Custom on fail: Discard value

|
|Volume [{#NAME}]: Data reduction|
The data reduction ratio (DRR) represents the efficiency of data reduction techniques such as compression and deduplication for the {#NAME} volume.
|Dependent item|purestorage.flasharray.volume.drr[{#SN}]
**Preprocessing**

- 
JSON Path: `$.space.data_reduction`

|
|Volume [{#NAME}]: Total data reduction|
The total reduction ratio of all data on the {#NAME} volume that has been processed by the data deduplication and compression engines.
|Dependent item|purestorage.flasharray.volume.total_drr[{#SN}]
**Preprocessing**

- 
JSON Path: `$.space.total_reduction`

|
|Volume [{#NAME}]: Bytes written per second|
Number of bytes written to the {#NAME} volume per second.
|Dependent item|purestorage.flasharray.volume.written_bytes.rate[{#SN}]
**Preprocessing**

- 
JSON Path: `$.performance.write_bytes_per_sec`

|
|Volume [{#NAME}]: Bytes read per second|
Number of bytes read from the {#NAME} volume per second.
|Dependent item|purestorage.flasharray.volume.read_bytes.rate[{#SN}]
**Preprocessing**

- 
JSON Path: `$.performance.read_bytes_per_sec`

|
|Volume [{#NAME}]: Read requests per second|
Number of read requests processed on the {#NAME} volume per second.
|Dependent item|purestorage.flasharray.volume.read_requests.rate[{#SN}]
**Preprocessing**

- 
JSON Path: `$.performance.reads_per_sec`

|
|Volume [{#NAME}]: Write requests per second|
Number of write requests processed on the {#NAME} volume per second.
|Dependent item|purestorage.flasharray.volume.write_requests.rate[{#SN}]
**Preprocessing**

- 
JSON Path: `$.performance.writes_per_sec`

|
|Volume [{#NAME}]: Microseconds per read|
Average time in microseconds required to process an I/O read request from the {#NAME} volume.
|Dependent item|purestorage.flasharray.volume.usec_per_read[{#SN}]
**Preprocessing**

- 
JSON Path: `$.performance.usec_per_read_op`

|
|Volume [{#NAME}]: Microseconds per write|
Average time in microseconds required to process an I/O write request to the {#NAME} volume.
|Dependent item|purestorage.flasharray.volume.usec_per_write[{#SN}]
**Preprocessing**

- 
JSON Path: `$.performance.usec_per_write_op`

|
|Volume [{#NAME}]: Shared space|
The physical space occupied by deduplicated data on the {#NAME} volume.
|Dependent item|purestorage.flasharray.volume.shared_space[{#SN}]
**Preprocessing**

- 
JSON Path: `$.space.shared`

- 
Does not match regular expression: `^null$`

⛔️Custom on fail: Set value to: `0`

|
|Volume [{#NAME}]: Provisioned space|
The total provisioned space on the {#NAME} volume.
|Dependent item|purestorage.flasharray.volume.provisioned[{#SN}]
**Preprocessing**

- 
JSON Path: `$.space.total_provisioned`

|
|Volume [{#NAME}]: Used provisioned|
The total provisioned space occupied by all data on the {#NAME} volume.
|Dependent item|purestorage.flasharray.volume.used_provisioned[{#SN}]
**Preprocessing**

- 
JSON Path: `$.space.used_provisioned`

⛔️Custom on fail: Discard value

|
|Volume [{#NAME}]: Used space|
The total physical space occupied by all data on the {#NAME} volume.
|Dependent item|purestorage.flasharray.volume.used_space[{#SN}]
**Preprocessing**

- 
JSON Path: `$.space.total_used`

⛔️Custom on fail: Discard value

|
|Volume [{#NAME}]: Snapshots size|
The physical space occupied by snapshots on the {#NAME} volume.
|Dependent item|purestorage.flasharray.volume.snapshots_size[{#SN}]
**Preprocessing**

- 
JSON Path: `$.space.snapshots`

|
|Volume [{#NAME}]: Thin provisioning|
The percentage of sectors in the {#NAME} volume that do not contain host-written data because the hosts have not written data to them or the sectors have been explicitly trimmed.
|Dependent item|purestorage.flasharray.volume.thin_provisioning[{#SN}]
**Preprocessing**

- 
JSON Path: `$.space.thin_provisioning`

- 
Custom multiplier: `100`

|

### Trigger prototypes for Volume discovery

|Name|Description|Expression|Severity|Dependencies and additional info|
|----|-----------|----------|--------|--------------------------------|
|Pure Storage FlashArray: Volume [{#NAME}]: Volume size has been changed|
Physical space occupied by the {#NAME} volume has been changed.
|`last(/Pure Storage FlashArray v2 by HTTP/purestorage.flasharray.volume.size[{#SN}],#1)<>last(/Pure Storage FlashArray v2 by HTTP/purestorage.flasharray.volume.size[{#SN}],#2)`|Warning||

### LLD rule Certificate discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Certificate discovery|
Discovery of certificates from the Pure Storage FlashArray API.
|Dependent item|purestorage.flasharray.cert.discovery
**Preprocessing**

- 
JSON Path: `$.certs`

- 
Discard unchanged with heartbeat: `3h`

|

### Item prototypes for Certificate discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Certificate [{#NAME}]: Get data|
Collects data about the {#NAME} certificate.
|Dependent item|purestorage.flasharray.cert.get[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.certs[?(@.name == "{#NAME}")].first()`

⛔️Custom on fail: Discard value

|
|Certificate [{#NAME}]: Common name|
The common name field listed in the {#NAME} certificate.
|Dependent item|purestorage.flasharray.cert.cn[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.common_name`

- 
Discard unchanged with heartbeat: `1d`

- 
Does not match regular expression: `^null$`

⛔️Custom on fail: Discard value

|
|Certificate [{#NAME}]: Issued to|
Indicates the entity which holds the {#NAME} certificate.
|Dependent item|purestorage.flasharray.cert.issued_to[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.issued_to`

- 
Discard unchanged with heartbeat: `1d`

- 
Does not match regular expression: `^$`

⛔️Custom on fail: Discard value

|
|Certificate [{#NAME}]: Issued by|
Indicates the authority or organization that issued the {#NAME} certificate, typically including information such as the name of the Certificate Authority (CA) and its digital signature.
|Dependent item|purestorage.flasharray.cert.issued_by[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.issued_by`

- 
Discard unchanged with heartbeat: `1d`

- 
Does not match regular expression: `^$`

⛔️Custom on fail: Discard value

|
|Certificate [{#NAME}]: Valid from|
Indicates the date and time when the {#NAME} certificate takes effect.
|Dependent item|purestorage.flasharray.cert.valid_from[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.valid_from`

- 
Custom multiplier: `0.001`

|
|Certificate [{#NAME}]: Valid to|
Indicates the expiration date and time of the {#NAME} certificate.
|Dependent item|purestorage.flasharray.cert.valid_to[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.valid_to`

- 
Custom multiplier: `0.001`

|

### Trigger prototypes for Certificate discovery

|Name|Description|Expression|Severity|Dependencies and additional info|
|----|-----------|----------|--------|--------------------------------|
|Pure Storage FlashArray: Certificate [{#NAME}]: SSL certificate expires soon|
Consider reissuing and replacing the {#NAME} certificate.
|`last(/Pure Storage FlashArray v2 by HTTP/purestorage.flasharray.cert.valid_to[{#NAME}]) > 0 and (last(/Pure Storage FlashArray v2 by HTTP/purestorage.flasharray.cert.valid_to[{#NAME}]) - now()) / 86400 < {$PURE.FLASHARRAY.CERT.EXPIRY.WARN}`|Average||

### LLD rule Network interface discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Network interface discovery|
Discovery of storage hosts from the Pure Storage FlashArray API.
|Dependent item|purestorage.flasharray.net_if.discovery
**Preprocessing**

- 
JSON Path: `$.interfaces`

- 
Discard unchanged with heartbeat: `3h`

|

### Item prototypes for Network interface discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Interface [{#IFNAME}]: Get data|
Collects data about the {#IFNAME} network interface.
|Dependent item|purestorage.flasharray.net_if.get[{#IFNAME}]
**Preprocessing**

- 
JSON Path: `$.interfaces[?(@.name == "{#IFNAME}")].first()`

⛔️Custom on fail: Discard value

|
|Interface [{#IFNAME}]: Speed|
Current bandwidth of the interface.
|Dependent item|purestorage.flasharray.net_if.speed[{#IFNAME}]
**Preprocessing**

- 
JSON Path: `$.speed`

|
|Interface [{#IFNAME}]: IP address|
Represents the IP address of the {#IFNAME} interface.
|Dependent item|purestorage.flasharray.net_if.ip[{#IFNAME}]
**Preprocessing**

- 
JSON Path: `$.eth.address`

- 
Discard unchanged with heartbeat: `1d`

- 
Does not match regular expression: `^null$`

⛔️Custom on fail: Discard value

|
|Interface [{#IFNAME}]: MAC address|
Represents the MAC address of the {#IFNAME} interface.
|Dependent item|purestorage.flasharray.net_if.mac[{#IFNAME}]
**Preprocessing**

- 
JSON Path: `$.eth.mac_address`

- 
Discard unchanged with heartbeat: `1d`

- 
Does not match regular expression: `^null$`

⛔️Custom on fail: Discard value

|
|Interface [{#IFNAME}]: Gateway|
Represents the IP address of the gateway for the {#IFNAME} interface.
|Dependent item|purestorage.flasharray.net_if.gateway[{#IFNAME}]
**Preprocessing**

- 
JSON Path: `$.eth.gateway`

- 
Discard unchanged with heartbeat: `1d`

- 
Does not match regular expression: `^null$`

⛔️Custom on fail: Discard value

|

### Trigger prototypes for Network interface discovery

|Name|Description|Expression|Severity|Dependencies and additional info|
|----|-----------|----------|--------|--------------------------------|
|Pure Storage FlashArray: 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(/Pure Storage FlashArray v2 by HTTP/purestorage.flasharray.net_if.speed[{#IFNAME}])<0 and last(/Pure Storage FlashArray v2 by HTTP/purestorage.flasharray.net_if.speed[{#IFNAME}])>0`|Info|**Manual close**: Yes|

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

