landing: central container memory/load stats for all three sites
Collect RSS groups, top processes, and loadavg from inside each podman container (not host /proc), merge into performance.memory, show compact labels with cgroup limits and byte tooltips, and cover this in the test suite.
This commit is contained in:
parent
9e0f85024b
commit
78bbd80d1f
11 changed files with 474 additions and 69 deletions
|
|
@ -1,7 +1,17 @@
|
|||
#!/bin/bash
|
||||
# Memory snapshot for landing-stats (source after json_str is defined).
|
||||
# Memory snapshot for landing-stats.
|
||||
# Sets MEM_JSON (fields to embed inside performance.memory).
|
||||
# Also: mem_snapshot_emit → full JSON object on stdout (host collector).
|
||||
# IMPORTANT: no pipelines around the /proc loop (bash subshell loses counters).
|
||||
#
|
||||
# json_str may already be defined by the caller (landing-stats.sh); provide a
|
||||
# safe default so this file is usable stand-alone via podman exec.
|
||||
|
||||
if ! declare -F json_str >/dev/null 2>&1; then
|
||||
json_str() {
|
||||
printf '"%s"' "$(printf '%s' "$1" | sed 's/\\/\\\\/g; s/"/\\"/g' | tr '\n\r\t' ' ')"
|
||||
}
|
||||
fi
|
||||
|
||||
mem_fmt_bytes() {
|
||||
awk -v b="${1:-0}" 'BEGIN{
|
||||
|
|
@ -92,21 +102,39 @@ mem_snapshot_json() {
|
|||
rm -f "$topf"
|
||||
|
||||
lim_json="null"
|
||||
lim_human_json="null"
|
||||
if [[ "$limit_b" =~ ^[0-9]+$ ]] && [ "$limit_b" -gt 0 ]; then
|
||||
lim_json=$limit_b
|
||||
lim_human_json=$(json_str "$(mem_fmt_bytes "$limit_b")")
|
||||
fi
|
||||
cg_json="null"
|
||||
if [[ "$cgroup_b" =~ ^[0-9]+$ ]]; then
|
||||
cg_json=$cgroup_b
|
||||
fi
|
||||
|
||||
# Compact container label: "693.4 MiB" or "693.4 MiB / 2.00 GiB" when capped
|
||||
local ctr_human
|
||||
ctr_human=$(mem_fmt_bytes "$total_b")
|
||||
if [ "$lim_human_json" != "null" ]; then
|
||||
# lim_human_json is a quoted string already
|
||||
:
|
||||
fi
|
||||
|
||||
MEM_JSON="
|
||||
\"container_rss_bytes\": ${total_b},
|
||||
\"container_rss_human\": $(json_str "$(mem_fmt_bytes "$total_b")"),
|
||||
\"container_rss_human\": $(json_str "$ctr_human"),
|
||||
\"container_rss_label\": $(json_str "$(
|
||||
if [ "$lim_json" != "null" ]; then
|
||||
printf '%s / %s' "$ctr_human" "$(mem_fmt_bytes "$limit_b")"
|
||||
else
|
||||
printf '%s' "$ctr_human"
|
||||
fi
|
||||
)"),
|
||||
\"proc_sum_rss_bytes\": ${sum_b},
|
||||
\"proc_sum_rss_human\": $(json_str "$(mem_fmt_bytes "$sum_b")"),
|
||||
\"cgroup_bytes\": ${cg_json},
|
||||
\"cgroup_limit_bytes\": ${lim_json},
|
||||
\"cgroup_limit_human\": ${lim_human_json},
|
||||
\"postgres_rss_bytes\": ${postgres_b},
|
||||
\"postgres_rss_human\": $(json_str "$(mem_fmt_bytes "$postgres_b")"),
|
||||
\"postgres_n\": ${n_pg},
|
||||
|
|
@ -128,3 +156,15 @@ mem_snapshot_json() {
|
|||
\"top\": ${top_json}
|
||||
"
|
||||
}
|
||||
|
||||
# Full JSON for host collector: { ok, loadavg, memory: {…} }
|
||||
mem_snapshot_emit() {
|
||||
mem_snapshot_json || return 1
|
||||
local loadavg=""
|
||||
if [ -r /proc/loadavg ]; then
|
||||
loadavg=$(awk '{print $1","$2","$3}' /proc/loadavg)
|
||||
fi
|
||||
printf '{\n "ok": true,\n "source": "mem-snapshot",\n "loadavg": %s,\n "memory": {\n%s\n }\n}\n' \
|
||||
"$(json_str "$loadavg")" \
|
||||
"$MEM_JSON"
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue