概览 —— 这个页面做什么
服务概览 是「服务」顶级菜单的第一个页面(/service),是一块 面向在运行服务(守护进程)的精选实时运维看板。运维人员亲自挑选关注的服务,并把它们排列成 优先级卡片。每张卡片按种类展示一组不同的实时指标,优先级最靠前的 web/db/session 卡片驱动 可用性仪表盘,底部条带则绘制所选卡片的 实时时间序列。
主要特点:
- 选择与顺序保存在浏览器(localStorage)中 —— 服务端不做任何存储。即使是同一个账号,看板布局也可能因浏览器而异。
- 只读且轻量 ——
ServiceBoardService(15 秒缓存)把底层子系统(Web、DB、会话、目录)统一成一种规范的卡片形态。该页面不会向远程服务器新开直接连接(DB 卡片的即时新鲜度采样除外,详见下文)。 - 仅关注逻辑可达性/负载。 物理端口开放与暴露面扫描属于 防火墙 的职责(角色边界)。
该看板不是演示用的虚构环境 —— 全部为真实数据。指标来源是采集器已经写入的表:
infr_web_metric、infr_db_metric、infr_redis_metric以及infr_service(目录)。
何时使用
- 在轮班开始时,用一个页面快速扫视 少量核心服务(例如主力网站、主数据库、会话 Redis)。
- 作为 NOC /墙面看板 仪表盘(全屏按钮 + 高度滑块可让其适配屏幕)。
- 以时间序列查看某个服务的 近期趋势(1h / 6h / 1d)。
- 作为起点:先在这里获得整体感觉,再深入 Web、数据库、会话 或 目录 查看细节。
页面布局
顶部 KPI 条
由 realKpi() 计算的全公司汇总(随 30 秒轮询刷新):
| KPI | 含义 | 来源 |
|---|---|---|
| Web 流量 | 全部已注册 Web 服务的总 RPS + 带宽 | WebMetricService::kpi(dashboard()) |
| DB 负载 | 全部 access=database 采集器最新存储 QPS 之和 + 总连接数 | DbCollectorService::latest() |
| Web 可用率 | 24 小时可用性 | WebProbeService::availabilityOrPassive()(优先主动探测) |
| 延迟 | 探测响应平均值(ms) | 同上 |
| 事件 | 最近 7 天内新建的事件 | InfrIncident created_at ≥ now-7d |
Web 可用率与延迟优先采用 主动合成探测。仅凭被动的 vts 流量计数器,会把无流量的中断、藏在 3xx 之后的 5xx 以及计数器重置误判,因此看板使用
WebProbeService的真实 HTTP 探测结果。如果探测器尚未运行(没有覆盖),则回退到被动方式(web24h)。
服务可用性仪表盘
按优先级取 第一张 web/db/session 卡片 绘制(若这三种卡片一张都不在看板上,则显示占位提示)。
| 卡片种类 | 仪表形状 | 中心数值 | 配色规则 |
|---|---|---|---|
| web | 4 段响应码环形图 | REQ(当前 RPS) | 2xx=good · 3xx=info · 4xx=warn · 5xx=crit |
| database | 连接饱和度(conn_pct)弧形 | QPS | ≥90 crit · ≥70 warn · 其余为 good |
| session | 命中率弧形 | OPS | ≥90 good · ≥70 warn · 其余为 crit |
服务看板(卡片网格)
所选服务按 优先级顺序 排布为卡片。每张卡片按种类展示不同的 KPI 组合:
| 种类 | 默认守护进程 | 表头(别名) | 主要 KPI |
|---|---|---|---|
| web | nginx | 代表域名 | 延迟 · RPS · 打开的会话(活动连接数) · 24 小时累计请求 · 错误率 |
| database | mysql/mariadb/postgres/mongo | 采集器别名 | QPS · 席位(已用/上限) · 饱和度 · 运行中 · 锁(平均行锁 ms) · slow 累计 · 等待 |
| session | redis | 节点别名 | OPS · 命中率 · 客户端(当前会话数) · 键数 · 饱和度(内存使用率 %) |
| proxy | software_key/proxy | 实例别名 | 依赖(+N) · 延迟 · 监听端口 |
| docker | software_key/docker | 实例别名 | 依赖(+N) · 延迟 · 监听端口 |
- 卡片可 通过拖拽手柄重新排序(SortableJS)—— DOM 顺序即优先级(
sel),并会持久化到 localStorage。 - 卡片右上角的 ✕ 可将其从看板移除。
- proxy/docker 卡片没有可用性环形图,也没有时间序列(仅 web/db/session 才有)。
实时服务(底部时间序列)
具有序列的所选卡片(web/db/session)会在 2 列网格 中绘制为 SVG 面积+折线迷你图。每张图都带有 标尺(纵向网格线以及起始/中间/结束的 HH:MM 标签)以辨识时间轴。顶部的 范围切换(1h · 6h · 1d) 用于切换观察窗口(默认 1h)。
表头控件
- LIVE 开关 —— 打开/关闭 30 秒轮询。
- 全屏按钮 —— 隐藏顶部导航并铺满页面主体(按 ESC 退出 ·
fullscreenmixin ·body.infr-fs)。 - 两个高度滑块 —— 看板卡片高度(默认 118px,90–240)与实时图表高度(默认 50px,34–160)。适配值会持久化到 localStorage。
使用方法
1) 挑选服务
- 点击看板表头的 [选择服务] / [添加服务] 打开挑选模态框。
- 模态框会把所有可用服务 按种类 分组(web → database → session → proxy → docker)。
- 逐项开启(✓)/关闭服务。选择会立刻反映到看板上,并保存到 localStorage。
首次访问的默认值 = 自动选中 web、database、session 各自的第一项,使可用性仪表盘开箱即用。如果不需要,可在模态框中取消选择。
2) 调整优先级
- 抓住卡片的拖拽手柄并移动。最靠前的 web/db/session 卡片 会成为可用性仪表盘的对象。
3) 更改时间窗口
- 使用底部实时条上的 1h / 6h / 1d 按钮。切换时会发出
POST /service/series,在该窗口内重新拉取所选卡片的代表指标(降采样至最多 60 个点);若响应为空,则回退到卡片自带的序列。
// POST /service/series 请求示例
{ "keys": ["web:12", "db:db@blue", "session:blue"], "range": "6h" }
卡片 key 规约:
web:{infr_web_service.id}
db:{infr_collector.key} 例: db@blue
session:{node_alias} 例: blue
proxy:{infr_service.id}
docker:{infr_service.id}
4) 全屏态势看板
- 全屏按钮 → 用滑块调整卡片/图表高度以适配屏幕,即可作为壁挂式 NOC 看板。
数据来源
| 卡片种类 | 构建器 | 实际的表 |
|---|---|---|
| web | WebMetricService::dashboard() + WebProbeService::overlayStatus() |
infr_web_metric(vts 计数器) · infr_web_check(主动探测) · infr_web_service |
| database | InfrCollector(access=database) + DbCollectorService::latest()/series() |
infr_db_metric · infr_collector |
| session | RedisMetricService::dashboard() |
infr_redis_metric · infr_instance |
| proxy/docker | InfrService(kind IN proxy,container) |
infr_service · infr_instance |
| KPI 事件 | —— | infr_incident(最近 7 天) |
时间序列来源:
- web ——
infr_web_metric中主域名/主节点request_counter的增量 → RPS(避免多节点计数器混在一起)。 - database ——
infr_db_metric.qps(已存储的指标,不建立实时连接)。 - session ——
infr_redis_metric.instantaneous_ops_per_sec。
状态标记
| 标记 | 含义 |
|---|---|
| up | 健康 |
| degraded | 降级 |
| down | 中断(真实的连接/探测失败) |
| pending | 等待(判定暂缓,例如数据延迟) |
避免 DB 卡片误报红色 —— 在 economy 采集模式下,如果采集短暂滞后、最后一个样本已超过 5 分钟,
statusOf会因 stale 而返回down。数据库其实一切正常,你却会看到红色告警 —— 因此看板会 把 stale 导致的 down 降级为pending,只有真实的连接失败(ok=false)才保留 down。此外,仅当有用户正在查看看板时,若最后一个样本已超过 45 秒,会通过ensureFresh(45)即时采样一次(若调度器已在采集,则为不建连接的 no-op);该采样器会在 finally 块中清理连接以防泄漏。
访问权限
- 读取(查看):任何已认证用户(demo=1 及以上)。
/service位于infr.auth分组中,没有额外的等级门槛。 - 无写入:本页面纯为只读。卡片的选择、顺序、高度与范围全部 仅存放在浏览器 localStorage 中 —— 服务端不写入任何内容。由于不存在破坏性操作,也不会记录审计日志。
- 详情页面上的写入(Web 网站管理、数据库、目录 的构建/编辑)在各自页面上受控(例如 level≥2)。
localStorage 键:
infr:svcboard:sel:v1 所选服务 key 的数组(顺序=优先级)
infr:svcboard:h:v1 看板/实时高度滑块的值
infr:range:service-overview 底部时间序列的 range(1h/6h/1d)
故障排查与 FAQ
看板是空的。 请用表头的 [添加服务] 放置你关注的服务。如果根本没有可用服务(采集器尚未写入数据),挑选模态框中的分组看起来可能是空的 —— 请先确认 采集器 的注册情况与采集链路。
可用性仪表盘不出现。 仪表盘需要按优先级排在第一位的 web/db/session 卡片。如果你只挑选了 proxy/docker,就只会看到占位提示。请至少把一张 web/db/session 卡片放到靠前的位置。
底部时间序列是空的。 只有 web/db/session 卡片有序列,proxy/docker 不在其列。此外,若所选窗口(1h/6h/1d)内源表没有数据,图表同样为空。
DB 卡片是红色,但数据库一切正常。
数据延迟会被降级为 pending(灰色/等待)。若仍然是 down,那就是真实的连接失败 —— 请检查 数据库 页面,以及 采集器 下 access=database 采集器的状态。
刷新后卡片仍在/在另一台 PC 上显示不同。 选择与顺序由浏览器 localStorage 拥有,而非服务端的账号设置。它们在每个浏览器与设备上彼此独立。
我想要 5 分钟的窗口。 当前实现提供 1h · 6h · 1d 三种窗口(默认 1h)。若需更短的观察粒度,请使用 服务器 或 数据库 等专用页面。
相关内容
- 服务 ▸ Web —— 已注册网站的 vts 实时监控 + 主动探测可用率
- 服务 ▸ 数据库 —— 直连的数据库负载与结构分析
- 服务 ▸ 会话 —— Redis 会话容量与吞吐
- 服务 ▸ 目录 —— 从版本台账推导服务(proxy/docker 的来源)
- 管理 ▸ 采集器 —— 采集器注册表(指标来源)
- 实时/轮询 —— 实时刷新的工作原理
