143 lines
9.4 KiB
Plaintext
143 lines
9.4 KiB
Plaintext
================================================================================
|
||
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 是否注册
|