AzureMonitorAgent/ama_tst/modules/high_cpu_mem/check_usage.py (49 lines of code) (raw):
import time
import subprocess
from error_codes import *
from errors import error_info
from helpers import get_input, run_cmd_output
def find_mdsd_pid():
try:
status = run_cmd_output('systemctl status azuremonitoragent')
status_lines = status.split('\n')
for line in status_lines:
line = line.strip()
if line.startswith('Main PID:'):
pid = line.split()[2]
return (pid, None)
except subprocess.CalledProcessError as e:
return (None, e)
def check_usage(interactive):
if interactive:
print("Checking CPU/memory usage of AMA subcomponents...")
result = get_input("Do you want to monitor the CPU/memory usage of AMA in 5 minutes? (YES/no)", \
(lambda x : x.lower() in ['y','yes','n','no', '']),\
"Please enter 'y'/'yes' to run this check, 'n'/'no' to skip this check. \n")
if result.lower() in ['n', 'no']:
return NO_ERROR
mdsd_pid, e = find_mdsd_pid()
if e != None:
error_info.append((e,))
return ERR_CHECK_STATUS
cmd = "top -b -n1 | grep {0}".format(mdsd_pid)
cpu = []
mem = []
# run 5 minutes to collect min/max/avg usage
for i in range(0, 30):
output = run_cmd_output(cmd)
values = list(filter(None, output.strip().split(" ")))
cpu.append(float(values[8]))
mem.append(float(values[9]))
time.sleep(10)
max_cpu = max(cpu)
min_cpu = min(cpu)
avg_cpu = sum(cpu)/len(cpu)
max_mem = max(mem)
min_mem = min(mem)
avg_mem = sum(mem)/len(mem)
print("--------------------------------------------------------------------------------")
print("CPU usage in the last 5 minutes (%CPU)")
print("Max: ", max_cpu, "Min: ", min_cpu, "Avg: ", "%.1f" % avg_cpu)
print("Memory usage in the last 5 minutes (%MEM)")
print("Max: ", max_mem, "Min: ", min_mem, "Avg: ", "%.1f" % avg_mem)
return NO_ERROR