Files
ops/docs/首期数据模型与状态机.md

405 lines
16 KiB
Markdown
Raw Permalink Normal View History

2026-06-21 17:50:24 +08:00
# OPS 首期数据模型与状态机
## 1. 文档目标
本文用于固定第 1 阶段编码前的核心后端规格,覆盖资源监控、采集、时序指标、原始事件、告警、事件、通知、工单、审计和 3D 机房后端接口所需的最小数据模型与状态机。
本文不替代数据库迁移脚本。后续实现时,应以本文作为 `server/internal/models/``server/internal/logic/` 和接口设计的依据。
## 2. 范围边界
第 1 阶段必须覆盖:
- 主机、H3C/华三网络设备、数据库、虚拟化、URL/API 至少各一类样例资源。
- 指标采集、Syslog、SNMP Trap、URL/API 探测、采集失败事件。
- 告警去重、压缩或归并、屏蔽、抑制、确认、忽略、恢复、派单。
- 平台站内消息、短信、邮件三类通知。
- 工单创建、接单、转交、撤回、挂起、重启、关闭。
- 报表、大屏、审计能追踪完整故障闭环。
- 外包 3D 机房前端所需的数据中心、机房、机柜、U 位、设备和告警状态接口模型。
第 1 阶段不覆盖:
- 所有厂商全量适配。
- 老运维平台迁移或集成。
- 3D 机房前端实现。
- 完整 IPAM、复杂拓扑编辑、全量资产审核流程。
## 3. 存储分工
| 存储 | 数据范围 | 说明 |
| --- | --- | --- |
| PostgreSQL | 资源、业务系统、资产、采集任务、规则、告警、事件、工单、通知、权限、审计、报表配置 | 事务数据主库,保证一致性和审计。 |
| TDengine 开源版 | 指标样本、探测样本、接口流量、采集健康度、容量和性能趋势 | 第 1 阶段选定的时序数据库。后端通过适配层访问,避免业务逻辑直接依赖 TDengine SQL 方言。 |
| 文件或对象存储 | 报表导出、附件、截图、录像、大屏快照 | 第 1 阶段可先使用本地文件存储,接口保留替换能力。 |
设计原则:
- PostgreSQL 保存资源和指标定义,时序数据库保存样本值。
- 所有时序数据必须能通过 `resource_id``metric_code`、时间范围回查到资源上下文。
- 告警、事件、工单状态变化必须写审计日志。
- 真实凭据不落业务表明文,只保存凭据引用和脱敏描述。
## 4. 通用字段
核心业务表建议统一包含:
| 字段 | 类型建议 | 说明 |
| --- | --- | --- |
| `id` | UUID 或雪花 ID | 主键。 |
| `tenant_id` | string | 单院区可固定,保留多租户或多院区扩展。 |
| `created_at` | timestamp | 创建时间。 |
| `updated_at` | timestamp | 更新时间。 |
| `created_by` | string | 创建人。 |
| `updated_by` | string | 更新人。 |
| `deleted_at` | timestamp nullable | 软删除时间,需要保留审计的表不做物理删除。 |
| `version` | integer | 乐观锁版本,用于工单、规则等并发修改。 |
审计相关表必须额外保留:
| 字段 | 说明 |
| --- | --- |
| `trace_id` | 请求链路 ID。 |
| `operator_id` | 操作人。 |
| `operator_name` | 操作人快照。 |
| `source_ip` | 操作来源 IP。 |
| `before_json` | 变更前快照,敏感字段脱敏。 |
| `after_json` | 变更后快照,敏感字段脱敏。 |
## 5. 资源与资产模型
### 5.1 核心表
| 表名 | 职责 | 关键字段 |
| --- | --- | --- |
| `business_systems` | 业务系统,如 HIS、LIS、PACS、EMR | `name``code``level``network_zone``owner_org_id``owner_user_id``description` |
| `resource_types` | 资源类型和默认模板 | `code``name``category``vendor``default_metric_template_id``icon` |
| `resources` | 统一监控资源 | `name``resource_type_id``vendor``model``ip``hostname``business_system_id``owner_org_id``owner_user_id``asset_id``status``collect_status` |
| `resource_relations` | 资源依赖关系 | `source_resource_id``target_resource_id``relation_type``description` |
| `metric_definitions` | 指标定义 | `resource_type_id``metric_code``metric_name``unit``value_type``default_interval_seconds``threshold_hint` |
| `metric_series` | 时序指标序列映射 | `resource_id``metric_definition_id``metric_code``tsdb_name``series_key``labels_json``retention_policy` |
| `credentials` | 凭据引用 | `name``type``secret_ref``masked_summary``owner_org_id``status` |
### 5.2 资产与 3D 机房接口模型
| 表名 | 职责 | 关键字段 |
| --- | --- | --- |
| `data_centers` | 数据中心 | `name``province``city``address``status` |
| `rooms` | 机房 | `data_center_id``name``floor``status` |
| `racks` | 机柜 | `room_id``name``code``total_u``row_no``column_no``x``y``z``status` |
| `rack_units` | U 位占用 | `rack_id``u_no``resource_id``asset_id``occupy_height``status` |
| `assets` | 资产台账 | `asset_no``name``vendor``model``serial_no``resource_id``rack_id``status` |
3D 机房前端接口至少需要返回:
- 数据中心、机房、机柜层级。
- 机柜坐标、容量、已占用 U 位、剩余 U 位。
- 设备与资源绑定关系。
- 设备健康状态、最高告警级别、未恢复告警数量。
- 数据更新时间和权限过滤结果。
### 5.3 资源状态
| 状态码 | 中文名 | 说明 |
| --- | --- | --- |
| `draft` | 草稿 | 已录入但未启用采集。 |
| `active` | 运行中 | 正常纳管,可采集、可触发告警。 |
| `disabled` | 已停用 | 暂停采集,不产生新告警。 |
| `maintenance` | 维护中 | 可采集,但默认抑制或降级告警。 |
| `decommissioned` | 已退役 | 不再采集,仅保留历史和审计。 |
合法流转:
```text
草稿 -> 运行中
运行中 -> 维护中 -> 运行中
运行中 -> 已停用 -> 运行中
运行中 -> 已退役
已停用 -> 已退役
```
非法流转:
- 已退役资源不能直接恢复为运行中,必须重新建档或走恢复审批。
- 已停用资源不能生成新的业务告警,但可以生成配置或审计事件。
## 6. 采集与时序模型
### 6.1 采集任务表
| 表名 | 职责 | 关键字段 |
| --- | --- | --- |
| `collector_tasks` | 采集任务定义 | `resource_id``collector_type``protocol``credential_id``schedule_cron``interval_seconds``timeout_seconds``retry_limit``status` |
| `collector_runs` | 采集执行记录 | `task_id``started_at``finished_at``run_status``success_count``failed_count``error_code``error_message` |
| `discovery_tasks` | 自动发现任务 | `name``scan_range``protocols``credential_id``schedule_cron``status` |
| `probe_targets` | URL/API/端口探测目标 | `resource_id``target_url``method``expected_status``timeout_seconds``status` |
### 6.2 时序样本逻辑结构
时序库中的指标样本必须至少包含:
| 字段 | 说明 |
| --- | --- |
| `ts` | 样本时间。 |
| `resource_id` | 资源 ID。 |
| `resource_type` | 资源类型编码。 |
| `metric_code` | 指标编码。 |
| `value` | 指标值。 |
| `unit` | 单位。 |
| `labels` | 标签,如接口名、磁盘分区、数据库实例名。 |
| `quality` | 样本质量:正常、缺失、估算、异常。 |
| `collector_task_id` | 采集任务 ID。 |
### 6.3 采集任务状态
任务配置状态:
```text
草稿 -> 已启用 -> 已停用
已启用 -> 已停用 -> 已启用
已启用 -> 已删除
已停用 -> 已删除
```
单次执行状态:
```text
待执行 -> 执行中 -> 成功
待执行 -> 执行中 -> 部分成功
待执行 -> 执行中 -> 失败
执行中 -> 超时
```
规则:
- 连续失败达到阈值时,必须生成平台内部原始事件。
- 部分成功必须记录缺失指标,不允许只显示成功。
- 凭据错误、设备不可达、协议超时需要区分错误码。
## 7. 事件与告警模型
### 7.1 核心表
| 表名 | 职责 | 关键字段 |
| --- | --- | --- |
| `raw_events` | 原始事件 | `source_type``source_id``resource_id``event_key``occurred_at``severity``title``message``payload_json``parse_status` |
| `alert_rules` | 告警规则 | `name``scope_type``scope_id``metric_code``condition_expr``duration_seconds``recover_expr``severity``status` |
| `alerts` | 告警实例 | `alert_key``resource_id``rule_id``first_seen_at``last_seen_at``recovered_at``severity``status``summary` |
| `incidents` | 归并事件 | `incident_no``title``severity``status``owner_user_id``business_system_id``opened_at``closed_at` |
| `incident_alerts` | 事件与告警关联 | `incident_id``alert_id``relation_type` |
| `silence_policies` | 屏蔽策略 | `name``scope_type``scope_id``start_at``end_at``reason``status` |
| `dedup_rules` | 去重规则 | `name``match_expr``dedup_window_seconds``status` |
| `correlation_rules` | 关联/压缩/抑制规则 | `name``match_expr``action``priority``status` |
| `escalation_policies` | 升级策略 | `name``severity``timeout_minutes``next_target_type``next_target_id``status` |
### 7.2 原始事件状态
| 状态码 | 中文名 | 说明 |
| --- | --- | --- |
| `received` | 已接收 | 原始数据已入库。 |
| `parsed` | 已解析 | 已识别资源、级别、事件键。 |
| `unparsed` | 未解析 | 字典或规则不匹配。 |
| `suppressed` | 已抑制 | 命中屏蔽、依赖或抑制规则。 |
| `converted` | 已转告警 | 已生成或更新告警。 |
| `archived` | 已归档 | 不再参与处理。 |
合法流转:
```text
已接收 -> 已解析 -> 已转告警
已接收 -> 未解析 -> 已解析 -> 已转告警
已解析 -> 已抑制 -> 已归档
已转告警 -> 已归档
未解析 -> 已归档
```
规则:
- 未解析 Trap/Syslog 不能直接丢弃,必须可查询、可补规则重放。
- 已抑制事件必须记录命中的策略 ID。
### 7.3 告警状态机
| 状态码 | 中文名 | 说明 |
| --- | --- | --- |
| `firing` | 触发中 | 当前异常仍存在。 |
| `acknowledged` | 已确认 | 值班人员已接手,但异常未恢复。 |
| `ignored` | 已忽略 | 经人工判断无需处理。 |
| `recovered` | 已恢复 | 恢复条件满足或收到恢复事件。 |
| `expired` | 已失效 | 长时间未刷新且无法确认恢复。 |
合法流转:
```text
触发中 -> 已确认 -> 已恢复
触发中 -> 已忽略
触发中 -> 已恢复
触发中 -> 已失效
已确认 -> 已恢复
已确认 -> 已忽略
已确认 -> 已失效
```
非法流转:
- 已恢复告警不能重新变为触发中;同一资源同一规则再次异常时,应创建或激活新的告警周期。
- 已忽略告警不能自动派单。
- 已失效告警不能再确认,只能作为历史查看。
### 7.4 事件状态机
| 状态码 | 中文名 | 说明 |
| --- | --- | --- |
| `open` | 待处理 | 已创建事件,尚未分派。 |
| `assigned` | 已分派 | 已指定处理人或处理组。 |
| `in_progress` | 处理中 | 处理人已开始处理。 |
| `suspended` | 已挂起 | 等待外部条件或人工决策。 |
| `resolved` | 已解决 | 技术处理完成,等待关闭确认。 |
| `closed` | 已关闭 | 闭环完成。 |
合法流转:
```text
待处理 -> 已分派 -> 处理中 -> 已解决 -> 已关闭
处理中 -> 已挂起 -> 处理中
已分派 -> 待处理
已解决 -> 处理中
```
非法流转:
- 已关闭事件不能回到处理中。
- 未关联告警或资源的事件不能进入已关闭。
- 已解决事件若关联告警再次触发,应退回处理中或新建事件,不能静默覆盖。
## 8. 通知模型
### 8.1 核心表
| 表名 | 职责 | 关键字段 |
| --- | --- | --- |
| `notification_policies` | 通知策略 | `name``scope_type``severity``channels``receiver_expr``status` |
| `notification_templates` | 通知模板 | `channel``title_template``content_template``variables_json``status` |
| `notification_records` | 通知发送记录 | `channel``alert_id``incident_id``receiver``send_status``retry_count``error_message``sent_at` |
第 1 阶段通知渠道:
- 平台站内消息。
- 短信。
- 邮件。
### 8.2 通知状态机
```text
待发送 -> 发送中 -> 已发送
待发送 -> 发送中 -> 失败 -> 待重试 -> 发送中
失败 -> 已取消
待重试 -> 已取消
```
规则:
- 任何通知失败都不能阻断告警和工单状态流转。
- 通知失败必须可见、可重试、可审计。
- 短信和邮件必须记录第三方返回码或失败原因。
## 9. 工单模型
### 9.1 核心表
| 表名 | 职责 | 关键字段 |
| --- | --- | --- |
| `tickets` | 工单 | `ticket_no``title``source_type``source_id``alert_id``incident_id``resource_id``assignee_id``status``priority``closed_at` |
| `ticket_transitions` | 工单流转记录 | `ticket_id``from_status``to_status``operator_id``reason``created_at` |
| `ticket_comments` | 工单处理记录 | `ticket_id``comment_type``content``attachments_json``created_by` |
| `ticket_sla_records` | 工单时效记录 | `ticket_id``accepted_at``first_response_at``resolved_at``closed_at``overdue_flag` |
### 9.2 工单状态机
| 状态码 | 中文名 | 说明 |
| --- | --- | --- |
| `created` | 已创建 | 工单已生成,等待接单。 |
| `accepted` | 已接单 | 处理人已接收。 |
| `in_progress` | 处理中 | 正在处理。 |
| `transferred` | 已转交 | 转给其他处理人或处理组。 |
| `suspended` | 已挂起 | 暂停处理,等待外部条件。 |
| `restarted` | 已重启 | 从挂起恢复。 |
| `withdrawn` | 已撤回 | 创建方撤回或确认无需处理。 |
| `closed` | 已关闭 | 处理完成并关闭。 |
合法流转:
```text
已创建 -> 已接单 -> 处理中 -> 已关闭
已创建 -> 已撤回
已接单 -> 已转交 -> 已接单
处理中 -> 已转交 -> 已接单
处理中 -> 已挂起 -> 已重启 -> 处理中
已接单 -> 已关闭
```
非法流转:
- 已关闭工单不能转交、撤回或挂起。
- 已撤回工单不能重新接单,只能新建工单。
- 同一告警不能重复自动创建多个未关闭工单。
- 无权限用户不能关闭、转交或撤回工单。
## 10. 权限与审计模型
| 表名 | 职责 | 关键字段 |
| --- | --- | --- |
| `organizations` | 组织部门 | `name``parent_id``status` |
| `users` | 用户 | `username``display_name``org_id``status` |
| `roles` | 角色 | `name``code``status` |
| `user_roles` | 用户角色 | `user_id``role_id` |
| `role_permissions` | 功能权限 | `role_id``permission_code` |
| `data_scopes` | 数据权限 | `subject_type``subject_id``scope_type``scope_expr` |
| `audit_logs` | 审计日志 | `action``object_type``object_id``operator_id``trace_id``before_json``after_json` |
必须审计的动作:
- 资源新增、修改、停用、退役。
- 凭据引用变更。
- 告警确认、忽略、派单、恢复、失效。
- 屏蔽、抑制、升级、通知策略变更。
- 工单接单、转交、撤回、挂起、重启、关闭。
- 权限、角色、数据权限变更。
- 报表导出和敏感数据查看。
## 11. 核心关系
```mermaid
erDiagram
BUSINESS_SYSTEMS ||--o{ RESOURCES : contains
RESOURCE_TYPES ||--o{ RESOURCES : classifies
RESOURCES ||--o{ METRIC_SERIES : emits
METRIC_DEFINITIONS ||--o{ METRIC_SERIES : defines
RESOURCES ||--o{ COLLECTOR_TASKS : collected_by
COLLECTOR_TASKS ||--o{ COLLECTOR_RUNS : runs
RESOURCES ||--o{ RAW_EVENTS : produces
RAW_EVENTS ||--o{ ALERTS : converts_to
ALERT_RULES ||--o{ ALERTS : triggers
INCIDENTS ||--o{ INCIDENT_ALERTS : groups
ALERTS ||--o{ INCIDENT_ALERTS : grouped_by
INCIDENTS ||--o{ TICKETS : handled_by
ALERTS ||--o{ TICKETS : may_create
ALERTS ||--o{ NOTIFICATION_RECORDS : notifies
INCIDENTS ||--o{ NOTIFICATION_RECORDS : notifies
DATA_CENTERS ||--o{ ROOMS : contains
ROOMS ||--o{ RACKS : contains
RACKS ||--o{ RACK_UNITS : contains
RESOURCES ||--o| ASSETS : binds
ASSETS ||--o{ RACK_UNITS : occupies
```
## 12. 编码前检查清单
- [ ] PostgreSQL 表结构与本文核心表一一对应。
- [ ] 时序数据库选型完成,并定义 `resource_id + metric_code + ts` 查询方式。
- [ ] 告警、事件、工单状态机在后端集中定义,不在前端自行拼状态。
- [ ] 所有状态变化写入 `audit_logs` 或对应流转记录。
- [ ] 采集失败、通知失败、自动派单失败均能产生可见错误和审计记录。
- [ ] 3D 机房接口不依赖真实现场台账即可返回样例数据。
- [ ] API 响应统一包含 `code``message``traceId`,错误场景包含可操作建议。