Add configuration for Prometheus node exporter and SMTP monitoring in PMG. Updated README and added verification checks for new metrics.
This commit is contained in:
@@ -0,0 +1,98 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
outfile="/var/lib/prometheus/node-exporter/pmg_smtp.prom"
|
||||
tmpfile="$(mktemp)"
|
||||
now_epoch="$(date +%s)"
|
||||
window_seconds={{ smtp_log_window_seconds | int }}
|
||||
|
||||
if [ "${window_seconds}" -lt 60 ]; then
|
||||
window_seconds=60
|
||||
fi
|
||||
|
||||
get_established_count() {
|
||||
local port="$1"
|
||||
ss -Htn state established "( sport = :${port} )" 2>/dev/null | awk 'END { print NR + 0 }'
|
||||
}
|
||||
|
||||
get_listen_up() {
|
||||
local port="$1"
|
||||
if ss -Hln "( sport = :${port} )" 2>/dev/null | awk 'END { exit(NR > 0 ? 0 : 1) }'; then
|
||||
echo "1"
|
||||
else
|
||||
echo "0"
|
||||
fi
|
||||
}
|
||||
|
||||
queue_total="$(postqueue -j 2>/dev/null | awk 'END { print NR + 0 }')"
|
||||
queue_deferred="$(postqueue -j 2>/dev/null | awk -F'"' '/"queue_name":/ { if ($4 == "deferred") c++ } END { print c + 0 }')"
|
||||
if command -v jq >/dev/null 2>&1; then
|
||||
oldest_queue_epoch="$(postqueue -j 2>/dev/null | jq -sr 'map(.arrival_time // empty) | if length == 0 then 0 else min end' 2>/dev/null || echo "0")"
|
||||
else
|
||||
oldest_queue_epoch="0"
|
||||
fi
|
||||
|
||||
if [ "${oldest_queue_epoch}" -gt 0 ] 2>/dev/null; then
|
||||
queue_oldest_age_seconds="$(( now_epoch - oldest_queue_epoch ))"
|
||||
if [ "${queue_oldest_age_seconds}" -lt 0 ]; then
|
||||
queue_oldest_age_seconds=0
|
||||
fi
|
||||
else
|
||||
queue_oldest_age_seconds=0
|
||||
fi
|
||||
|
||||
log_slice="$(journalctl --no-pager -o cat --since "-${window_seconds} sec" 2>/dev/null || true)"
|
||||
smtp_connections_recent="$(printf '%s\n' "${log_slice}" | grep -Ec 'postfix/smtpd.*connect from' || true)"
|
||||
smtp_received_recent="$(printf '%s\n' "${log_slice}" | grep -Ec 'postfix/qmgr.*: .*: from=<' || true)"
|
||||
smtp_sent_recent="$(printf '%s\n' "${log_slice}" | grep -Ec 'status=sent' || true)"
|
||||
smtp_deferred_recent="$(printf '%s\n' "${log_slice}" | grep -Ec 'status=deferred' || true)"
|
||||
smtp_bounced_recent="$(printf '%s\n' "${log_slice}" | grep -Ec 'status=bounced' || true)"
|
||||
smtp_rejected_recent="$(printf '%s\n' "${log_slice}" | grep -Ec 'NOQUEUE: reject:| reject:' || true)"
|
||||
smtp_tls_fail_recent="$(printf '%s\n' "${log_slice}" | grep -Eci '(tls|starttls).*(fail|error|warning|lost)' || true)"
|
||||
|
||||
{
|
||||
echo "# HELP pmg_postfix_queue_messages_total Number of messages in Postfix queue."
|
||||
echo "# TYPE pmg_postfix_queue_messages_total gauge"
|
||||
echo "pmg_postfix_queue_messages_total ${queue_total}"
|
||||
echo "# HELP pmg_postfix_queue_deferred_messages Number of deferred messages in Postfix queue."
|
||||
echo "# TYPE pmg_postfix_queue_deferred_messages gauge"
|
||||
echo "pmg_postfix_queue_deferred_messages ${queue_deferred}"
|
||||
echo "# HELP pmg_postfix_queue_oldest_age_seconds Age of oldest queued message in seconds."
|
||||
echo "# TYPE pmg_postfix_queue_oldest_age_seconds gauge"
|
||||
echo "pmg_postfix_queue_oldest_age_seconds ${queue_oldest_age_seconds}"
|
||||
echo "# HELP pmg_smtp_metrics_window_seconds Time window in seconds used for recent SMTP counters."
|
||||
echo "# TYPE pmg_smtp_metrics_window_seconds gauge"
|
||||
echo "pmg_smtp_metrics_window_seconds ${window_seconds}"
|
||||
echo "# HELP pmg_smtp_connections_recent Number of SMTP connections observed in recent window."
|
||||
echo "# TYPE pmg_smtp_connections_recent gauge"
|
||||
echo "pmg_smtp_connections_recent ${smtp_connections_recent}"
|
||||
echo "# HELP pmg_smtp_received_recent Number of received messages observed in recent window."
|
||||
echo "# TYPE pmg_smtp_received_recent gauge"
|
||||
echo "pmg_smtp_received_recent ${smtp_received_recent}"
|
||||
echo "# HELP pmg_smtp_sent_recent Number of sent messages observed in recent window."
|
||||
echo "# TYPE pmg_smtp_sent_recent gauge"
|
||||
echo "pmg_smtp_sent_recent ${smtp_sent_recent}"
|
||||
echo "# HELP pmg_smtp_deferred_recent Number of deferred deliveries observed in recent window."
|
||||
echo "# TYPE pmg_smtp_deferred_recent gauge"
|
||||
echo "pmg_smtp_deferred_recent ${smtp_deferred_recent}"
|
||||
echo "# HELP pmg_smtp_bounced_recent Number of bounced deliveries observed in recent window."
|
||||
echo "# TYPE pmg_smtp_bounced_recent gauge"
|
||||
echo "pmg_smtp_bounced_recent ${smtp_bounced_recent}"
|
||||
echo "# HELP pmg_smtp_rejected_recent Number of rejected SMTP attempts observed in recent window."
|
||||
echo "# TYPE pmg_smtp_rejected_recent gauge"
|
||||
echo "pmg_smtp_rejected_recent ${smtp_rejected_recent}"
|
||||
echo "# HELP pmg_smtp_tls_failures_recent Number of TLS/STARTTLS failures observed in recent window."
|
||||
echo "# TYPE pmg_smtp_tls_failures_recent gauge"
|
||||
echo "pmg_smtp_tls_failures_recent ${smtp_tls_fail_recent}"
|
||||
echo "# HELP pmg_smtp_port_listen_up SMTP listen status on port (1 up, 0 down)."
|
||||
echo "# TYPE pmg_smtp_port_listen_up gauge"
|
||||
echo "# HELP pmg_smtp_port_established_connections Established SMTP connections on port."
|
||||
echo "# TYPE pmg_smtp_port_established_connections gauge"
|
||||
{% for port in smtp_ports %}
|
||||
echo "pmg_smtp_port_listen_up{port=\"{{ port }}\"} $(get_listen_up {{ port }})"
|
||||
echo "pmg_smtp_port_established_connections{port=\"{{ port }}\"} $(get_established_count {{ port }})"
|
||||
{% endfor %}
|
||||
} > "${tmpfile}"
|
||||
|
||||
mv "${tmpfile}" "${outfile}"
|
||||
chmod 0644 "${outfile}"
|
||||
Reference in New Issue
Block a user