Files
EasyGoAdmin_GoFrame_EleVue/document/wiki/06_监控体系与在线用户.txt
T
2026-10-20 11:37:25 +08:00

143 lines
9.4 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
================================================================================
EasyGoAdmin 后端开发者文档 · 06 监控体系与在线用户
================================================================================
monitor 域共 7 个模块:operation_log、login_log、job、job_log(四张表)+
online_user、server_monitor、cache_monitor(三个无表模块)。
job/job_log 的调度机制见 09 章;本章聚焦监控与在线用户。
--------------------------------------------------------------------------------
1. 在线用户(logic/online_user.go,无表,数据源 Redis)
--------------------------------------------------------------------------------
1.1 数据结构(见 03 章第 10 节)
zset easygoadmin:online:jti:set score = 访问令牌过期时间戳
键 easygoadmin:online:info:{jti} JSON 详情(TTL = access 剩余期 + 60s)
onlineInfo 字段:jti/userId/username/realname/ip/location/oss/browser/
loginTime/issuedAt/expireAt/refreshJti/refreshIssuedAt/refreshExpireAt/
accessToken/refreshToken(令牌原文,仅详情查看返回)/tokenType/expiresIn
1.2 登记与注销
MarkOnline(登录成功、refresh 轮换后调用):写详情键 + ZAdd zset。
MarkOffline(登出、强退后调用):ZRem + Del。
过期令牌由 zset score 区间过滤自然淘汰(查询只取 score ≥ now 的成员)。
1.3 接口
GET /api/onlineUser/page perm sys:onlineUser:page
流程:ZRangeByScore(now..+∞) → 逐 jti 读详情 → username/ip 子串过滤
→ 按登录时间倒序 → 同用户多会话标注(SessionNo/Sessions 序号与总数)
→ 批量回填头像(按 userId 查 user.avatar,GetFileUrl 补域名,单用户只查一次)
→ 内存分页(NewPageData)。
GET /api/onlineUser/detail/:id perm sys:onlineUser:detail
按 jti 返回完整信息(含令牌原文)。
GET /api/onlineUser/forceLogout/:id perm sys:onlineUser:forceLogout
单会话强退:access jti 拉黑(TTL=剩余期+60s)+ refresh jti 一并拉黑
(防被踢会话经 refresh 换新令牌复活)+ MarkOffline。
GET /api/onlineUser/forceLogoutUser/:userId 同权限
踢出该用户全部设备:遍历 zset 匹配 userId,逐会话双令牌拉黑 + 注销。
1.4 无心跳/续期机制:会话有效期即 access 令牌有效期(2h);
前端 refresh 轮换会刷新在线登记(MarkOnline 覆盖写)。
1.5 在线会话生命周期图
登录/refresh 成功
│ MarkOnline
▼
┌─────────────────────────────────────────────┐
│ zset easygoadmin:online:jti:set │ score=access过期ts
│ 键 easygoadmin:online:info:{jti} = JSON │ TTL=access剩余+60s
└──────────────────┬──────────────────────────┘
页面访问(有效期内)│ │登出 Logout / 强退 ForceLogout
(token 有效,│ ▼ MarkOffline + access/refresh 双拉黑
JWT 放行) │ zset 移除 + info 删除 → 会话消失
▼
access 到期:zset score < now 被区间过滤(列表不可见);
info 键 TTL 到期自动清除
refresh 到期:无法再换新令牌
查询视图(Page)= zset(score≥now) × info 详情 × username/ip 过滤 × 内存分页
--------------------------------------------------------------------------------
2. 服务器监控(logic/server_monitor.go + server_monitor_windows/other.go)
--------------------------------------------------------------------------------
GET /api/server/info(登录即可,log "服务器监控-查询信息")
返回 ServerInfoRes:
Server hostname / goVersion / arch / numCPU / goroutines / uptime
(procStart 为包加载时刻)
Mem allocMB / totalAllocMB / sysMB / heapAllocMB / heapSysMB /
heapObjects / gccycles(runtime.ReadMemStats,MB 保留两位小数)
Disk 平台分支实现:
windows(//go:build windows):GetDiskFreeSpaceEx 读工作目录所在盘符
(wd[:3] 如 "E:\"),返回 totalGB/freeGB/usedPercent
other(!windows):syscall.Statfs
Db SELECT VERSION() 计时(pingMs)+ 版本号;数据库不通不视为整体失败
(版本留空,err 置 nil 返回)
Cache cache.UsingMemory() → {mode:"memory", connected:false}
否则 Redis PING → {mode:"redis", connected:true/false}
Scheduler 调度器健康:统计 gcron 中 "job:" 前缀条目数(mounted)与
goframe_job status=1 计数(expected);enabled=DaemonInit 已执行;
healthy = mounted >= expected(挂载失败或数据被外部改动会出现差值)
--------------------------------------------------------------------------------
3. 缓存监控(logic/cache_monitor.go,无表)
--------------------------------------------------------------------------------
GET /api/cache/info(登录即可,log "缓存监控-查询信息")
内存降级(cache.UsingMemory())→ {mode:"memory", connected:false},仅返回模式标识。
Redis 模式:依次 INFO server/memory/stats/clients/keyspace + DBSIZE,
解析(parseRedisInfo:# 注释行跳过,k:v 映射):
version / uptime / usedMemory / usedMemoryPeak / maxMemory / fragRatio /
connectedClients / expiredKeys / evictedKeys / totalCommands / totalConns /
hits / misses / hitRate(hits/(hits+misses),两位小数)/ keys(DBSIZE)/
keySpace[](每 db 的 keys/expires)
任一 INFO 失败 → connected=false 返回已解析部分。
--------------------------------------------------------------------------------
4. 操作日志(表 goframe_operation_log,采集见 02 章)
--------------------------------------------------------------------------------
4.1 写入:中间件异步批量落库(LogSink),记录 Title/Type/Method/URL/Param(脱敏)/
Result(截断 8KB)/IP/Location/OS/Browser/ConsumeTime/Status/Error/CreateUser。
4.2 查询模块(/api/oper/log,仅 page/list/detail/delete/batchDelete,无增改):
perm sys:operLog:{page|list|detail|delete|batchDelete}。
4.3 log_type 固定枚举(consts/log_type.go,前端按此映射显示,数值勿改):
0=自动推断 1=新增 2=修改 3=删除 4=查询 5=导入 6=导出
7=审批 8=驳回 9=提交 10=撤回 11=关闭 12=开启 13=启用 14=禁用
15=上传 16=下载 17=发送 18=同步 19=代码生成 20=清空 21=还原
22=登录 23=登出 24=重置 25=分配 26=授权 27=执行 28=暂停 29=恢复
30=发布 31=下架 32=复制 33=移动 34=排序 35=锁定 36=解锁
37=归档 38=取消归档 39=绑定 40=解绑 99=其他
gmeta logType 字符串 → 枚举经 LogTypeMap;展示中文经 LogTypeNames
(logic 的 LogTypeText,该字段不走字典)。
4.4 清理:内置 LogClean 定时任务物理删除超保留期记录(见 09 章)。
--------------------------------------------------------------------------------
5. 登录日志(表 goframe_login_log,业务写入)
--------------------------------------------------------------------------------
写入方:logic/auth.go writeLoginLog——登录成功/失败(log_type=1,
失败 status=1 存 error,code 脱敏 ***)、退出(log_type=2)。
记录字段:username/log_type/source(0 后台)/method/request_method/url/param/
result(成功|失败)/ip/location(ip2region)/os/browser/consume_time/status/error。
查询模块:/api/login/log(page/list/detail/delete/batchDelete),
perm sys:loginLog:*;同样受 LogClean 清理。
--------------------------------------------------------------------------------
6. 任务日志(表 goframe_job_log)
--------------------------------------------------------------------------------
写入方:调度器 executeJob 每次执行后写入(create_user="daemon"):
job_id/job_name/job_group/job_trigger/job_message/cron_expression/status
(0 成功 1 失败)/start_time/end_time/consume_time(毫秒)/exception_info
查询模块:/api/job/log(page/list/detail/delete/batchDelete),perm sys:jobLog:*。
--------------------------------------------------------------------------------
7. 监控相关配置与运维入口
--------------------------------------------------------------------------------
operationLog.enable / operationLog.logQuery 操作日志开关(见 02 章)
job.logRetentionDays(默认 90) 三张日志表保留天数(LogClean 消费)
ip2region.path 归属地库路径
api.proxyIps 受信代理(影响 IP 与归属地准确性)
运维排障速查:
调度器异常 GET /api/job/daemonStatus(running/jobIds/startTime)
GET /api/server/info 的 Scheduler 字段(mounted vs expected)
缓存降级 GET /api/cache/info mode=memory(Redis 不可用,限流/锁退化单机)
在线人数 GET /api/onlineUser/page total
日志缺失 检查 operationLog.enable、通道满丢弃告警日志、LogSink 是否注册