签入脚本
This commit is contained in:
@@ -0,0 +1,142 @@
|
||||
================================================================================
|
||||
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 是否注册
|
||||
Reference in New Issue
Block a user