RabbitMQ

RabbitMQ is an open-source message-broker software that originally implemented the Advanced Message Queuing Protocol and has since been extended with a plug-in architecture to support Streaming Text Oriented Messaging Protocol, Message Queuing Telemetry Transport, and other protocols.

Available solutions




This template is for Zabbix version: 6.4
Also available for: 6.2 6.0 5.4 5.0

Source: https://git.zabbix.com/projects/ZBX/repos/zabbix/browse/templates/app/rabbitmq_agent?at=release/6.4

RabbitMQ cluster by Zabbix agent

Overview

This template is developed to monitor the messaging broker RabbitMQ by Zabbix that works without any external scripts. Most of the metrics are collected in one go, thanks to Zabbix bulk data collection.

The template RabbitMQ Cluster — collects metrics by polling RabbitMQ management plugin with Zabbix agent.

Requirements

Zabbix version: 6.4 and higher.

Tested versions

This template has been tested on:

  • RabbitMQ 3.5.7, 3.7.7, 3.7.17, 3.7.18, 3.8.5, 3.8.12

Configuration

Zabbix should be configured according to the instructions in the Templates out of the box section.

Setup

Enable the RabbitMQ management plugin. See RabbitMQ documentation for the instructions.

Create a user to monitor the service:

rabbitmqctl add_user zbx_monitor <PASSWORD>
rabbitmqctl set_permissions  -p / zbx_monitor "" "" ".*"
rabbitmqctl set_user_tags zbx_monitor monitoring

A login name and password are also supported in macros functions:

  • {$RABBITMQ.API.USER}
  • {$RABBITMQ.API.PASSWORD}

If your cluster consists of several nodes, it is recommended to assign the cluster template to a separate balancing host. In the case of a single-node installation, you can assign the cluster template to one host with a node template.

If you use another API endpoint, then don't forget to change {$RABBITMQ.API.CLUSTER_HOST} macro.

Install and setup Zabbix agent.

Macros used

Name Description Default
{$RABBITMQ.API.USER} zbx_monitor
{$RABBITMQ.API.PASSWORD} zabbix
{$RABBITMQ.API.CLUSTER_HOST}

The hostname or IP of the API endpoint for the RabbitMQ cluster.

127.0.0.1
{$RABBITMQ.API.PORT}

The port of the RabbitMQ API endpoint.

15672
{$RABBITMQ.API.SCHEME}

The request scheme, which may be HTTP or HTTPS.

http
{$RABBITMQ.LLD.FILTER.EXCHANGE.MATCHES}

This macro is used in the discovery of exchanges. It can be overridden at host level or its linked template level.

.*
{$RABBITMQ.LLD.FILTER.EXCHANGE.NOT_MATCHES}

This macro is used in the discovery of exchanges. It can be overridden at host level or its linked template level.

CHANGE_IF_NEEDED

Items

Name Description Type Key and additional info
RabbitMQ: Get overview

The HTTP API endpoint that returns cluster-wide metrics.

Zabbix agent web.page.get["{$RABBITMQ.API.SCHEME}://{$RABBITMQ.API.USER}:{$RABBITMQ.API.PASSWORD}@{$RABBITMQ.API.CLUSTER_HOST}:{$RABBITMQ.API.PORT}/api/overview"]

Preprocessing

  • Regular expression: \n\s?\n(.*) \1

RabbitMQ: Get exchanges

The HTTP API endpoint that returns exchanges metrics.

Zabbix agent web.page.get["{$RABBITMQ.API.SCHEME}://{$RABBITMQ.API.USER}:{$RABBITMQ.API.PASSWORD}@{$RABBITMQ.API.CLUSTER_HOST}:{$RABBITMQ.API.PORT}/api/exchanges"]

Preprocessing

  • Regular expression: \n\s?\n(.*) \1

RabbitMQ: Connections total

The total number of connections.

Dependent item rabbitmq.overview.object_totals.connections

Preprocessing

  • JSON Path: $.object_totals.connections

RabbitMQ: Channels total

The total number of channels.

Dependent item rabbitmq.overview.object_totals.channels

Preprocessing

  • JSON Path: $.object_totals.channels

RabbitMQ: Queues total

The total number of queues.

Dependent item rabbitmq.overview.object_totals.queues

Preprocessing

  • JSON Path: $.object_totals.queues

RabbitMQ: Consumers total

The total number of consumers.

Dependent item rabbitmq.overview.object_totals.consumers

Preprocessing

  • JSON Path: $.object_totals.consumers

RabbitMQ: Exchanges total

The total number of exchanges.

Dependent item rabbitmq.overview.object_totals.exchanges

Preprocessing

  • JSON Path: $.object_totals.exchanges

RabbitMQ: Messages total

The total number of messages (ready, plus unacknowledged).

Dependent item rabbitmq.overview.queue_totals.messages

Preprocessing

  • JSON Path: $.queue_totals.messages

    ⛔️Custom on fail: Set value to: 0

RabbitMQ: Messages ready for delivery

The number of messages ready for delivery.

Dependent item rabbitmq.overview.queue_totals.messages.ready

Preprocessing

  • JSON Path: $.queue_totals.messages_ready

    ⛔️Custom on fail: Set value to: 0

RabbitMQ: Messages unacknowledged

The number of unacknowledged messages.

Dependent item rabbitmq.overview.queue_totals.messages.unacknowledged

Preprocessing

  • JSON Path: $.queue_totals.messages_unacknowledged

    ⛔️Custom on fail: Set value to: 0

RabbitMQ: Messages acknowledged

The number of messages delivered to clients and acknowledged.

Dependent item rabbitmq.overview.messages.ack

Preprocessing

  • JSON Path: $.message_stats.ack

    ⛔️Custom on fail: Set value to: 0

RabbitMQ: Messages acknowledged per second

The rate of messages (per second) delivered to clients and acknowledged.

Dependent item rabbitmq.overview.messages.ack.rate

Preprocessing

  • JSON Path: $.message_stats.ack_details.rate

    ⛔️Custom on fail: Set value to: 0

RabbitMQ: Messages confirmed

The count of confirmed messages.

Dependent item rabbitmq.overview.messages.confirm

Preprocessing

  • JSON Path: $.message_stats.confirm

    ⛔️Custom on fail: Set value to: 0

RabbitMQ: Messages confirmed per second

The rate of messages confirmed per second.

Dependent item rabbitmq.overview.messages.confirm.rate

Preprocessing

  • JSON Path: $.message_stats.confirm_details.rate

    ⛔️Custom on fail: Set value to: 0

RabbitMQ: Messages delivered

The sum of messages delivered to consumers: in acknowledgement mode and in no-acknowledgement mode; delivered to consumers in response to the basic.get: in acknowledgement mode and in no-acknowledgement mode.

Dependent item rabbitmq.overview.messages.deliver_get

Preprocessing

  • JSON Path: $.message_stats.deliver_get

    ⛔️Custom on fail: Set value to: 0

RabbitMQ: Messages delivered per second

The rate of the sum of messages (per second) delivered to consumers: in acknowledgement mode and in no-acknowledgement mode; delivered to consumers in response to the basic.get: in acknowledgement mode and in no-acknowledgement mode.

Dependent item rabbitmq.overview.messages.deliver_get.rate

Preprocessing

  • JSON Path: $.message_stats.deliver_get_details.rate

    ⛔️Custom on fail: Set value to: 0

RabbitMQ: Messages published

The count of published messages.

Dependent item rabbitmq.overview.messages.publish

Preprocessing

  • JSON Path: $.message_stats.publish

    ⛔️Custom on fail: Set value to: 0

RabbitMQ: Messages published per second

The rate of messages published per second.

Dependent item rabbitmq.overview.messages.publish.rate

Preprocessing

  • JSON Path: $.message_stats.publish_details.rate

    ⛔️Custom on fail: Set value to: 0

RabbitMQ: Messages publish_in

The count of messages published from the channels into this overview.

Dependent item rabbitmq.overview.messages.publish_in

Preprocessing

  • JSON Path: $.message_stats.publish_in

    ⛔️Custom on fail: Set value to: 0

RabbitMQ: Messages publish_in per second

The rate of messages (per second) published from the channels into this overview.

Dependent item rabbitmq.overview.messages.publish_in.rate

Preprocessing

  • JSON Path: $.message_stats.publish_in_details.rate

    ⛔️Custom on fail: Set value to: 0

RabbitMQ: Messages publish_out

The count of messages published from this overview into queues.

Dependent item rabbitmq.overview.messages.publish_out

Preprocessing

  • JSON Path: $.message_stats.publish_out

    ⛔️Custom on fail: Set value to: 0

RabbitMQ: Messages publish_out per second

The rate of messages (per second) published from this overview into queues.

Dependent item rabbitmq.overview.messages.publish_out.rate

Preprocessing

  • JSON Path: $.message_stats.publish_out_details.rate

    ⛔️Custom on fail: Set value to: 0

RabbitMQ: Messages returned unroutable

The count of messages returned to a publisher as unroutable.

Dependent item rabbitmq.overview.messages.return_unroutable

Preprocessing

  • JSON Path: $.message_stats.return_unroutable

    ⛔️Custom on fail: Set value to: 0

RabbitMQ: Messages returned unroutable per second

The rate of messages (per second) returned to a publisher as unroutable.

Dependent item rabbitmq.overview.messages.return_unroutable.rate

Preprocessing

  • JSON Path: $.message_stats.return_unroutable_details.rate

    ⛔️Custom on fail: Set value to: 0

RabbitMQ: Messages returned redeliver

The count of subset of messages in the deliver_get, which had the redelivered flag set.

Dependent item rabbitmq.overview.messages.redeliver

Preprocessing

  • JSON Path: $.message_stats.redeliver

    ⛔️Custom on fail: Set value to: 0

RabbitMQ: Messages returned redeliver per second

The rate of subset of messages (per second) in the deliver_get, which had the redelivered flag set.

Dependent item rabbitmq.overview.messages.redeliver.rate

Preprocessing

  • JSON Path: $.message_stats.redeliver_details.rate

    ⛔️Custom on fail: Set value to: 0

Triggers

Name Description Expression Severity Dependencies and additional info
RabbitMQ: Failed to fetch overview data

Zabbix has not received any data for items for the last 30 minutes.

nodata(/RabbitMQ cluster by Zabbix agent/web.page.get["{$RABBITMQ.API.SCHEME}://{$RABBITMQ.API.USER}:{$RABBITMQ.API.PASSWORD}@{$RABBITMQ.API.CLUSTER_HOST}:{$RABBITMQ.API.PORT}/api/overview"],30m)=1 Warning Manual close: Yes

LLD rule Health Check 3.8.10+ discovery

Name Description Type Key and additional info
Health Check 3.8.10+ discovery

Specific metrics for the versions: up to and including 3.8.10.

Dependent item rabbitmq.healthcheck.v3810.discovery

Preprocessing

  • JSON Path: $.management_version

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

Item prototypes for Health Check 3.8.10+ discovery

Name Description Type Key and additional info
RabbitMQ: Healthcheck: alarms in effect in the cluster{#SINGLETON}

It responds with a status code 200 OK if there are no alarms in effect in the cluster.

Otherwise, it responds with a status code 503 Service Unavailable.

Zabbix agent web.page.get["{$RABBITMQ.API.SCHEME}://{$RABBITMQ.API.USER}:{$RABBITMQ.API.PASSWORD}@{$RABBITMQ.API.CLUSTER_HOST}:{$RABBITMQ.API.PORT}/api/health/checks/alarms{#SINGLETON}"]

Preprocessing

  • Regular expression: HTTP\/1\.1\b\s(\d+) \1

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

  • Discard unchanged with heartbeat: 3h

Trigger prototypes for Health Check 3.8.10+ discovery

Name Description Expression Severity Dependencies and additional info
RabbitMQ: There are active alarms in the cluster

This is the default API endpoint path: http://{HOST.CONN}:{$RABBITMQ.API.PORT}/api/index.html.

last(/RabbitMQ cluster by Zabbix agent/web.page.get["{$RABBITMQ.API.SCHEME}://{$RABBITMQ.API.USER}:{$RABBITMQ.API.PASSWORD}@{$RABBITMQ.API.CLUSTER_HOST}:{$RABBITMQ.API.PORT}/api/health/checks/alarms{#SINGLETON}"])=0 Average

LLD rule Exchanges discovery

Name Description Type Key and additional info
Exchanges discovery

The metrics for an individual exchange.

Dependent item rabbitmq.exchanges.discovery

Item prototypes for Exchanges discovery

Name Description Type Key and additional info
RabbitMQ: Exchange [{#VHOST}][{#EXCHANGE}][{#TYPE}]: Get data

The HTTP API endpoint that returns [{#VHOST}][{#EXCHANGE}][{#TYPE}] exchanges metrics

Dependent item rabbitmq.get_exchanges["{#VHOST}/{#EXCHANGE}/{#TYPE}"]

Preprocessing

  • JSON Path: The text is too long. Please see the template.

RabbitMQ: Exchange [{#VHOST}][{#EXCHANGE}][{#TYPE}]: Messages acknowledged

The number of messages delivered to clients and acknowledged.

Dependent item rabbitmq.exchange.messages.ack["{#VHOST}/{#EXCHANGE}/{#TYPE}"]

Preprocessing

  • JSON Path: $.message_stats.ack

    ⛔️Custom on fail: Set value to: 0

RabbitMQ: Exchange [{#VHOST}][{#EXCHANGE}][{#TYPE}]: Messages acknowledged per second

The rate of messages (per second) delivered to clients and acknowledged.

Dependent item rabbitmq.exchange.messages.ack.rate["{#VHOST}/{#EXCHANGE}/{#TYPE}"]

Preprocessing

  • JSON Path: $.message_stats.ack_details.rate

    ⛔️Custom on fail: Set value to: 0

RabbitMQ: Exchange [{#VHOST}][{#EXCHANGE}][{#TYPE}]: Messages confirmed

The count of confirmed messages.

Dependent item rabbitmq.exchange.messages.confirm["{#VHOST}/{#EXCHANGE}/{#TYPE}"]

Preprocessing

  • JSON Path: $.message_stats.confirm

    ⛔️Custom on fail: Set value to: 0

RabbitMQ: Exchange [{#VHOST}][{#EXCHANGE}][{#TYPE}]: Messages confirmed per second

The rate of messages confirmed per second.

Dependent item rabbitmq.exchange.messages.confirm.rate["{#VHOST}/{#EXCHANGE}/{#TYPE}"]

Preprocessing

  • JSON Path: $.message_stats.confirm_details.rate

    ⛔️Custom on fail: Set value to: 0

RabbitMQ: Exchange [{#VHOST}][{#EXCHANGE}][{#TYPE}]: Messages delivered

The sum of messages delivered to consumers: in acknowledgement mode and in no-acknowledgement mode; delivered to consumers in response to the basic.get: in acknowledgement mode and in no-acknowledgement mode.

Dependent item rabbitmq.exchange.messages.deliver_get["{#VHOST}/{#EXCHANGE}/{#TYPE}"]

Preprocessing

  • JSON Path: $.message_stats.deliver_get

    ⛔️Custom on fail: Set value to: 0

RabbitMQ: Exchange [{#VHOST}][{#EXCHANGE}][{#TYPE}]: Messages delivered per second

The rate of the sum of messages (per second) delivered to consumers: in acknowledgement mode and in no-acknowledgement mode; delivered to consumers in response to the basic.get: in acknowledgement mode and in no-acknowledgement mode.

Dependent item rabbitmq.exchange.messages.deliver_get.rate["{#VHOST}/{#EXCHANGE}/{#TYPE}"]

Preprocessing

  • JSON Path: $.message_stats.deliver_get_details.rate

    ⛔️Custom on fail: Set value to: 0

RabbitMQ: Exchange [{#VHOST}][{#EXCHANGE}][{#TYPE}]: Messages published

The count of published messages.

Dependent item rabbitmq.exchange.messages.publish["{#VHOST}/{#EXCHANGE}/{#TYPE}"]

Preprocessing

  • JSON Path: $.message_stats.publish

    ⛔️Custom on fail: Set value to: 0

RabbitMQ: Exchange [{#VHOST}][{#EXCHANGE}][{#TYPE}]: Messages published per second

The rate of messages published per second.

Dependent item rabbitmq.exchange.messages.publish.rate["{#VHOST}/{#EXCHANGE}/{#TYPE}"]

Preprocessing

  • JSON Path: $.message_stats.publish_details.rate

    ⛔️Custom on fail: Set value to: 0

RabbitMQ: Exchange [{#VHOST}][{#EXCHANGE}][{#TYPE}]: Messages publish_in

The count of messages published from the channels into this overview.

Dependent item rabbitmq.exchange.messages.publish_in["{#VHOST}/{#EXCHANGE}/{#TYPE}"]

Preprocessing

  • JSON Path: $.message_stats.publish_in

    ⛔️Custom on fail: Set value to: 0

RabbitMQ: Exchange [{#VHOST}][{#EXCHANGE}][{#TYPE}]: Messages publish_in per second

The rate of messages (per second) published from the channels into this overview.

Dependent item rabbitmq.exchange.messages.publish_in.rate["{#VHOST}/{#EXCHANGE}/{#TYPE}"]

Preprocessing

  • JSON Path: $.message_stats.publish_in_details.rate

    ⛔️Custom on fail: Set value to: 0

RabbitMQ: Exchange [{#VHOST}][{#EXCHANGE}][{#TYPE}]: Messages publish_out

The count of messages published from this overview into queues.

Dependent item rabbitmq.exchange.messages.publish_out["{#VHOST}/{#EXCHANGE}/{#TYPE}"]

Preprocessing

  • JSON Path: $.message_stats.publish_out

    ⛔️Custom on fail: Set value to: 0

RabbitMQ: Exchange [{#VHOST}][{#EXCHANGE}][{#TYPE}]: Messages publish_out per second

The rate of messages (per second) published from this overview into queues.

Dependent item rabbitmq.exchange.messages.publish_out.rate["{#VHOST}/{#EXCHANGE}/{#TYPE}"]

Preprocessing

  • JSON Path: $.message_stats.publish_out_details.rate

    ⛔️Custom on fail: Set value to: 0

RabbitMQ: Exchange [{#VHOST}][{#EXCHANGE}][{#TYPE}]: Messages returned unroutable

The count of messages returned to a publisher as unroutable.

Dependent item rabbitmq.exchange.messages.return_unroutable["{#VHOST}/{#EXCHANGE}/{#TYPE}"]

Preprocessing

  • JSON Path: $.message_stats.return_unroutable

    ⛔️Custom on fail: Set value to: 0

RabbitMQ: Exchange [{#VHOST}][{#EXCHANGE}][{#TYPE}]: Messages returned unroutable per second

The rate of messages (per second) returned to a publisher as unroutable.

Dependent item rabbitmq.exchange.messages.return_unroutable.rate["{#VHOST}/{#EXCHANGE}/{#TYPE}"]

Preprocessing

  • JSON Path: $.message_stats.return_unroutable_details.rate

    ⛔️Custom on fail: Set value to: 0

RabbitMQ: Exchange [{#VHOST}][{#EXCHANGE}][{#TYPE}]: Messages redelivered

The count of subset of messages in the deliver_get, which had the redelivered flag set.

Dependent item rabbitmq.exchange.messages.redeliver["{#VHOST}/{#EXCHANGE}/{#TYPE}"]

Preprocessing

  • JSON Path: $.message_stats.redeliver

    ⛔️Custom on fail: Set value to: 0

RabbitMQ: Exchange {#VHOST}/{#EXCHANGE}/{#TYPE}: Messages redelivered per second

The rate of subset of messages (per second) in the deliver_get, which had the redelivered flag set.

Dependent item rabbitmq.exchange.messages.redeliver.rate["{#VHOST}/{#EXCHANGE}/{#TYPE}"]

Preprocessing

  • JSON Path: $.message_stats.redeliver_details.rate

    ⛔️Custom on fail: Set value to: 0

RabbitMQ node by Zabbix agent

Overview

This template is developed to monitor RabbitMQ by Zabbix that works without any external scripts.

Most of the metrics are collected in one go, thanks to Zabbix bulk data collection.

The template RabbitMQ Node — (Zabbix version >= 4.2) collects metrics by polling RabbitMQ management plugin with Zabbix agent.

It also uses Zabbix agent to collect RabbitMQ Linux process statistics, such as CPU usage, memory usage, and whether the process is running or not.

Requirements

Zabbix version: 6.4 and higher.

Tested versions

This template has been tested on:

  • RabbitMQ 3.5.7, 3.7.7, 3.7.17, 3.7.18, 3.8.5, 3.8.12

Configuration

Zabbix should be configured according to the instructions in the Templates out of the box section.

Setup

Enable the RabbitMQ management plugin. See RabbitMQ documentation for the instructions.

Create a user to monitor the service:

rabbitmqctl add_user zbx_monitor <PASSWORD>
rabbitmqctl set_permissions  -p / zbx_monitor "" "" ".*"
rabbitmqctl set_user_tags zbx_monitor monitoring

A login name and password are also supported in macros functions:

  • {$RABBITMQ.API.USER}
  • {$RABBITMQ.API.PASSWORD}

If you use another API endpoint, then don't forget to change {$RABBITMQ.API.HOST} macro. Install and setup Zabbix agent.

Macros used

Name Description Default
{$RABBITMQ.API.USER} zbx_monitor
{$RABBITMQ.API.PASSWORD} zabbix
{$RABBITMQ.CLUSTER.NAME}

The name of the RabbitMQ cluster.

rabbit
{$RABBITMQ.API.PORT}

The port of the RabbitMQ API endpoint.

15672
{$RABBITMQ.API.SCHEME}

The request scheme, which may be HTTP or HTTPS.

http
{$RABBITMQ.API.HOST}

The hostname or IP of the API endpoint for the RabbitMQ.

127.0.0.1
{$RABBITMQ.PROCESS_NAME}

The process name filter for the RabbitMQ process discovery.

beam.smp
{$RABBITMQ.PROCESS.NAME.PARAMETER}

The process name of the RabbitMQ server used in the item key proc.get. It could be specified if the correct process name is known.

{$RABBITMQ.LLD.FILTER.QUEUE.MATCHES}

This macro is used in the discovery of queues. It can be overridden at host level or its linked template level.

.*
{$RABBITMQ.LLD.FILTER.QUEUE.NOT_MATCHES}

This macro is used in the discovery of queues. It can be overridden at host level or its linked template level.

CHANGE_IF_NEEDED
{$RABBITMQ.RESPONSE_TIME.MAX.WARN}

The maximum response time by the RabbitMQ expressed in seconds for a trigger expression.

10
{$RABBITMQ.MESSAGES.MAX.WARN}

The maximum number of messages in the queue for a trigger expression.

1000

Items

Name Description Type Key and additional info
RabbitMQ: Service ping Zabbix agent net.tcp.service["{$RABBITMQ.API.SCHEME}","{$RABBITMQ.API.HOST}","{$RABBITMQ.API.PORT}"]

Preprocessing

  • Discard unchanged with heartbeat: 10m

RabbitMQ: Get node overview

The HTTP API endpoint that returns cluster-wide metrics.

Zabbix agent web.page.get["{$RABBITMQ.API.SCHEME}://{$RABBITMQ.API.USER}:{$RABBITMQ.API.PASSWORD}@{$RABBITMQ.API.HOST}:{$RABBITMQ.API.PORT}/api/overview"]

Preprocessing

  • Regular expression: \n\s?\n(.*) \1

RabbitMQ: Get nodes

The HTTP API endpoint that returns metrics of the nodes.

Zabbix agent web.page.get["{$RABBITMQ.API.SCHEME}://{$RABBITMQ.API.USER}:{$RABBITMQ.API.PASSWORD}@{$RABBITMQ.API.HOST}:{$RABBITMQ.API.PORT}/api/nodes/{$RABBITMQ.CLUSTER.NAME}@{HOST.NAME}?memory=true"]

Preprocessing

  • Regular expression: \n\s?\n(.*) \1

RabbitMQ: Get queues

The HTTP API endpoint that returns metrics of the queues metrics.

Zabbix agent web.page.get["{$RABBITMQ.API.SCHEME}://{$RABBITMQ.API.USER}:{$RABBITMQ.API.PASSWORD}@{$RABBITMQ.API.HOST}:{$RABBITMQ.API.PORT}/api/queues"]

Preprocessing

  • Regular expression: \n\s?\n(.*) \1

RabbitMQ: Management plugin version

The version of the management plugin in use.

Dependent item rabbitmq.node.overview.management_version

Preprocessing

  • JSON Path: $.management_version

  • Discard unchanged with heartbeat: 1d

RabbitMQ: RabbitMQ version

The version of the RabbitMQ on the node, which processed this request.

Dependent item rabbitmq.node.overview.rabbitmq_version

Preprocessing

  • JSON Path: $.rabbitmq_version

  • Discard unchanged with heartbeat: 1d

RabbitMQ: Used file descriptors

The descriptors of the used file.

Dependent item rabbitmq.node.fd_used

Preprocessing

  • JSON Path: $.fd_used

RabbitMQ: Free disk space

The current free disk space.

Dependent item rabbitmq.node.disk_free

Preprocessing

  • JSON Path: $.disk_free

RabbitMQ: Memory used

The memory usage expressed in bytes.

Dependent item rabbitmq.node.mem_used

Preprocessing

  • JSON Path: $.mem_used

RabbitMQ: Memory limit

The memory usage with high watermark properties expressed in bytes.

Dependent item rabbitmq.node.mem_limit

Preprocessing

  • JSON Path: $.mem_limit

RabbitMQ: Disk free limit

The free space limit of a disk expressed in bytes.

Dependent item rabbitmq.node.disk_free_limit

Preprocessing

  • JSON Path: $.disk_free_limit

RabbitMQ: Runtime run queue

The average number of Erlang processes waiting to run.

Dependent item rabbitmq.node.run_queue

Preprocessing

  • JSON Path: $.run_queue

RabbitMQ: Sockets used

The number of file descriptors used as sockets.

Dependent item rabbitmq.node.sockets_used

Preprocessing

  • JSON Path: $.sockets_used

RabbitMQ: Sockets available

The file descriptors available for use as sockets.

Dependent item rabbitmq.node.sockets_total

Preprocessing

  • JSON Path: $.sockets_total

RabbitMQ: Number of network partitions

The number of network partitions, which this node "sees".

Dependent item rabbitmq.node.partitions

Preprocessing

  • JSON Path: $.partitions

  • JavaScript: return JSON.parse(value).length;

RabbitMQ: Is running

It "sees" whether the node is running or not.

Dependent item rabbitmq.node.running

Preprocessing

  • JSON Path: $.running

  • Boolean to decimal
RabbitMQ: Memory alarm

It checks whether the host has a memory alarm or not.

Dependent item rabbitmq.node.mem_alarm

Preprocessing

  • JSON Path: $.mem_alarm

  • Boolean to decimal
RabbitMQ: Disk free alarm

It checks whether the node has a disk alarm or not.

Dependent item rabbitmq.node.disk_free_alarm

Preprocessing

  • JSON Path: $.disk_free_alarm

  • Boolean to decimal
RabbitMQ: Uptime

Uptime expressed in milliseconds.

Dependent item rabbitmq.node.uptime

Preprocessing

  • JSON Path: $.uptime

  • Custom multiplier: 0.001

RabbitMQ: Get processes summary

The aggregated data of summary metrics for all processes.

Zabbix agent proc.get[{$RABBITMQ.PROCESS.NAME.PARAMETER},,,summary]
RabbitMQ: Service response time Zabbix agent net.tcp.service.perf["{$RABBITMQ.API.SCHEME}","{$RABBITMQ.API.HOST}","{$RABBITMQ.API.PORT}"]

Triggers

Name Description Expression Severity Dependencies and additional info
RabbitMQ: Version has changed

RabbitMQ version has changed. Acknowledge to close the problem manually.

last(/RabbitMQ node by Zabbix agent/rabbitmq.node.overview.rabbitmq_version,#1)<>last(/RabbitMQ node by Zabbix agent/rabbitmq.node.overview.rabbitmq_version,#2) and length(last(/RabbitMQ node by Zabbix agent/rabbitmq.node.overview.rabbitmq_version))>0 Info Manual close: Yes
RabbitMQ: Number of network partitions is too high

For more details see Detecting Network Partitions.

min(/RabbitMQ node by Zabbix agent/rabbitmq.node.partitions,5m)>0 Warning
RabbitMQ: Memory alarm

For more details see Memory Alarms.

last(/RabbitMQ node by Zabbix agent/rabbitmq.node.mem_alarm)=1 Average
RabbitMQ: Free disk space alarm

For more details see Free Disk Space Alarms.

last(/RabbitMQ node by Zabbix agent/rabbitmq.node.disk_free_alarm)=1 Average
RabbitMQ: Host has been restarted

Uptime is less than 10 minutes.

last(/RabbitMQ node by Zabbix agent/rabbitmq.node.uptime)<10m Info Manual close: Yes

LLD rule RabbitMQ process discovery

Name Description Type Key and additional info
RabbitMQ process discovery

The discovery of the RabbitMQ summary processes.

Dependent item rabbitmq.proc.discovery

Item prototypes for RabbitMQ process discovery

Name Description Type Key and additional info
RabbitMQ: Get process data

The summary metrics aggregated by a process {#RABBITMQ.NAME}.

Dependent item rabbitmq.proc.get[{#RABBITMQ.NAME}]

Preprocessing

  • JSON Path: $.[?(@["name"]=="{#RABBITMQ.NAME}")].first()

    ⛔️Custom on fail: Set value to: Failed to retrieve process {#RABBITMQ.NAME} data

RabbitMQ: Number of running processes

The number of running processes {#RABBITMQ.NAME}.

Dependent item rabbitmq.proc.num[{#RABBITMQ.NAME}]

Preprocessing

  • JSON Path: $.processes

    ⛔️Custom on fail: Set value to: 0

  • Discard unchanged with heartbeat: 1h

RabbitMQ: Memory usage (rss)

The summary of resident set size memory used by a process {#RABBITMQ.NAME} expressed in bytes.

Dependent item rabbitmq.proc.rss[{#RABBITMQ.NAME}]

Preprocessing

  • JSON Path: $.rss

    ⛔️Custom on fail: Discard value

RabbitMQ: Memory usage (vsize)

The summary of virtual memory used by a process {#RABBITMQ.NAME} expressed in bytes.

Dependent item rabbitmq.proc.vmem[{#RABBITMQ.NAME}]

Preprocessing

  • JSON Path: $.vsize

    ⛔️Custom on fail: Discard value

RabbitMQ: Memory usage, %

The percentage of real memory used by a process {#RABBITMQ.NAME}.

Dependent item rabbitmq.proc.pmem[{#RABBITMQ.NAME}]

Preprocessing

  • JSON Path: $.pmem

    ⛔️Custom on fail: Discard value

RabbitMQ: CPU utilization

The percentage of the CPU utilization by a process {#RABBITMQ.NAME}.

Zabbix agent proc.cpu.util[{#RABBITMQ.NAME}]

Trigger prototypes for RabbitMQ process discovery

Name Description Expression Severity Dependencies and additional info
RabbitMQ: Process is not running last(/RabbitMQ node by Zabbix agent/rabbitmq.proc.num[{#RABBITMQ.NAME}])=0 High
RabbitMQ: Failed to fetch nodes data

Zabbix has not received any data for items for the last 30 minutes.

nodata(/RabbitMQ node by Zabbix agent/web.page.get["{$RABBITMQ.API.SCHEME}://{$RABBITMQ.API.USER}:{$RABBITMQ.API.PASSWORD}@{$RABBITMQ.API.HOST}:{$RABBITMQ.API.PORT}/api/nodes/{$RABBITMQ.CLUSTER.NAME}@{HOST.NAME}?memory=true"],30m)=1 and last(/RabbitMQ node by Zabbix agent/rabbitmq.proc.num[{#RABBITMQ.NAME}])>0 Warning Manual close: Yes
Depends on:
  • RabbitMQ: Process is not running
RabbitMQ: Service is down last(/RabbitMQ node by Zabbix agent/net.tcp.service["{$RABBITMQ.API.SCHEME}","{$RABBITMQ.API.HOST}","{$RABBITMQ.API.PORT}"])=0 and last(/RabbitMQ node by Zabbix agent/rabbitmq.proc.num[{#RABBITMQ.NAME}])>0 Average Manual close: Yes
RabbitMQ: Node is not running

RabbitMQ node is not running.

max(/RabbitMQ node by Zabbix agent/rabbitmq.node.running,5m)=0 and last(/RabbitMQ node by Zabbix agent/rabbitmq.proc.num[{#RABBITMQ.NAME}])>0 Average Depends on:
  • RabbitMQ: Service is down
RabbitMQ: Service response time is too high min(/RabbitMQ node by Zabbix agent/net.tcp.service.perf["{$RABBITMQ.API.SCHEME}","{$RABBITMQ.API.HOST}","{$RABBITMQ.API.PORT}"],5m)>{$RABBITMQ.RESPONSE_TIME.MAX.WARN} and last(/RabbitMQ node by Zabbix agent/rabbitmq.proc.num[{#RABBITMQ.NAME}])>0 Warning Manual close: Yes
Depends on:
  • RabbitMQ: Service is down

LLD rule Health Check 3.8.10+ discovery

Name Description Type Key and additional info
Health Check 3.8.10+ discovery

Specific metrics for the versions: up to and including 3.8.10.

Dependent item rabbitmq.healthcheck.v3810.discovery

Preprocessing

  • JSON Path: $.management_version

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

Item prototypes for Health Check 3.8.10+ discovery

Name Description Type Key and additional info
RabbitMQ: Healthcheck: local alarms in effect on this node{#SINGLETON}

It responds with a status code 200 OK if there are no local alarms in effect on the target node.

Otherwise, it responds with a status code 503 Service Unavailable.

Zabbix agent web.page.get["{$RABBITMQ.API.SCHEME}://{$RABBITMQ.API.USER}:{$RABBITMQ.API.PASSWORD}@{$RABBITMQ.API.HOST}:{$RABBITMQ.API.PORT}/api/health/checks/local-alarms{#SINGLETON}"]

Preprocessing

  • Regular expression: HTTP\/1\.1\b\s(\d+) \1

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

  • Discard unchanged with heartbeat: 3h

RabbitMQ: Healthcheck: expiration date on the certificates{#SINGLETON}

It checks the expiration date on the certificates for every listener configured to use the Transport Layer Security (TLS).

It responds with a status code 200 OK if all the certificates are valid (have not expired).

Otherwise, it responds with a status code 503 Service Unavailable.

Zabbix agent web.page.get["{$RABBITMQ.API.SCHEME}://{$RABBITMQ.API.USER}:{$RABBITMQ.API.PASSWORD}@{$RABBITMQ.API.HOST}:{$RABBITMQ.API.PORT}/api/health/checks/certificate-expiration/1/months{#SINGLETON}"]

Preprocessing

  • Regular expression: HTTP\/1\.1\b\s(\d+) \1

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

  • Discard unchanged with heartbeat: 3h

RabbitMQ: Healthcheck: virtual hosts on this node{#SINGLETON}

It responds with It responds with a status code 200 OK if all virtual hosts are running on the target node.

Otherwise it responds with a status code 503 Service Unavailable.

Zabbix agent web.page.get["{$RABBITMQ.API.SCHEME}://{$RABBITMQ.API.USER}:{$RABBITMQ.API.PASSWORD}@{$RABBITMQ.API.HOST}:{$RABBITMQ.API.PORT}/api/health/checks/virtual-hosts{#SINGLETON}"]

Preprocessing

  • Regular expression: HTTP\/1\.1\b\s(\d+) \1

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

  • Discard unchanged with heartbeat: 3h

RabbitMQ: Healthcheck: classic mirrored queues without synchronized mirrors online{#SINGLETON}

It checks if there are classic mirrored queues without synchronized mirrors online (queues that would potentially lose data if the target node is shut down).

It responds with a status code 200 OK if there are no such classic mirrored queues.

Otherwise, it responds with a status code 503 Service Unavailable.

Zabbix agent web.page.get["{$RABBITMQ.API.SCHEME}://{$RABBITMQ.API.USER}:{$RABBITMQ.API.PASSWORD}@{$RABBITMQ.API.HOST}:{$RABBITMQ.API.PORT}/api/health/checks/node-is-mirror-sync-critical{#SINGLETON}"]

Preprocessing

  • Regular expression: HTTP\/1\.1\b\s(\d+) \1

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

  • Discard unchanged with heartbeat: 3h

RabbitMQ: Healthcheck: queues with minimum online quorum{#SINGLETON}

It checks if there are quorum queues with minimum online quorum (queues that would lose their quorum and availability if the target node is shut down).

It responds with a status code 200 OK if there are no such quorum queues.

Otherwise, it responds with a status code 503 Service Unavailable.

Zabbix agent web.page.get["{$RABBITMQ.API.SCHEME}://{$RABBITMQ.API.USER}:{$RABBITMQ.API.PASSWORD}@{$RABBITMQ.API.HOST}:{$RABBITMQ.API.PORT}/api/health/checks/node-is-quorum-critical{#SINGLETON}"]

Preprocessing

  • Regular expression: HTTP\/1\.1\b\s(\d+) \1

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

  • Discard unchanged with heartbeat: 3h

Trigger prototypes for Health Check 3.8.10+ discovery

Name Description Expression Severity Dependencies and additional info
RabbitMQ: There are active alarms in the node

It checks the active alarms in the nodes via API. This is the default API endpoint path: http://{HOST.CONN}:{$RABBITMQ.API.PORT}/api/index.html.

last(/RabbitMQ node by Zabbix agent/web.page.get["{$RABBITMQ.API.SCHEME}://{$RABBITMQ.API.USER}:{$RABBITMQ.API.PASSWORD}@{$RABBITMQ.API.HOST}:{$RABBITMQ.API.PORT}/api/health/checks/local-alarms{#SINGLETON}"])=0 Average
RabbitMQ: There are valid TLS certificates expiring in the next month

It checks if there are valid TLS certificates expiring in the next month. This is the default API endpoint path: http://{HOST.CONN}:{$RABBITMQ.API.PORT}/api/index.html.

last(/RabbitMQ node by Zabbix agent/web.page.get["{$RABBITMQ.API.SCHEME}://{$RABBITMQ.API.USER}:{$RABBITMQ.API.PASSWORD}@{$RABBITMQ.API.HOST}:{$RABBITMQ.API.PORT}/api/health/checks/certificate-expiration/1/months{#SINGLETON}"])=0 Average
RabbitMQ: There are not running virtual hosts

It checks if there are not running virtual hosts via API. This is the default API endpoint path: http://{HOST.CONN}:{$RABBITMQ.API.PORT}/api/index.html.

last(/RabbitMQ node by Zabbix agent/web.page.get["{$RABBITMQ.API.SCHEME}://{$RABBITMQ.API.USER}:{$RABBITMQ.API.PASSWORD}@{$RABBITMQ.API.HOST}:{$RABBITMQ.API.PORT}/api/health/checks/virtual-hosts{#SINGLETON}"])=0 Average
RabbitMQ: There are queues that could potentially lose data if this node goes offline.

It checks whether there are queues that could potentially lose data if this node goes offline via API. This is the default API endpoint path: http://{HOST.CONN}:{$RABBITMQ.API.PORT}/api/index.html.

last(/RabbitMQ node by Zabbix agent/web.page.get["{$RABBITMQ.API.SCHEME}://{$RABBITMQ.API.USER}:{$RABBITMQ.API.PASSWORD}@{$RABBITMQ.API.HOST}:{$RABBITMQ.API.PORT}/api/health/checks/node-is-mirror-sync-critical{#SINGLETON}"])=0 Average
RabbitMQ: There are queues that would lose their quorum and availability if this node is shut down.

It checks if there are queues that could potentially lose data if this node goes offline via API. This is the default API endpoint path: http://{HOST.CONN}:{$RABBITMQ.API.PORT}/api/index.html.

last(/RabbitMQ node by Zabbix agent/web.page.get["{$RABBITMQ.API.SCHEME}://{$RABBITMQ.API.USER}:{$RABBITMQ.API.PASSWORD}@{$RABBITMQ.API.HOST}:{$RABBITMQ.API.PORT}/api/health/checks/node-is-quorum-critical{#SINGLETON}"])=0 Average

LLD rule Health Check 3.8.9- discovery

Name Description Type Key and additional info
Health Check 3.8.9- discovery

Specific metrics for the versions: up to and including 3.8.4.

Dependent item rabbitmq.healthcheck.v389.discovery

Preprocessing

  • JSON Path: $.management_version

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

Item prototypes for Health Check 3.8.9- discovery

Name Description Type Key and additional info
RabbitMQ: Healthcheck{#SINGLETON}

It checks whether the RabbitMQ application is running; and whether the channels and queues can be listed successfully; and that no alarms are in effect.

Zabbix agent web.page.get["{$RABBITMQ.API.SCHEME}://{$RABBITMQ.API.USER}:{$RABBITMQ.API.PASSWORD}@{$RABBITMQ.API.HOST}:{$RABBITMQ.API.PORT}/api/healthchecks/node{#SINGLETON}"]

Preprocessing

  • Regular expression: \n\s?\n(.*) \1

  • JSON Path: $.status

  • Boolean to decimal

    ⛔️Custom on fail: Set value to: 0

Trigger prototypes for Health Check 3.8.9- discovery

Name Description Expression Severity Dependencies and additional info
RabbitMQ: Node healthcheck failed

For more details see Health Checks.

last(/RabbitMQ node by Zabbix agent/web.page.get["{$RABBITMQ.API.SCHEME}://{$RABBITMQ.API.USER}:{$RABBITMQ.API.PASSWORD}@{$RABBITMQ.API.HOST}:{$RABBITMQ.API.PORT}/api/healthchecks/node{#SINGLETON}"])=0 Average

LLD rule Queues discovery

Name Description Type Key and additional info
Queues discovery

The metrics for an individual queue.

Dependent item rabbitmq.queues.discovery

Item prototypes for Queues discovery

Name Description Type Key and additional info
RabbitMQ: Queue [{#VHOST}][{#QUEUE}]: Get data

The HTTP API endpoint that returns [{#VHOST}][{#QUEUE}] queue metrics

Dependent item rabbitmq.get_exchanges["{#VHOST}/{#QUEUE}"]

Preprocessing

  • JSON Path: $[?(@.name == "{#QUEUE}" && @.vhost == "{#VHOST}")].first()

RabbitMQ: Queue [{#VHOST}][{#QUEUE}]: Messages

The count of total messages in the queue.

Dependent item rabbitmq.queue.messages["{#VHOST}/{#QUEUE}"]

Preprocessing

  • JSON Path: $.messages

RabbitMQ: Queue [{#VHOST}][{#QUEUE}]: Messages per second

The count of total messages per second in the queue.

Dependent item rabbitmq.queue.messages.rate["{#VHOST}/{#QUEUE}"]

Preprocessing

  • JSON Path: $.messages_details.rate

RabbitMQ: Queue [{#VHOST}][{#QUEUE}]: Consumers

The number of consumers.

Dependent item rabbitmq.queue.consumers["{#VHOST}/{#QUEUE}"]

Preprocessing

  • JSON Path: $.consumers

RabbitMQ: Queue [{#VHOST}][{#QUEUE}]: Memory

The bytes of memory consumed by the Erlang process associated with the queue, including stack, heap and internal structures.

Dependent item rabbitmq.queue.memory["{#VHOST}/{#QUEUE}"]

Preprocessing

  • JSON Path: $.memory

RabbitMQ: Queue [{#VHOST}][{#QUEUE}]: Messages ready

The number of messages ready to be delivered to clients.

Dependent item rabbitmq.queue.messages_ready["{#VHOST}/{#QUEUE}"]

Preprocessing

  • JSON Path: $.messages_ready

RabbitMQ: Queue [{#VHOST}][{#QUEUE}]: Messages ready per second

The number of messages per second ready to be delivered to clients.

Dependent item rabbitmq.queue.messages_ready.rate["{#VHOST}/{#QUEUE}"]

Preprocessing

  • JSON Path: $.messages_ready_details.rate

RabbitMQ: Queue [{#VHOST}][{#QUEUE}]: Messages unacknowledged

The number of messages delivered to clients but not yet acknowledged.

Dependent item rabbitmq.queue.messages_unacknowledged["{#VHOST}/{#QUEUE}"]

Preprocessing

  • JSON Path: $.messages_unacknowledged

RabbitMQ: Queue [{#VHOST}][{#QUEUE}]: Messages unacknowledged per second

The number of messages per second delivered to clients but not yet acknowledged.

Dependent item rabbitmq.queue.messages_unacknowledged.rate["{#VHOST}/{#QUEUE}"]

Preprocessing

  • JSON Path: $.messages_unacknowledged_details.rate

RabbitMQ: Queue [{#VHOST}][{#QUEUE}]: Messages acknowledged

The number of messages delivered to clients and acknowledged.

Dependent item rabbitmq.queue.messages.ack["{#VHOST}/{#QUEUE}"]

Preprocessing

  • JSON Path: $.message_stats.ack

    ⛔️Custom on fail: Set value to: 0

RabbitMQ: Queue [{#VHOST}][{#QUEUE}]: Messages acknowledged per second

The number of messages (per second) delivered to clients and acknowledged.

Dependent item rabbitmq.queue.messages.ack.rate["{#VHOST}/{#QUEUE}"]

Preprocessing

  • JSON Path: $.message_stats.ack_details.rate

    ⛔️Custom on fail: Set value to: 0

RabbitMQ: Queue [{#VHOST}][{#QUEUE}]: Messages delivered

The count of messages delivered to consumers in acknowledgement mode.

Dependent item rabbitmq.queue.messages.deliver["{#VHOST}/{#QUEUE}"]

Preprocessing

  • JSON Path: $.message_stats.deliver

    ⛔️Custom on fail: Set value to: 0

RabbitMQ: Queue [{#VHOST}][{#QUEUE}]: Messages delivered per second

The count of messages (per second) delivered to consumers in acknowledgement mode.

Dependent item rabbitmq.queue.messages.deliver.rate["{#VHOST}/{#QUEUE}"]

Preprocessing

  • JSON Path: $.message_stats.deliver_details.rate

    ⛔️Custom on fail: Set value to: 0

RabbitMQ: Queue [{#VHOST}][{#QUEUE}]: Sum of messages delivered

The sum of messages delivered to consumers: in acknowledgement mode and in no-acknowledgement mode; delivered to consumers in response to the basic.get: in acknowledgement mode and in no-acknowledgement mode.

Dependent item rabbitmq.queue.messages.deliver_get["{#VHOST}/{#QUEUE}"]

Preprocessing

  • JSON Path: $.message_stats.deliver_get

    ⛔️Custom on fail: Set value to: 0

RabbitMQ: Queue [{#VHOST}][{#QUEUE}]: Sum of messages delivered per second

The rate of delivery per second. The sum of messages delivered (per second) to consumers: in acknowledgement mode and in no-acknowledgement mode; delivered to consumers in response to basic.get: in acknowledgement mode and in no-acknowledgement mode.

Dependent item rabbitmq.queue.messages.deliver_get.rate["{#VHOST}/{#QUEUE}"]

Preprocessing

  • JSON Path: $.message_stats.deliver_get_details.rate

    ⛔️Custom on fail: Set value to: 0

RabbitMQ: Queue [{#VHOST}][{#QUEUE}]: Messages published

The count of published messages.

Dependent item rabbitmq.queue.messages.publish["{#VHOST}/{#QUEUE}"]

Preprocessing

  • JSON Path: $.message_stats.publish

    ⛔️Custom on fail: Set value to: 0

RabbitMQ: Queue [{#VHOST}][{#QUEUE}]: Messages published per second

The rate of published messages per second.

Dependent item rabbitmq.queue.messages.publish.rate["{#VHOST}/{#QUEUE}"]

Preprocessing

  • JSON Path: $.message_stats.publish_details.rate

    ⛔️Custom on fail: Set value to: 0

RabbitMQ: Queue [{#VHOST}][{#QUEUE}]: Messages redelivered

The count of subset of messages in the deliver_get queue with the redelivered flag set.

Dependent item rabbitmq.queue.messages.redeliver["{#VHOST}/{#QUEUE}"]

Preprocessing

  • JSON Path: $.message_stats.redeliver

    ⛔️Custom on fail: Set value to: 0

RabbitMQ: Queue [{#VHOST}][{#QUEUE}]: Messages redelivered per second

The rate of messages redelivered per second.

Dependent item rabbitmq.queue.messages.redeliver.rate["{#VHOST}/{#QUEUE}"]

Preprocessing

  • JSON Path: $.message_stats.redeliver_details.rate

    ⛔️Custom on fail: Set value to: 0

Trigger prototypes for Queues discovery

Name Description Expression Severity Dependencies and additional info
RabbitMQ: Too many messages in queue [{#VHOST}][{#QUEUE}] min(/RabbitMQ node by Zabbix agent/rabbitmq.queue.messages["{#VHOST}/{#QUEUE}"],5m)>{$RABBITMQ.MESSAGES.MAX.WARN:"{#QUEUE}"} Warning

Feedback

Please report any issues with the template at https://support.zabbix.com

You can also provide feedback, discuss the template, or ask for help at ZABBIX forums

Articles and documentation

+ Propose new article

Não encontrou a integração que vocá precisa?