fix: 为 WebProbe 增加物理内存门禁
This commit is contained in:
@@ -569,24 +569,50 @@ def collect_process_pressure(patterns):
|
||||
}
|
||||
|
||||
def collect_memory_snapshot():
|
||||
result = command(["free", "-b"], 5)
|
||||
if result["exitCode"] != 0:
|
||||
return {"ok": False, "error": "free-failed", "command": bounded(result)}
|
||||
memory = {}
|
||||
for line in result["stdout"].splitlines():
|
||||
parts = line.split()
|
||||
if parts and parts[0].rstrip(":") == "Mem" and len(parts) >= 7:
|
||||
memory = {
|
||||
"totalBytes": safe_int(parts[1]),
|
||||
"usedBytes": safe_int(parts[2]),
|
||||
"freeBytes": safe_int(parts[3]),
|
||||
"availableBytes": safe_int(parts[6]),
|
||||
"totalHuman": fmt_bytes(parts[1]),
|
||||
"usedHuman": fmt_bytes(parts[2]),
|
||||
"availableHuman": fmt_bytes(parts[6]),
|
||||
}
|
||||
break
|
||||
return {"ok": bool(memory), "memory": memory, "command": bounded(result)}
|
||||
source = "/proc/meminfo"
|
||||
fields = {}
|
||||
try:
|
||||
with open(source, "r", encoding="utf-8") as handle:
|
||||
for line in handle:
|
||||
if ":" not in line:
|
||||
continue
|
||||
key, raw = line.split(":", 1)
|
||||
parts = raw.strip().split()
|
||||
if not parts:
|
||||
continue
|
||||
fields[key] = safe_int(parts[0]) * 1024
|
||||
except OSError as exc:
|
||||
return {
|
||||
"ok": False,
|
||||
"error": "proc-meminfo-read-failed",
|
||||
"metric": "MemAvailable",
|
||||
"source": source,
|
||||
"swapExcluded": True,
|
||||
"errorType": type(exc).__name__,
|
||||
}
|
||||
available_bytes = fields.get("MemAvailable")
|
||||
if available_bytes is None:
|
||||
return {
|
||||
"ok": False,
|
||||
"error": "memavailable-missing",
|
||||
"metric": "MemAvailable",
|
||||
"source": source,
|
||||
"swapExcluded": True,
|
||||
}
|
||||
total_bytes = fields.get("MemTotal")
|
||||
memory = {
|
||||
"totalBytes": total_bytes,
|
||||
"availableBytes": available_bytes,
|
||||
"totalHuman": fmt_bytes(total_bytes) if total_bytes is not None else None,
|
||||
"availableHuman": fmt_bytes(available_bytes),
|
||||
}
|
||||
return {
|
||||
"ok": True,
|
||||
"metric": "MemAvailable",
|
||||
"source": source,
|
||||
"swapExcluded": True,
|
||||
"memory": memory,
|
||||
}
|
||||
|
||||
def observe_run_record(path, stale_hours):
|
||||
stat = os.stat(path)
|
||||
@@ -1795,6 +1821,23 @@ def remote_policy_install_payload(observed_at):
|
||||
|
||||
def main():
|
||||
observed_at = now_iso()
|
||||
if ACTION == "memory":
|
||||
memory = collect_memory_snapshot()
|
||||
emit_json({
|
||||
"ok": memory.get("ok") is True,
|
||||
"action": "gc remote memory",
|
||||
"providerId": PROVIDER_ID,
|
||||
"dryRun": True,
|
||||
"mutation": False,
|
||||
"observedAt": observed_at,
|
||||
"metric": memory.get("metric"),
|
||||
"source": memory.get("source"),
|
||||
"swapExcluded": memory.get("swapExcluded") is True,
|
||||
"memory": memory.get("memory"),
|
||||
"error": memory.get("error"),
|
||||
"valuesRedacted": True,
|
||||
}, persist_large=False)
|
||||
return 0
|
||||
preflight = cluster_preflight()
|
||||
if ACTION == "policy-plan":
|
||||
emit_json(remote_policy_plan_payload(observed_at), persist_large=False)
|
||||
|
||||
Reference in New Issue
Block a user