12 Commits

Author SHA1 Message Date
9225e745b0 Handle division by zero possibility
* When no I/O activity has been reported in pg_statio_all_tables for a
  database, the queries resulted in a division by zero. Cange this to a
  NULL instead.  Still a problem for Zabbix, but maybe a little cleaner.
2025-06-17 01:16:57 -04:00
b981a9ad36 Add slot lag metrics 2025-06-16 00:56:14 -04:00
c0185d4b86 Remove extra quotes in replication slot query 2025-06-15 02:20:45 -04:00
d34dfc5bf7 Fix replication monitoring queries 2025-06-15 02:19:10 -04:00
7c395a80fe Add metrics for tracking cache hit ratios 2025-06-13 01:16:24 -04:00
8fe81e3ab3 Fix global variable placement 2025-06-04 12:49:35 -04:00
cfe01eb63e Fix typo in latest version Zabbix item 2025-06-04 01:44:25 -04:00
55b9b16deb Install to /usr/bin
* Standardize all install methods to use /usr/bin rather than some of
  them using /usr/local/bin

* Make the init script executable in install-openrc
2025-06-04 01:16:59 -04:00
6a22597f1f Fix ID age query and template 2025-06-04 00:47:51 -04:00
295d1d6310 Fix typo in install-openrc 2025-06-03 19:38:59 -04:00
8b804f3912 Add requests as a dependency, split install target
* Add requests as a dependency on all OSs

* Split the install target into a common target and separate
  install-systemd and install-openrc targets to support installing on
  Alpine
2025-06-03 19:34:58 -04:00
bc9e039cb3 Fix Gentoo package prefix, update ebuild 2025-06-03 12:46:09 -04:00
10 changed files with 331 additions and 44 deletions

View File

@@ -3,7 +3,7 @@ Version: 1.0
Section: utils
Priority: optional
Architecture: all
Depends: logrotate, python3 (>= 3.6), python3-psycopg2, python3-yaml, systemd
Depends: logrotate, python3 (>= 3.6), python3-psycopg2, python3-requests, python3-yaml, systemd
Maintainer: James Campbell <james@commandprompt.com>
Homepage: https://www.commandprompt.com
Description: A bridge to sit between monitoring tools and PostgreSQL

74
GENTOO/pgmon-1.0.3.ebuild Normal file
View File

@@ -0,0 +1,74 @@
# Copyright 2024 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=8
PYTHON_COMPAT=( python3_{6..13} )
inherit python-r1 systemd
DESCRIPTION="PostgreSQL monitoring bridge"
HOMEPAGE="None"
LICENSE="BSD"
SLOT="0"
KEYWORDS="amd64"
SRC_URI="https://code2.shh-dot-com.org/james/${PN}/releases/download/v${PV}/${P}.tar.bz2"
IUSE="-systemd"
DEPEND="
${PYTHON_DEPS}
dev-python/psycopg:2
dev-python/pyyaml
dev-python/requests
app-admin/logrotate
"
RDEPEND="${DEPEND}"
BDEPEND=""
#RESTRICT="fetch"
#S="${WORKDIR}/${PN}"
#pkg_nofetch() {
# einfo "Please download"
# einfo " - ${P}.tar.bz2"
# einfo "from ${HOMEPAGE} and place it in your DISTDIR directory."
# einfo "The file should be owned by portage:portage."
#}
src_compile() {
true
}
src_install() {
# Install init script
if ! use systemd ; then
newinitd "openrc/pgmon.initd" pgmon
newconfd "openrc/pgmon.confd" pgmon
fi
# Install systemd unit
if use systemd ; then
systemd_dounit "systemd/pgmon.service"
fi
# Install script
exeinto /usr/bin
newexe "src/pgmon.py" pgmon
# Install default config
diropts -o root -g root -m 0755
insinto /etc/pgmon
doins "sample-config/pgmon.yml"
doins "sample-config/pgmon-metrics.yml"
# Install logrotate config
insinto /etc/logrotate.d
newins "logrotate/pgmon.logrotate" pgmon
# Install man page
doman manpages/pgmon.1
}

View File

@@ -23,7 +23,7 @@ SUPPORTED := ubuntu-20.04 \
# These targets are the main ones to use for most things.
##
.PHONY: all clean tgz test query-tests install
.PHONY: all clean tgz test query-tests install-common install-openrc install-systemd
# Build all packages
@@ -34,7 +34,7 @@ all: $(foreach distro_release, $(SUPPORTED), package-$(distro_release))
.PHONY: package-gentoo
package-gentoo:
mkdir -p $(BUILD_DIR)/gentoo
tar --transform "s,^\.,$(PACKAGE_NAME)-$(VERSION)," -acjf $(BUILD_DIR)/gentoo/$(PACKAGE_NAME)-$(VERSION).tar.bz2 --exclude .gitignore $(shell git ls-tree --full-tree --name-only -r HEAD)
tar --transform "s,^,$(PACKAGE_NAME)-$(VERSION)/," -acjf $(BUILD_DIR)/gentoo/$(PACKAGE_NAME)-$(VERSION).tar.bz2 --exclude .gitignore $(shell git ls-tree --full-tree --name-only -r HEAD)
# Create a deb package
@@ -54,7 +54,7 @@ package-%:
tgz:
rm -rf $(BUILD_DIR)/tgz/root
mkdir -p $(BUILD_DIR)/tgz/root
$(MAKE) install DESTDIR=$(BUILD_DIR)/tgz/root
$(MAKE) install-openrc DESTDIR=$(BUILD_DIR)/tgz/root
tar -cz -f $(BUILD_DIR)/tgz/$(PACKAGE_NAME)-$(VERSION).tgz -C $(BUILD_DIR)/tgz/root .
# Clean up the build directory
@@ -69,18 +69,17 @@ test:
query-tests:
cd tests ; ./run-tests.sh
# Install the script at the specified base directory
install:
# Install the script at the specified base directory (common components)
install-common:
# Set up directories
mkdir -p $(DESTDIR)/etc/$(PACKAGE_NAME)
mkdir -p ${DESTDIR}/etc/logrotate.d
mkdir -p $(DESTDIR)/lib/systemd/system
mkdir -p $(DESTDIR)/usr/local/bin
mkdir -p $(DESTDIR)/usr/bin
mkdir -p $(DESTDIR)/usr/share/man/man1
# Install script
cp $(SCRIPT) $(DESTDIR)/usr/local/bin/$(PACKAGE_NAME)
chmod 755 $(DESTDIR)/usr/local/bin/$(PACKAGE_NAME)
cp $(SCRIPT) $(DESTDIR)/usr/bin/$(PACKAGE_NAME)
chmod 755 $(DESTDIR)/usr/bin/$(PACKAGE_NAME)
# Install manpage
cp manpages/* $(DESTDIR)/usr/share/man/man1/
@@ -89,12 +88,36 @@ install:
# Install sample config
cp sample-config/* $(DESTDIR)/etc/$(PACKAGE_NAME)/
# Install systemd unit files
cp systemd/* $(DESTDIR)/lib/systemd/system/
# Install logrotate config
cp logrotate/${PACKAGE_NAME}.logrotate ${DESTDIR}/etc/logrotate.d/${PACKAGE_NAME}
# Install for systemd
install-systemd:
# Install the common stuff
$(MAKE) install-common
# Set up directories
mkdir -p $(DESTDIR)/lib/systemd/system
# Install systemd unit files
cp systemd/* $(DESTDIR)/lib/systemd/system/
# Install for open-rc
install-openrc:
# Install the common stuff
$(MAKE) install-common
# Set up directories
mkdir -p $(DESTDIR)/etc/init.d
mkdir -p $(DESTDIR)/etc/conf.d
# Install init script
cp openrc/pgmon.initd $(DESTDIR)/etc/init.d/pgmon
chmod 755 $(DESTDIR)/etc/init.d/pgmon
# Install init script config file
cp openrc/pgmon.confd $(DESTDIR)/etc/conf.d/pgmon
# Run all of the install tests
.PHONY: install-tests debian-%-install-test rockylinux-%-install-test ubuntu-%-install-test gentoo-install-test
@@ -167,7 +190,7 @@ package-image-%:
# Debian package creation
actually-package-debian-%:
$(MAKE) install DESTDIR=/output/debian-$*
$(MAKE) install-systemd DESTDIR=/output/debian-$*
cp -r --preserve=mode DEBIAN /output/debian-$*/
dpkg-deb -Zgzip --build /output/debian-$* "/output/$(PACKAGE_NAME)-$(VERSION)-debian-$*.deb"
@@ -182,7 +205,7 @@ actually-package-rockylinux-%:
# Ubuntu package creation
actually-package-ubuntu-%:
$(MAKE) install DESTDIR=/output/ubuntu-$*
$(MAKE) install-systemd DESTDIR=/output/ubuntu-$*
cp -r --preserve=mode DEBIAN /output/ubuntu-$*/
dpkg-deb -Zgzip --build /output/ubuntu-$* "/output/$(PACKAGE_NAME)-$(VERSION)-ubuntu-$*.deb"

View File

@@ -7,7 +7,7 @@ License: MIT
URL: https://www.commandprompt.com
BuildArch: noarch
Requires: logrotate, python, python-psycopg2, PyYAML, systemd
Requires: logrotate, python, python-psycopg2, PyYAML, python-requests, systemd
%description
A bridge to sit between monitoring tools and PostgreSQL
@@ -19,7 +19,7 @@ A bridge to sit between monitoring tools and PostgreSQL
# Do nothing since we have nothing to build
%install
make -C /src install DESTDIR=%{buildroot}
make -C /src install-systemd DESTDIR=%{buildroot}
%files
/etc/logrotate.d/pgmon
@@ -28,7 +28,7 @@ make -C /src install DESTDIR=%{buildroot}
/etc/pgmon/pgmon-service.conf
/lib/systemd/system/pgmon.service
/lib/systemd/system/pgmon@.service
/usr/local/bin/pgmon
/usr/bin/pgmon
/usr/share/man/man1/pgmon.1.gz
%post

View File

@@ -7,7 +7,7 @@ License: MIT
URL: https://www.commandprompt.com
BuildArch: noarch
Requires: logrotate, python3, python3-psycopg2, python3-pyyaml, systemd
Requires: logrotate, python3, python3-psycopg2, python3-pyyaml, python3-requests, systemd
%description
A bridge to sit between monitoring tools and PostgreSQL
@@ -19,7 +19,7 @@ A bridge to sit between monitoring tools and PostgreSQL
# Do nothing since we have nothing to build
%install
make -C /src install DESTDIR=%{buildroot}
make -C /src install-systemd DESTDIR=%{buildroot}
%files
/etc/logrotate.d/pgmon
@@ -28,7 +28,7 @@ make -C /src install DESTDIR=%{buildroot}
/etc/pgmon/pgmon-service.conf
/lib/systemd/system/pgmon.service
/lib/systemd/system/pgmon@.service
/usr/local/bin/pgmon
/usr/bin/pgmon
/usr/share/man/man1/pgmon.1.gz
%post

View File

@@ -19,10 +19,12 @@ metrics:
type: value
query:
0: SHOW server_version_num
max_frozen_age:
type: row
query:
0: SELECT max(age(datfrozenxid)), max(mxid_age(datminmxid)) FROM pg_database
0: SELECT max(age(datfrozenxid)) AS xid_age, 0 AS mxid_age FROM pg_database
90600: SELECT max(age(datfrozenxid)) AS xid_age, max(mxid_age(datminmxid)) AS mxid_age FROM pg_database
# Per-database metrics
db_stats:
@@ -33,6 +35,11 @@ metrics:
test_args:
dbname: postgres
hit_ratios:
type: row
query:
0: SELECT sum(heap_blks_read)::float / NULLIF(sum(heap_blks_read + heap_blks_hit), 0) AS avg_heap_hit_ratio, sum(idx_blks_hit)::float / NULLIF(sum(idx_blks_read + idx_blks_hit), 0) AS avg_idx_hit_ratio, sum(toast_blks_hit)::float / NULLIF(sum(toast_blks_read + toast_blks_hit), 0) AS avg_toast_hit_ratio, sum(tidx_blks_hit)::float / NULLIF(sum(tidx_blks_read + tidx_blks_hit), 0) AS avg_tidx_hit_ratio FROM pg_statio_all_tables
# Debugging
ntables:
type: value
@@ -43,21 +50,15 @@ metrics:
rep_stats:
type: row
query:
90400: SELECT * FROM pg_stat_replication WHERE client_addr || '_' || regexp_replace(application_name, '[ ,]', '_', 'g') = '{repid}'
90400: SELECT pid, usename, EXTRACT(EPOCH FROM backend_start)::integer AS backend_start, state, sent_lsn, write_lsn, flush_lsn, replay_lsn, COALESCE(EXTRACT(EPOCH FROM write_lag), 0)::integer AS write_lag, COALESCE(EXTRACT(EPOCH FROM flush_lag), 0)::integer AS flush_lag, COALESCE(EXTRACT(EPOCH FROM replay_lag), 0)::integer AS replay_lag, sync_state FROM pg_stat_replication WHERE client_addr || '_' || regexp_replace(application_name, '[ ,]', '_', 'g') = %(repid)s
test_args:
repid: 127.0.0.1_test_rep
# Debugging
sleep:
type: value
query:
0: SELECT now(), pg_sleep(5);
# Per-slot metrics
slot_stats:
type: row
query:
90400: SELECT active_pid, xmin, pg_xlog_location_diff(pg_current_xlog_location(), restart_lsn) AS restart_bytes, pg_xlog_location_diff(pg_current_xlog_location(), confirmed_flush_lsn) AS confirmed_flush_bytes FROM pg_replication_slots WHERE slot_name = '{slot}'
100000: SELECT active_pid, xmin, pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn) AS restart_bytes, pg_wal_lsn_diff(pg_current_wal_lsn(), confirmed_flush_lsn) AS confirmed_flush_bytes FROM pg_replication_slots WHERE slot_name = '{slot}'
90400: SELECT active_pid, xmin, pg_xlog_location_diff(pg_current_xlog_location(), restart_lsn) AS restart_bytes, pg_xlog_location_diff(pg_current_xlog_location(), confirmed_flush_lsn) AS confirmed_flush_bytes FROM pg_replication_slots WHERE slot_name = %(slot)s
100000: SELECT active_pid, xmin, pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn) AS restart_bytes, pg_wal_lsn_diff(pg_current_wal_lsn(), confirmed_flush_lsn) AS confirmed_flush_bytes FROM pg_replication_slots WHERE slot_name = %(slot)s
test_args:
slot: test_slot

View File

@@ -518,7 +518,6 @@ def parse_version_rss(raw_rss, release):
This sets these global variables:
latest_version
latest_version_next_check
release_supported
It is expected that the caller already holds the latest_version_lock lock.
@@ -528,7 +527,6 @@ def parse_version_rss(raw_rss, release):
release: The PostgreSQL release we care about (ex: 9.2, 14)
"""
global latest_version
global latest_version_next_check
global release_supported
# Regular expressions for parsing the RSS document
@@ -583,6 +581,8 @@ def get_latest_version():
Get the latest supported version of the major PostgreSQL release running on the server being monitored.
"""
global latest_version_next_check
# If we don't know the latest version or it's past the recheck time, get the
# version from the PostgreSQL RSS feed. Only one thread needs to do this, so
# they all try to grab the lock, and then make sure nobody else beat them to it.
@@ -656,7 +656,11 @@ def test_queries():
# If the metric has arguments to use while testing, grab those
args = metric.get("test_args", {})
# Run the query without the ability to retry.
res = sample_metric(dbname, name, args, retry=False)
try:
res = sample_metric(dbname, name, args, retry=False)
except MetricVersionError:
print("{} -> Unsupported for this version".format(name))
continue
# Compare the result to the provided sample results
# TODO
print("{} -> {}".format(name, res))
@@ -705,12 +709,16 @@ class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
self._reply(
200,
json.dumps(
{"latest": latest_version, "supported": 1 if release_supported else 0}
{
"latest": latest_version,
"supported": 1 if release_supported else 0,
}
),
)
except LatestVersionCheckError as e:
log.error("Failed to retrieve latest version information: {}".format(e))
self._reply(503, "Failed to retrieve latest version info")
return
# Note: parse_qs returns the values as a list. Since we always expect
# single values, just grab the first from each.

View File

@@ -7,7 +7,7 @@ After=network.target
[Service]
EnvironmentFile=/etc/pgmon/%i-service.conf
User=${SERVICE_USER:-postgres}
ExecStart=/usr/local/bin/pgmon -c /etc/pgmon/%i.yml
ExecStart=/usr/bin/pgmon -c /etc/pgmon/%i.yml
ExecReload=kill -HUP $MAINPID
Restart=on-failure
Type=exec

View File

@@ -2,6 +2,7 @@ FROM alpine:3.21
RUN apk update && \
apk add py3-psycopg2 \
py3-requests \
py3-yaml \
tini

View File

@@ -11,6 +11,44 @@ zabbix_export:
groups:
- name: 'My Templates'
items:
- uuid: cc4a50ca681b4c4fb8c1c98f4bc81c96
name: 'Max Frozen MXID Age'
type: DEPENDENT
key: pgmon.age.mxid
delay: '0'
history: 90d
description: 'Maximum age of any frozen MXID in any database'
preprocessing:
- type: JSONPATH
parameters:
- $.mxid_age
- type: MATCHES_REGEX
parameters:
- '^[0-9]+$'
master_item:
key: 'pgmon[max_frozen_age]'
tags:
- tag: Application
value: PostgreSQL
- uuid: 2fa86d8c4a3a481e856a9414c5c70216
name: 'Max Frozen XID Age'
type: DEPENDENT
key: pgmon.age.xid
delay: '0'
history: 90d
description: 'Maximum age of any frozen XID in any database'
preprocessing:
- type: JSONPATH
parameters:
- $.xid_age
- type: MATCHES_REGEX
parameters:
- '^[0-9]+$'
master_item:
key: 'pgmon[max_frozen_age]'
tags:
- tag: Application
value: PostgreSQL
- uuid: de1fa757395440118026f4c7a7c4ebbe
name: 'PostgreSQL latest supported version'
type: DEPENDENT
@@ -66,24 +104,27 @@ zabbix_export:
value_type: TEXT
trends: '0'
description: 'Information about the latest PostgreSQL version in the current series'
url: 'http://localhost:{$AGENT_PORT}/version'
url: 'http://localhost:{$AGENT_PORT}/latest_version_info'
tags:
- tag: Application
value: PostgreSQL
- tag: Type
value: Raw
- uuid: 8706eccb7edc4fa394f552fc31f401a9
name: 'Max Frozen XID Age'
name: 'PostgreSQL ID Age Info'
type: HTTP_AGENT
key: 'pgmon[max_frozen_age]'
history: 90d
description: 'Maximum age of any frozen XID in any database'
preprocessing:
- type: MATCHES_REGEX
parameters:
- '^[0-9]+$'
delay: 5m
history: '0'
value_type: TEXT
trends: '0'
description: 'Maximum age of any frozen XID and MXID in any database'
url: 'http://localhost:{$AGENT_PORT}/max_frozen_age'
tags:
- tag: Application
value: PostgreSQL
- tag: Type
value: Raw
- uuid: ee88f5f4d2384f97946d049af5af4502
name: 'PostgreSQL version'
type: HTTP_AGENT
@@ -636,6 +677,100 @@ zabbix_export:
value: '{#DBNAME}'
- tag: Type
value: Calculated
- uuid: bb0690e123e94e35a9bbd0f05ee322b4
name: 'Database Hit Ratios for {#DBNAME}'
type: HTTP_AGENT
key: 'pgmon_db_hit_ratios[{#DBNAME}]'
history: '0'
value_type: TEXT
trends: '0'
url: 'http://localhost:{$AGENT_PORT}/hit_ratios'
query_fields:
- name: dbname
value: '{#DBNAME}'
tags:
- tag: Application
value: PostgreSQL
- tag: Database
value: '{#DBNAME}'
- tag: Type
value: Raw
- uuid: e0edbaf6f98249a6b357ade2ab41a76a
name: 'Average heap hit ratio on {#DBNAME}'
type: DEPENDENT
key: 'pgmon_db_hit_ratio[heap,{#DBNAME}]'
delay: '0'
history: 90d
value_type: FLOAT
description: 'The cache (shared_buffers) hit ratio for heap entries for the given database'
preprocessing:
- type: JSONPATH
parameters:
- $.avg_heap_hit_ratio
master_item:
key: 'pgmon_db_hit_ratios[{#DBNAME}]'
tags:
- tag: Application
value: PostgreSQL
- tag: Database
value: '{#DBNAME}'
- uuid: e4956d433a47455ca0c00d67a0f59355
name: 'Average index hit ratio on {#DBNAME}'
type: DEPENDENT
key: 'pgmon_db_hit_ratio[index,{#DBNAME}]'
delay: '0'
history: 90d
value_type: FLOAT
description: 'The cache (shared_buffers) hit ratio for index entries for the given database'
preprocessing:
- type: JSONPATH
parameters:
- $.avg_idx_hit_ratio
master_item:
key: 'pgmon_db_hit_ratios[{#DBNAME}]'
tags:
- tag: Application
value: PostgreSQL
- tag: Database
value: '{#DBNAME}'
- uuid: 0335267c14a8410a80a16b38167efcb3
name: 'Average toast hit ratio on {#DBNAME}'
type: DEPENDENT
key: 'pgmon_db_hit_ratio[toast,{#DBNAME}]'
delay: '0'
history: 90d
value_type: FLOAT
description: 'The cache (shared_buffers) hit ratio for heap entries for the given database'
preprocessing:
- type: JSONPATH
parameters:
- $.avg_toast_hit_ratio
master_item:
key: 'pgmon_db_hit_ratios[{#DBNAME}]'
tags:
- tag: Application
value: PostgreSQL
- tag: Database
value: '{#DBNAME}'
- uuid: 3f7da45e351443528c6c36145d38f9b8
name: 'Average toast index hit ratio on {#DBNAME}'
type: DEPENDENT
key: 'pgmon_db_hit_ratio[toast_index,{#DBNAME}]'
delay: '0'
history: 90d
value_type: FLOAT
description: 'The cache (shared_buffers) hit ratio for toast index entries for the given database'
preprocessing:
- type: JSONPATH
parameters:
- $.avg_tidx_hit_ratio
master_item:
key: 'pgmon_db_hit_ratios[{#DBNAME}]'
tags:
- tag: Application
value: PostgreSQL
- tag: Database
value: '{#DBNAME}'
- uuid: 492b3cac15f348c2b85f97b69c114d1b
name: 'Database Stats for {#DBNAME}'
type: HTTP_AGENT
@@ -652,6 +787,8 @@ zabbix_export:
value: PostgreSQL
- tag: Database
value: '{#DBNAME}'
- tag: Type
value: Raw
graph_prototypes:
- uuid: 1f7de43b77714f819e61c31273712b70
name: 'DML Totals for {#DBNAME}'
@@ -949,6 +1086,8 @@ zabbix_export:
value: Replication
- tag: Database
value: '{#DBNAME}'
- tag: Type
value: Raw
url: 'http://localhost:{$AGENT_PORT}/discover_rep'
lld_macro_paths:
- lld_macro: '{#CLIENT_ADDR}'
@@ -963,6 +1102,40 @@ zabbix_export:
key: pgmon_discover_slots
delay: 10m
item_prototypes:
- uuid: 536c5f82e3074ddfbfd842b3a2e8d46c
name: 'Slot {#SLOT_NAME} - Confirmed Flushed Bytes Lag'
type: DEPENDENT
key: 'pgmon_slot[confirmed_flush_bytes,{#SLOT_NAME}]'
delay: '0'
description: 'The lag in bytes for the slot. This metric is how far behind the consumer has reported to be with regard to flushing writes to disk (or equivalent).'
preprocessing:
- type: JSONPATH
parameters:
- $.confirmed_flush_bytes
master_item:
key: 'pgmon_slot_stats[{#SLOT_NAME}]'
tags:
- tag: Application
value: PostgreSQL
- tag: Slot
value: '{#SLOT_NAME}'
- uuid: f239449d8e9e4ce79965528400f1669a
name: 'Slot {#SLOT_NAME} - Restart Bytes Lag'
type: DEPENDENT
key: 'pgmon_slot[restart_bytes,{#SLOT_NAME}]'
delay: '0'
description: 'The lag in bytes for the slot. This metric is how far behind the restart location is, as reported by the consumer.'
preprocessing:
- type: JSONPATH
parameters:
- $.restart_bytes
master_item:
key: 'pgmon_slot_stats[{#SLOT_NAME}]'
tags:
- tag: Application
value: PostgreSQL
- tag: Slot
value: '{#SLOT_NAME}'
- uuid: a9f53efdce0a4bdc970925f8588e01c5
name: 'Replication Slot Stats for {#SLOT_NAME}'
type: HTTP_AGENT
@@ -974,6 +1147,13 @@ zabbix_export:
query_fields:
- name: slot
value: '{#SLOT_NAME}'
tags:
- tag: Application
value: PostgreSQL
- tag: Slot
value: '{#SLOT_NAME}'
- tag: Type
value: Raw
url: 'http://localhost:{$AGENT_PORT}/discover_slots'
lld_macro_paths:
- lld_macro: '{#ACTIVE}'