
# NGINX Plus by HTTP

## Overview

This template is designed for the effortless deployment of Nginx Plus monitoring by Zabbix via HTTP and doesn't require any external scripts.

> The monitoring data of the live activity is generated by the [NGINX Plus API](http://nginx.org/en/docs/http/ngx_http_api_module.html).

## Requirements

Zabbix version: 7.0 and higher.

## Tested versions

This template has been tested on:
- NGINX Plus 1.19.10

## 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 the NGINX Plus API.
> Refer to the [vendor documentation](https://www.nginx.com/products/nginx/live-activity-monitoring/).
2. Set the {$NGINX.API.ENDPOINT} such as `<scheme>://<host>:<port>/<location>/`.

**Note** that depending on the number of zones and upstreams discovery operation may be expensive. 
Therefore, use the following filters with these macros:

- {$NGINX.LLD.FILTER.HTTP.ZONE.MATCHES}
- {$NGINX.LLD.FILTER.HTTP.ZONE.NOT_MATCHES}
- {$NGINX.LLD.FILTER.HTTP.LOCATION.ZONE.MATCHES}
- {$NGINX.LLD.FILTER.HTTP.LOCATION.ZONE.NOT_MATCHES}
- {$NGINX.LLD.FILTER.HTTP.UPSTREAM.MATCHES}
- {$NGINX.LLD.FILTER.HTTP.UPSTREAM.NOT_MATCHES}
- {$NGINX.LLD.FILTER.STREAM.ZONE.MATCHES}
- {$NGINX.LLD.FILTER.STREAM.ZONE.NOT_MATCHES}
- {$NGINX.LLD.FILTER.STREAM.UPSTREAM.MATCHES}
- {$NGINX.LLD.FILTER.STREAM.UPSTREAM.NOT_MATCHES}
- {$NGINX.LLD.FILTER.RESOLVER.MATCHES}
- {$NGINX.LLD.FILTER.RESOLVER.NOT_MATCHES}

### Macros used

|Name|Description|Default|
|----|-----------|-------|
|{$NGINX.API.ENDPOINT}|
NGINX Plus API URL in the format `<scheme>://<host>:<port>/<location>/`.
||
|{$NGINX.LLD.FILTER.HTTP.ZONE.MATCHES}|
The filter to include the necessary discovered HTTP server zones.
|`.*`|
|{$NGINX.LLD.FILTER.HTTP.ZONE.NOT_MATCHES}|
The filter to exclude discovered HTTP server zones.
|`CHANGE_IF_NEEDED`|
|{$NGINX.LLD.FILTER.HTTP.LOCATION.ZONE.MATCHES}|
The filter to include the necessary discovered HTTP location zones.
|`.*`|
|{$NGINX.LLD.FILTER.HTTP.LOCATION.ZONE.NOT_MATCHES}|
The filter to exclude discovered HTTP location zones.
|`CHANGE_IF_NEEDED`|
|{$NGINX.LLD.FILTER.HTTP.UPSTREAM.MATCHES}|
The filter to include the necessary discovered HTTP upstreams.
|`.*`|
|{$NGINX.LLD.FILTER.HTTP.UPSTREAM.NOT_MATCHES}|
The filter to exclude discovered HTTP upstreams.
|`CHANGE_IF_NEEDED`|
|{$NGINX.LLD.FILTER.STREAM.ZONE.MATCHES}|
The filter to include discovered server zones of the "stream" directive.
|`.*`|
|{$NGINX.LLD.FILTER.STREAM.ZONE.NOT_MATCHES}|
The filter to exclude discovered server zones of the "stream" directive.
|`CHANGE_IF_NEEDED`|
|{$NGINX.LLD.FILTER.STREAM.UPSTREAM.MATCHES}|
The filter to include the necessary discovered upstreams of the "stream" directive.
|`.*`|
|{$NGINX.LLD.FILTER.STREAM.UPSTREAM.NOT_MATCHES}|
The filter to exclude discovered upstreams of the "stream" directive
|`CHANGE_IF_NEEDED`|
|{$NGINX.LLD.FILTER.RESOLVER.MATCHES}|
The filter to include the necessary discovered `Resolvers`.
|`.*`|
|{$NGINX.LLD.FILTER.RESOLVER.NOT_MATCHES}|
The filter to exclude discovered `Resolvers`.
|`CHANGE_IF_NEEDED`|
|{$NGINX.DROP_RATE.MAX.WARN}|
The critical rate of the dropped connections for a  trigger expression.
|`1`|
|{$NGINX.HTTP.UPSTREAM.4XX.MAX.WARN}|
The maximum percentage of errors with the status code `4xx` (for a trigger expression).
|`5`|
|{$NGINX.HTTP.UPSTREAM.5XX.MAX.WARN}|
The maximum percentage of errors with the status code `5xx` (for a trigger expression).
|`5`|

### Items

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Get info|
Return status of the NGINX running instance.
|HTTP agent|nginx.info|
|Get connections|
Returns the statistics of client connections.
|HTTP agent|nginx.connections|
|Get SSL|
Returns the SSL statistics.
|HTTP agent|nginx.ssl|
|Get requests|
Returns the status of the client's HTTP requests.
|HTTP agent|nginx.requests|
|Get HTTP zones|
Returns the status information for each HTTP server zone.
|HTTP agent|nginx.http.server_zones|
|Get HTTP location zones|
Returns the status information for each HTTP location zone.
|HTTP agent|nginx.http.location_zones|
|Get HTTP upstreams|
Returns the status of each HTTP upstream server group and its servers.
|HTTP agent|nginx.http.upstreams|
|Get Stream server zones|
Returns the status information for each server zone configured in the "stream" directive.
|HTTP agent|nginx.stream.server_zones|
|Get Stream upstreams|
Returns status of each stream upstream server group and its servers.
|HTTP agent|nginx.stream.upstreams|
|Get resolvers|
Returns the status information for each Resolver zone.
|HTTP agent|nginx.resolvers|
|Get info error|
The description of NGINX errors.
|Dependent item|nginx.info.error
**Preprocessing**

- 
JSON Path: `$.error.text`

⛔️Custom on fail: Set value to: ``</p></li><li><p>Discard unchanged with heartbeat: `1h`

|
|Version|
A version number of NGINX.
|Dependent item|nginx.info.version
**Preprocessing**

- 
JSON Path: `$.version`

- 
Discard unchanged with heartbeat: `3h`

|
|Address|
The address of the server that accepted status request.
|Dependent item|nginx.info.address
**Preprocessing**

- 
JSON Path: `$.address`

- 
Discard unchanged with heartbeat: `3h`

|
|Generation|
The total number of configuration reloads.
|Dependent item|nginx.info.generation
**Preprocessing**

- 
JSON Path: `$.generation`

- 
Discard unchanged with heartbeat: `30m`

|
|Uptime|
The server uptime.
|Dependent item|nginx.info.uptime
**Preprocessing**

- 
JSON Path: `$.load_timestamp`

⛔️Custom on fail: Discard value

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

|
|Connections accepted, rate|
The total number of accepted client connections per second.
|Dependent item|nginx.connections.accepted.rate
**Preprocessing**

- 
JSON Path: `$.accepted`

- Change per second
|
|Connections dropped|
The total number of dropped client connections.
|Dependent item|nginx.connections.dropped
**Preprocessing**

- 
JSON Path: `$.dropped`

|
|Connections active|
The current number of active client connections.
|Dependent item|nginx.connections.active
**Preprocessing**

- 
JSON Path: `$.active`

|
|Connections idle|
The current number of idle client connections.
|Dependent item|nginx.connections.idle
**Preprocessing**

- 
JSON Path: `$.idle`

|
|SSL handshakes, rate|
The total number of successful SSL handshakes per second.
|Dependent item|nginx.ssl.handshakes.rate
**Preprocessing**

- 
JSON Path: `$.handshakes`

- Change per second
|
|SSL handshakes failed, rate|
The total number of failed SSL handshakes per second.
|Dependent item|nginx.ssl.handshakes_failed.rate
**Preprocessing**

- 
JSON Path: `$.handshakes_failed`

- Change per second
|
|SSL session reuses, rate|
The total number of session reuses during SSL handshake per second.
|Dependent item|nginx.ssl.session_reuses.rate
**Preprocessing**

- 
JSON Path: `$.session_reuses`

- Change per second
|
|Requests total, rate|
The total number of client requests per second.
|Dependent item|nginx.requests.total.rate
**Preprocessing**

- 
JSON Path: `$.total`

- Change per second
|
|Requests current|
The current number of client requests.
|Dependent item|nginx.requests.current
**Preprocessing**

- 
JSON Path: `$.current`

|

### Triggers

|Name|Description|Expression|Severity|Dependencies and additional info|
|----|-----------|----------|--------|--------------------------------|
|NGINX Plus: Server response error||`length(last(/NGINX Plus by HTTP/nginx.info.error))>0`|High||
|NGINX Plus: Version has changed|
The Nginx version has changed. Acknowledge to close the problem manually.
|`last(/NGINX Plus by HTTP/nginx.info.version,#1)<>last(/NGINX Plus by HTTP/nginx.info.version,#2) and length(last(/NGINX Plus by HTTP/nginx.info.version))>0`|Info|**Manual close**: Yes|
|NGINX Plus: Host has been restarted|
Uptime is less than 10 minutes.
|`last(/NGINX Plus by HTTP/nginx.info.uptime)<10m`|Info|**Manual close**: Yes|
|NGINX Plus: Failed to fetch info data|
Zabbix has not received any data for metrics for the last 30 minutes
|`nodata(/NGINX Plus by HTTP/nginx.info.uptime,30m)=1`|Warning|**Manual close**: Yes|
|NGINX Plus: High connections drop rate|
The rate of dropped connections is greater than `{$NGINX.DROP_RATE.MAX.WARN}` for the last 5 minutes.
|`min(/NGINX Plus by HTTP/nginx.connections.dropped,5m) > {$NGINX.DROP_RATE.MAX.WARN}`|Warning||

### LLD rule HTTP server zones discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|HTTP server zones discovery||Dependent item|nginx.http.server_zones.discovery
**Preprocessing**

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

- 
Discard unchanged with heartbeat: `30m`

|

### Item prototypes for HTTP server zones discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|HTTP server zone [{#NAME}]: Raw data|
The raw data of the HTTP server zone with the name `{#NAME}` .
|Dependent item|nginx.http.server_zones.raw[{#NAME}]
**Preprocessing**

- 
JSON Path: `$['{#NAME}']`

|
|HTTP server zone [{#NAME}]: Processing|
The number of client requests that are currently being processed.
|Dependent item|nginx.http.server_zones.processing[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.processing`

|
|HTTP server zone [{#NAME}]: Requests, rate|
The total number of client requests received from clients per second.
|Dependent item|nginx.http.server_zones.requests.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.requests`

- Change per second
|
|HTTP server zone [{#NAME}]: Responses 1xx, rate|
The number of responses with `1xx` status code per second.
|Dependent item|nginx.http.server_zones.responses.1xx.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.responses.1xx`

- Change per second
|
|HTTP server zone [{#NAME}]: Responses 2xx, rate|
The number of responses with `2xx` status code per second.
|Dependent item|nginx.http.server_zones.responses.2xx.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.responses.2xx`

- Change per second
|
|HTTP server zone [{#NAME}]: Responses 3xx, rate|
The number of responses with `3xx` status code per second.
|Dependent item|nginx.http.server_zones.responses.3xx.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.responses.3xx`

- Change per second
|
|HTTP server zone [{#NAME}]: Responses 4xx, rate|
The number of responses with `4xx` status code per second.
|Dependent item|nginx.http.server_zones.responses.4xx.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.responses.4xx`

- Change per second
|
|HTTP server zone [{#NAME}]: Responses 5xx, rate|
The number of responses with `5xx` status code per second.
|Dependent item|nginx.http.server_zones.responses.5xx.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.responses.5xx`

- Change per second
|
|HTTP server zone [{#NAME}]: Responses total, rate|
The total number of responses sent to clients per second.
|Dependent item|nginx.http.server_zones.responses.total.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.responses.total`

- Change per second
|
|HTTP server zone [{#NAME}]: Discarded, rate|
The total number of requests completed without sending a response per second.
|Dependent item|nginx.http.server_zones.discarded.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.discarded`

- Change per second
|
|HTTP server zone [{#NAME}]: Received, rate|
The total number of bytes received from clients per second.
|Dependent item|nginx.http.server_zones.received.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.received`

- Change per second
|
|HTTP server zone [{#NAME}]: Sent, rate|
The total number of bytes sent to clients per second.
|Dependent item|nginx.http.server_zones.sent.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.sent`

- Change per second
|

### LLD rule HTTP location zones discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|HTTP location zones discovery||Dependent item|nginx.http.location_zones.discovery
**Preprocessing**

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

- 
Discard unchanged with heartbeat: `30m`

|

### Item prototypes for HTTP location zones discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|HTTP location zone [{#NAME}]: Raw data|
The raw data of the location zone with the name `{#NAME}`.
|Dependent item|nginx.http.location_zones.raw[{#NAME}]
**Preprocessing**

- 
JSON Path: `$['{#NAME}']`

|
|HTTP location zone [{#NAME}]: Requests, rate|
The total number of client requests received from clients per second.
|Dependent item|nginx.http.location_zones.requests.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.requests`

- Change per second
|
|HTTP location zone [{#NAME}]: Responses 1xx, rate|
The number of responses with `1xx` status code per second.
|Dependent item|nginx.http.location_zones.responses.1xx.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.responses.1xx`

- Change per second
|
|HTTP location zone [{#NAME}]: Responses 2xx, rate|
The number of responses with `2xx` status code per second.
|Dependent item|nginx.http.location_zones.responses.2xx.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.responses.2xx`

- Change per second
|
|HTTP location zone [{#NAME}]: Responses 3xx, rate|
The number of responses with `3xx` status code per second.
|Dependent item|nginx.http.location_zones.responses.3xx.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.responses.3xx`

- Change per second
|
|HTTP location zone [{#NAME}]: Responses 4xx, rate|
The number of responses with `4xx` status code per second.
|Dependent item|nginx.http.location_zones.responses.4xx.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.responses.4xx`

- Change per second
|
|HTTP location zone [{#NAME}]: Responses 5xx, rate|
The number of responses with `5xx` status code per second.
|Dependent item|nginx.http.location_zones.responses.5xx.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.responses.5xx`

- Change per second
|
|HTTP location zone [{#NAME}]: Responses total, rate|
The total number of responses sent to clients per second.
|Dependent item|nginx.http.location_zones.responses.total.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.responses.total`

- Change per second
|
|HTTP location zone [{#NAME}]: Discarded, rate|
The total number of requests completed without sending a response per second.
|Dependent item|nginx.http.location_zones.discarded.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.discarded`

- Change per second
|
|HTTP location zone [{#NAME}]: Received, rate|
The total number of bytes received from clients per second.
|Dependent item|nginx.http.location_zones.received.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.received`

- Change per second
|
|HTTP location zone [{#NAME}]: Sent, rate|
The total number of bytes sent to clients per second.
|Dependent item|nginx.http.location_zones.sent.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.sent`

- Change per second
|

### LLD rule HTTP upstreams discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|HTTP upstreams discovery||Dependent item|nginx.http.upstreams.discovery
**Preprocessing**

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

- 
Discard unchanged with heartbeat: `30m`

|

### Item prototypes for HTTP upstreams discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|HTTP upstream [{#NAME}]: Raw data|
The raw data of the HTTP upstream with the name `{#NAME}`.
|Dependent item|nginx.http.upstreams.raw[{#NAME}]
**Preprocessing**

- 
JSON Path: `$['{#NAME}']`

|
|HTTP upstream [{#NAME}]: Keepalive|
The current number of idle keepalive connections.
|Dependent item|nginx.http.upstreams.keepalive[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.keepalive`

|
|HTTP upstream [{#NAME}]: Zombies|
The current number of servers removed from the group but still processing active client requests.
|Dependent item|nginx.http.upstreams.zombies[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.zombies`

|
|HTTP upstream [{#NAME}]: Zone|
The name of the shared memory zone that keeps the group's configuration and run-time state.
|Dependent item|nginx.http.upstreams.zone[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.zone`

- 
Discard unchanged with heartbeat: `3h`

|

### LLD rule HTTP upstream peers discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|HTTP upstream peers discovery||Dependent item|nginx.http.upstream.peers.discovery
**Preprocessing**

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

- 
Discard unchanged with heartbeat: `30m`

|

### Item prototypes for HTTP upstream peers discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|HTTP upstream [{#UPSTREAM}] peer [{#PEER}]: Raw data|
The raw data of the HTTP upstream with the name `[{#UPSTREAM}]`and peer with the name`[{#PEER}]`.
|Dependent item|nginx.http.upstream.peer.raw[{#UPSTREAM},{#PEER}]
**Preprocessing**

- 
JSON Path: `$['{#UPSTREAM}'].peers[?(@.server == '{#PEER}')].first()`

|
|HTTP upstream [{#UPSTREAM}] peer [{#PEER}]: State|
The current state, which may be one of “up”, “draining”, “down”, “unavail”, “checking”, and “unhealthy”.
|Dependent item|nginx.http.upstream.peer.state[{#UPSTREAM},{#PEER}]
**Preprocessing**

- 
JSON Path: `$.state`

- 
Discard unchanged with heartbeat: `3h`

|
|HTTP upstream [{#UPSTREAM}] peer [{#PEER}]: Active|
The current number of active connections.
|Dependent item|nginx.http.upstream.peer.active[{#UPSTREAM},{#PEER}]
**Preprocessing**

- 
JSON Path: `$.active`

|
|HTTP upstream [{#UPSTREAM}] peer [{#PEER}]: Requests, rate|
The total number of client requests forwarded to this server per second.
|Dependent item|nginx.http.upstream.peer.requests.rate[{#UPSTREAM},{#PEER}]
**Preprocessing**

- 
JSON Path: `$.requests`

- Change per second
|
|HTTP upstream [{#UPSTREAM}] peer [{#PEER}]: Responses 1xx, rate|
The number of responses with `1xx` status code per second.
|Dependent item|nginx.http.upstream.peer.responses.1xx.rate[{#UPSTREAM},{#PEER}]
**Preprocessing**

- 
JSON Path: `$.responses.1xx`

- Change per second
|
|HTTP upstream [{#UPSTREAM}] peer [{#PEER}]: Responses 2xx, rate|
The number of responses with `2xx` status code per second.
|Dependent item|nginx.http.upstream.peer.responses.2xx.rate[{#UPSTREAM},{#PEER}]
**Preprocessing**

- 
JSON Path: `$.responses.2xx`

- Change per second
|
|HTTP upstream [{#UPSTREAM}] peer [{#PEER}]: Responses 3xx, rate|
The number of responses with `3xx` status code per second.
|Dependent item|nginx.http.upstream.peer.responses.3xx.rate[{#UPSTREAM},{#PEER}]
**Preprocessing**

- 
JSON Path: `$.responses.3xx`

- Change per second
|
|HTTP upstream [{#UPSTREAM}] peer [{#PEER}]: Responses 4xx, rate|
The number of responses with `4xx` status code per second.
|Dependent item|nginx.http.upstream.peer.responses.4xx.rate[{#UPSTREAM},{#PEER}]
**Preprocessing**

- 
JSON Path: `$.responses.4xx`

- Change per second
|
|HTTP upstream [{#UPSTREAM}] peer [{#PEER}]: Responses 5xx, rate|
The number of responses with `5xx` status code per second.
|Dependent item|nginx.http.upstream.peer.responses.5xx.rate[{#UPSTREAM},{#PEER}]
**Preprocessing**

- 
JSON Path: `$.responses.5xx`

- Change per second
|
|HTTP upstream [{#UPSTREAM}] peer [{#PEER}]: Responses total, rate|
The total number of responses obtained from this server.
|Dependent item|nginx.http.upstream.peer.responses.total.rate[{#UPSTREAM},{#PEER}]
**Preprocessing**

- 
JSON Path: `$.responses.total`

- Change per second
|
|HTTP upstream [{#UPSTREAM}] peer [{#PEER}]: Sent, rate|
The total number of bytes sent to this server per second.
|Dependent item|nginx.http.upstream.peer.sent.rate[{#UPSTREAM},{#PEER}]
**Preprocessing**

- 
JSON Path: `$.sent`

- Change per second
|
|HTTP upstream [{#UPSTREAM}] peer [{#PEER}]: Received, rate|
The total number of bytes received from this server per second.
|Dependent item|nginx.http.upstream.peer.received.rate[{#UPSTREAM},{#PEER}]
**Preprocessing**

- 
JSON Path: `$.received`

- Change per second
|
|HTTP upstream [{#UPSTREAM}] peer [{#PEER}]: Fails, rate|
The total number of unsuccessful attempts to communicate with the server per second.
|Dependent item|nginx.http.upstream.peer.fails.rate[{#UPSTREAM},{#PEER}]
**Preprocessing**

- 
JSON Path: `$.fails`

- Change per second
|
|HTTP upstream [{#UPSTREAM}] peer [{#PEER}]: Unavail|
Displays how many times the server has become unavailable for client requests (the state - “unavail”) due to the number of unsuccessful attempts reaching the `max_fails` threshold.
|Dependent item|nginx.http.upstream.peer.unavail.rate[{#UPSTREAM},{#PEER}]
**Preprocessing**

- 
JSON Path: `$.unavail`

|
|HTTP upstream [{#UPSTREAM}] peer [{#PEER}]: Header time|
The average time to get the response header from the server.
|Dependent item|nginx.http.upstream.peer.header_time.rate[{#UPSTREAM},{#PEER}]
**Preprocessing**

- 
JSON Path: `$.header_time`

⛔️Custom on fail: Discard value

|
|HTTP upstream [{#UPSTREAM}] peer [{#PEER}]: Response time|
The average time to get the full response from the server.
|Dependent item|nginx.http.upstream.peer.response_time.rate[{#UPSTREAM},{#PEER}]
**Preprocessing**

- 
JSON Path: `$.response_time`

⛔️Custom on fail: Discard value

|
|HTTP upstream [{#UPSTREAM}] peer [{#PEER}]: Health checks, check|
The total number of health check requests made.
|Dependent item|nginx.http.upstream.peer.health_checks.checks[{#UPSTREAM},{#PEER}]
**Preprocessing**

- 
JSON Path: `$.health_checks.checks`

|
|HTTP upstream [{#UPSTREAM}] peer [{#PEER}]: Health checks, fails|
The number of failed health checks.
|Dependent item|nginx.http.upstream.peer.health_checks.fails[{#UPSTREAM},{#PEER}]
**Preprocessing**

- 
JSON Path: `$.health_checks.fails`

|
|HTTP upstream [{#UPSTREAM}] peer [{#PEER}]: Health checks, unhealthy|
Displays how many times the server has become `unhealthy` (the state - “unhealthy”.
|Dependent item|nginx.http.upstream.peer.health_checks.unhealthy[{#UPSTREAM},{#PEER}]
**Preprocessing**

- 
JSON Path: `$.health_checks.unhealthy`

|

### Trigger prototypes for HTTP upstream peers discovery

|Name|Description|Expression|Severity|Dependencies and additional info|
|----|-----------|----------|--------|--------------------------------|
|NGINX Plus: HTTP upstream server is not in UP or DOWN state.||`find(/NGINX Plus by HTTP/nginx.http.upstream.peer.state[{#UPSTREAM},{#PEER}],,"like","up")=0 and find(/NGINX Plus by HTTP/nginx.http.upstream.peer.state[{#UPSTREAM},{#PEER}],,"like","down")=0`|Warning||
|NGINX Plus: Too many HTTP requests with code 4xx||`sum(/NGINX Plus by HTTP/nginx.http.upstream.peer.responses.4xx.rate[{#UPSTREAM},{#PEER}],5m) > (sum(/NGINX Plus by HTTP/nginx.http.upstream.peer.responses.total.rate[{#UPSTREAM},{#PEER}],5m)*({$NGINX.HTTP.UPSTREAM.4XX.MAX.WARN}/100))`|Warning||
|NGINX Plus: Too many HTTP requests with code 5xx||`sum(/NGINX Plus by HTTP/nginx.http.upstream.peer.responses.5xx.rate[{#UPSTREAM},{#PEER}],5m) > (sum(/NGINX Plus by HTTP/nginx.http.upstream.peer.responses.total.rate[{#UPSTREAM},{#PEER}],5m)*({$NGINX.HTTP.UPSTREAM.5XX.MAX.WARN}/100))`|High||

### LLD rule Stream server zones discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Stream server zones discovery||Dependent item|nginx.stream.server_zones.discovery
**Preprocessing**

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

- 
Discard unchanged with heartbeat: `30m`

|

### Item prototypes for Stream server zones discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Stream server zone [{#NAME}]: Raw data|
The raw data of server zone with the name `{#NAME}`, configured in the "stream" directive.
|Dependent item|nginx.stream.server_zones.raw[{#NAME}]
**Preprocessing**

- 
JSON Path: `$['{#NAME}']`

|
|Stream server zone [{#NAME}]: Processing|
The number of client connections that are currently being processed.
|Dependent item|nginx.stream.server_zones.processing[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.processing`

|
|Stream server zone [{#NAME}]: Connections, rate|
The total number of connections accepted from clients per second.
|Dependent item|nginx.stream.server_zones.connections.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.connections`

- Change per second
|
|Stream server zone [{#NAME}]: Sessions 2xx, rate|
The total number of sessions completed with status code `2xx` per second.
|Dependent item|nginx.stream.server_zones.sessions.2xx.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.sessions.2xx`

- Change per second
|
|Stream server zone [{#NAME}]: Sessions 4xx, rate|
The total number of sessions completed with status code `4xx` per second.
|Dependent item|nginx.stream.server_zones.sessions.4xx.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.sessions.4xx`

- Change per second
|
|Stream server zone [{#NAME}]: Sessions 5xx, rate|
The total number of sessions completed with status code `5xx` per second.
|Dependent item|nginx.stream.server_zones.sessions.5xx.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.sessions.5xx`

- Change per second
|
|Stream server zone [{#NAME}]: Sessions total, rate|
The total number of completed client sessions per second.
|Dependent item|nginx.stream.server_zones.sessions.total.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.sessions.total`

- Change per second
|
|Stream server zone [{#NAME}]: Discarded, rate|
The total number of connections completed without creating a session per second.
|Dependent item|nginx.stream.server_zones.discarded.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.discarded`

- Change per second
|
|Stream server zone [{#NAME}]: Received, rate|
The total number of bytes received from clients per second.
|Dependent item|nginx.stream.server_zones.received.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.received`

- Change per second
|
|Stream server zone [{#NAME}]: Sent, rate|
The total number of bytes sent to clients per second.
|Dependent item|nginx.stream.server_zones.sent.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.sent`

- Change per second
|

### LLD rule Stream upstreams discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Stream upstreams discovery||Dependent item|nginx.stream.upstreams.discovery
**Preprocessing**

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

- 
Discard unchanged with heartbeat: `30m`

|

### Item prototypes for Stream upstreams discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Stream upstream [{#NAME}]: Raw data|
The raw data of the upstream with the name `[{#UPSTREAM}]`, configured in the "stream" directive.
|Dependent item|nginx.stream.upstreams.raw[{#NAME}]
**Preprocessing**

- 
JSON Path: `$['{#NAME}']`

|
|Stream upstream [{#NAME}]: Zombies||Dependent item|nginx.stream.upstreams.zombies[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.zombies`

|
|Stream upstream [{#NAME}]: Zone||Dependent item|nginx.stream.upstreams.zone[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.zone`

- 
Discard unchanged with heartbeat: `3h`

|

### LLD rule Stream upstream peers discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Stream upstream peers discovery||Dependent item|nginx.stream.upstream.peers.discovery
**Preprocessing**

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

- 
Discard unchanged with heartbeat: `30m`

|

### Item prototypes for Stream upstream peers discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Stream upstream [{#UPSTREAM}] peer [{#PEER}]: Raw data|
The raw data of the upstream with the name `[{#UPSTREAM}]`and peer with the name`[{#PEER}]`, configured in the "stream" directive.
|Dependent item|nginx.stream.upstream.peer.raw[{#UPSTREAM},{#PEER}]
**Preprocessing**

- 
JSON Path: `$['{#UPSTREAM}'].peers[?(@.server == '{#PEER}')].first()`

|
|Stream upstream [{#UPSTREAM}] peer [{#PEER}]: State|
The current state, which may be one of “up”, “draining”, “down”, “unavail”, “checking”, and “unhealthy”.
|Dependent item|nginx.stream.upstream.peer.state[{#UPSTREAM},{#PEER}]
**Preprocessing**

- 
JSON Path: `$.state`

- 
Discard unchanged with heartbeat: `3h`

|
|Stream upstream [{#UPSTREAM}] peer [{#PEER}]: Active|
The current number of connections.
|Dependent item|nginx.stream.upstream.peer.active[{#UPSTREAM},{#PEER}]
**Preprocessing**

- 
JSON Path: `$.active`

|
|Stream upstream [{#UPSTREAM}] peer [{#PEER}]: Sent, rate|
The total number of bytes sent to this server per second.
|Dependent item|nginx.stream.upstream.peer.sent.rate[{#UPSTREAM},{#PEER}]
**Preprocessing**

- 
JSON Path: `$.sent`

- Change per second
|
|Stream upstream [{#UPSTREAM}] peer [{#PEER}]: Received, rate|
The total number of bytes received from this server per second.
|Dependent item|nginx.stream.upstream.peer.received.rate[{#UPSTREAM},{#PEER}]
**Preprocessing**

- 
JSON Path: `$.received`

- Change per second
|
|Stream upstream [{#UPSTREAM}] peer [{#PEER}]: Fails, rate|
The total number of unsuccessful attempts to communicate with the server per second.
|Dependent item|nginx.stream.upstream.peer.fails.rate[{#UPSTREAM},{#PEER}]
**Preprocessing**

- 
JSON Path: `$.fails`

- Change per second
|
|Stream upstream [{#UPSTREAM}] peer [{#PEER}]: Unavail|
Displays how many times the server has  become unavailable for client requests (the state - “unavail”) due to the number of unsuccessful attempts reaching the `max_fails` threshold.
|Dependent item|nginx.stream.upstream.peer.unavail.rate[{#UPSTREAM},{#PEER}]
**Preprocessing**

- 
JSON Path: `$.unavail`

|
|Stream upstream [{#UPSTREAM}] peer [{#PEER}]: Connections|
The total number of client connections forwarded to this server.
|Dependent item|nginx.stream.upstream.peer.connections.rate[{#UPSTREAM},{#PEER}]
**Preprocessing**

- 
JSON Path: `$.connections`

|
|Stream upstream [{#UPSTREAM}] peer [{#PEER}]: Connect time|
The average time to connect to the upstream server.
|Dependent item|nginx.stream.upstream.peer.connect_time.rate[{#UPSTREAM},{#PEER}]
**Preprocessing**

- 
JSON Path: `$.connect_time`

⛔️Custom on fail: Discard value

|
|Stream upstream [{#UPSTREAM}] peer [{#PEER}]: First byte time|
The average time to receive the first byte of data.
|Dependent item|nginx.stream.upstream.peer.first_byte_time.rate[{#UPSTREAM},{#PEER}]
**Preprocessing**

- 
JSON Path: `$.first_byte_time`

⛔️Custom on fail: Discard value

|
|Stream upstream [{#UPSTREAM}] peer [{#PEER}]: Response time|
The average time to receive the last byte of data.
|Dependent item|nginx.stream.upstream.peer.response_time.rate[{#UPSTREAM},{#PEER}]
**Preprocessing**

- 
JSON Path: `$.response_time`

⛔️Custom on fail: Discard value

|
|Stream upstream [{#UPSTREAM}] peer [{#PEER}]: Health checks, check|
The total number of health check requests made.
|Dependent item|nginx.stream.upstream.peer.health_checks.checks[{#UPSTREAM},{#PEER}]
**Preprocessing**

- 
JSON Path: `$.health_checks.checks`

|
|Stream upstream [{#UPSTREAM}] peer [{#PEER}]: Health checks, fails|
The number of failed health checks.
|Dependent item|nginx.stream.upstream.peer.health_checks.fails[{#UPSTREAM},{#PEER}]
**Preprocessing**

- 
JSON Path: `$.health_checks.fails`

|
|Stream upstream [{#UPSTREAM}] peer [{#PEER}]: Health checks, unhealthy|
Displays how many times the server has become `unhealthy` (the state - “unhealthy”).
|Dependent item|nginx.stream.upstream.peer.health_checks.unhealthy[{#UPSTREAM},{#PEER}]
**Preprocessing**

- 
JSON Path: `$.health_checks.unhealthy`

|

### Trigger prototypes for Stream upstream peers discovery

|Name|Description|Expression|Severity|Dependencies and additional info|
|----|-----------|----------|--------|--------------------------------|
|NGINX Plus: Stream upstream server is not in UP or DOWN state.||`find(/NGINX Plus by HTTP/nginx.stream.upstream.peer.state[{#UPSTREAM},{#PEER}],,"like","up")=0 and find(/NGINX Plus by HTTP/nginx.stream.upstream.peer.state[{#UPSTREAM},{#PEER}],,"like","down")=0`|Warning||

### LLD rule Resolvers discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Resolvers discovery||Dependent item|nginx.resolvers.discovery
**Preprocessing**

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

- 
Discard unchanged with heartbeat: `30m`

|

### Item prototypes for Resolvers discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Resolver [{#NAME}]: Raw data|
The raw data of the `Resolver` with the name `{#NAME}`.
|Dependent item|nginx.resolvers.raw[{#NAME}]
**Preprocessing**

- 
JSON Path: `$['{#NAME}']`

|
|Resolver [{#NAME}]: Requests name, rate|
The total number of requests to resolve names to addresses per second.
|Dependent item|nginx.resolvers.requests.name.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.requests.name`

- Change per second
|
|Resolver [{#NAME}]: Requests srv, rate|
The total number of requests to resolve SRV records per second.
|Dependent item|nginx.resolvers.requests.srv.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.requests.srv`

- Change per second
|
|Resolver [{#NAME}]: Requests addr, rate|
The total number of requests to resolve addresses to names per second.
|Dependent item|nginx.resolvers.requests.addr.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.requests.addr`

- Change per second
|
|Resolver [{#NAME}]: Responses noerror, rate|
The total number of successful responses per second.
|Dependent item|nginx.resolvers.responses.noerror.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.responses.noerror`

- Change per second
|
|Resolver [{#NAME}]: Responses formerr, rate|
The total number of `FORMERR` (format error) responses per second.
|Dependent item|nginx.resolvers.responses.formerr.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.responses.formerr`

- Change per second
|
|Resolver [{#NAME}]: Responses servfail, rate|
The total number of `SERVFAIL` (server failure) responses per second.
|Dependent item|nginx.resolvers.responses.servfail.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.responses.servfail`

- Change per second
|
|Resolver [{#NAME}]: Responses nxdomain, rate|
The total number of `NXDOMAIN` (host not found) responses per second.
|Dependent item|nginx.resolvers.responses.nxdomain.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.responses.nxdomain`

- Change per second
|
|Resolver [{#NAME}]: Responses notimp, rate|
The total number of `NOTIMP` (unimplemented) responses per second.
|Dependent item|nginx.resolvers.responses.notimp.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.responses.notimp`

- Change per second
|
|Resolver [{#NAME}]: Responses refused, rate|
The total number of `REFUSED` (operation refused) responses per second.
|Dependent item|nginx.resolvers.responses.refused.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.responses.refused`

- Change per second
|
|Resolver [{#NAME}]: Responses timedout, rate|
The total number of timed out requests per second.
|Dependent item|nginx.resolvers.responses.timedout.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.responses.timedout`

- Change per second
|
|Resolver [{#NAME}]: Responses unknown, rate|
The total number of requests completed with an unknown error per second.
|Dependent item|nginx.resolvers.responses.unknown.rate[{#NAME}]
**Preprocessing**

- 
JSON Path: `$.responses.unknown`

- Change per second
|

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

