405 lines
16 KiB
Markdown
405 lines
16 KiB
Markdown
# 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`,错误场景包含可操作建议。
|