summaryrefslogtreecommitdiff
path: root/ATRI/plugins/status
diff options
context:
space:
mode:
Diffstat (limited to 'ATRI/plugins/status')
-rw-r--r--ATRI/plugins/status/__init__.py20
-rw-r--r--ATRI/plugins/status/data_source.py47
2 files changed, 40 insertions, 27 deletions
diff --git a/ATRI/plugins/status/__init__.py b/ATRI/plugins/status/__init__.py
index 05ece79..ae7702a 100644
--- a/ATRI/plugins/status/__init__.py
+++ b/ATRI/plugins/status/__init__.py
@@ -1,21 +1,22 @@
+from ATRI.log import logger as log
from ATRI.utils.apscheduler import scheduler
-from .data_source import IsSurvive
+from .data_source import Status
-ping = IsSurvive().on_command("/ping", "检测bot简单信息处理速度")
+ping = Status().on_command("/ping", "检测bot简单信息处理速度")
@ping.handle()
-async def _ping():
- await ping.finish(IsSurvive.ping())
+async def _():
+ await ping.finish(Status.ping())
-status = IsSurvive().on_command("/status", "查看运行资源占用")
+status = Status().on_command("/status", "查看运行资源占用")
@status.handle()
-async def _status():
- msg, _ = IsSurvive.get_status()
+async def _():
+ msg, _ = Status.get_status()
await status.finish(msg)
@@ -23,7 +24,8 @@ info_msg = "アトリは高性能ですから!"
@scheduler.scheduled_job("interval", name="状态检查", minutes=10, misfire_grace_time=15) # type: ignore
-async def _check_runtime():
- msg, stat = IsSurvive().get_status()
+async def _():
+ log.info("开始检查资源消耗...")
+ msg, stat = Status().get_status()
if not stat:
await status.finish(msg)
diff --git a/ATRI/plugins/status/data_source.py b/ATRI/plugins/status/data_source.py
index 3595c0c..ddd3568 100644
--- a/ATRI/plugins/status/data_source.py
+++ b/ATRI/plugins/status/data_source.py
@@ -1,9 +1,9 @@
+import os
import time
import psutil
from datetime import datetime
from ATRI.service import Service
-from ATRI.log import logger as log
from ATRI.rule import is_in_service
from ATRI.exceptions import GetStatusError
@@ -11,19 +11,20 @@ from ATRI.exceptions import GetStatusError
_status_msg = """
> Status Overview
-[CPU: {cpu}%]
-[Memory: {mem}%]
-[Disk usage: {disk}%]
+[CPU: {p_cpu}% of {b_cpu}]
+[Memory: {p_mem}% of {b_mem}]
+[Disk usage: {p_disk}%]
[Net sent: {inteSENT}MB]
[Net recv: {inteRECV}MB]
-[Runtime: {up_time}]
+[Bot runtime: {bot_time}]
+[Platform runtime: {boot_time}]
{msg}
""".strip()
-class IsSurvive(Service):
+class Status(Service):
def __init__(self):
Service.__init__(self, "状态", "检查自身状态", rule=is_in_service("状态"))
@@ -32,21 +33,29 @@ class IsSurvive(Service):
return "I'm fine."
@staticmethod
- def get_status():
- log.info("开始检查资源消耗...")
+ def get_status() -> tuple:
try:
cpu = psutil.cpu_percent(interval=1)
mem = psutil.virtual_memory().percent
disk = psutil.disk_usage("/").percent
- inteSENT = psutil.net_io_counters().bytes_sent / 1000000 # type: ignore
- inteRECV = psutil.net_io_counters().bytes_recv / 1000000 # type: ignore
+ inte_send = psutil.net_io_counters().bytes_sent / 1000000 # type: ignore
+ inte_recv = psutil.net_io_counters().bytes_recv / 1000000 # type: ignore
+
+ process = psutil.Process(os.getpid())
+ b_cpu = process.cpu_percent(interval=1)
+ b_mem = process.memory_percent(memtype="rss")
now = time.time()
boot = psutil.boot_time()
- up_time = str(
+ b = process.create_time()
+ boot_time = str(
datetime.utcfromtimestamp(now).replace(microsecond=0)
- datetime.utcfromtimestamp(boot).replace(microsecond=0)
)
+ bot_time = str(
+ datetime.utcfromtimestamp(now).replace(microsecond=0)
+ - datetime.utcfromtimestamp(b).replace(microsecond=0)
+ )
except GetStatusError:
raise GetStatusError("Failed to get status.")
@@ -64,16 +73,18 @@ class IsSurvive(Service):
msg = "咱感觉身体要被塞满了..."
is_ok = False
else:
- log.info("资源占用正常")
is_ok = True
msg0 = _status_msg.format(
- cpu=cpu,
- mem=mem,
- disk=disk,
- inteSENT=inteSENT,
- inteRECV=inteRECV,
- up_time=up_time,
+ p_cpu=cpu,
+ p_mem=mem,
+ p_disk=disk,
+ b_cpu=f"{b_cpu}%",
+ b_mem="%.1f%%" % b_mem,
+ inteSENT=inte_send,
+ inteRECV=inte_recv,
+ bot_time=bot_time,
+ boot_time=boot_time,
msg=msg,
)