16 KiB
16 KiB
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 |
已退役 | 不再采集,仅保留历史和审计。 |
合法流转:
草稿 -> 运行中
运行中 -> 维护中 -> 运行中
运行中 -> 已停用 -> 运行中
运行中 -> 已退役
已停用 -> 已退役
非法流转:
- 已退役资源不能直接恢复为运行中,必须重新建档或走恢复审批。
- 已停用资源不能生成新的业务告警,但可以生成配置或审计事件。
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 采集任务状态
任务配置状态:
草稿 -> 已启用 -> 已停用
已启用 -> 已停用 -> 已启用
已启用 -> 已删除
已停用 -> 已删除
单次执行状态:
待执行 -> 执行中 -> 成功
待执行 -> 执行中 -> 部分成功
待执行 -> 执行中 -> 失败
执行中 -> 超时
规则:
- 连续失败达到阈值时,必须生成平台内部原始事件。
- 部分成功必须记录缺失指标,不允许只显示成功。
- 凭据错误、设备不可达、协议超时需要区分错误码。
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 |
已归档 | 不再参与处理。 |
合法流转:
已接收 -> 已解析 -> 已转告警
已接收 -> 未解析 -> 已解析 -> 已转告警
已解析 -> 已抑制 -> 已归档
已转告警 -> 已归档
未解析 -> 已归档
规则:
- 未解析 Trap/Syslog 不能直接丢弃,必须可查询、可补规则重放。
- 已抑制事件必须记录命中的策略 ID。
7.3 告警状态机
| 状态码 | 中文名 | 说明 |
|---|---|---|
firing |
触发中 | 当前异常仍存在。 |
acknowledged |
已确认 | 值班人员已接手,但异常未恢复。 |
ignored |
已忽略 | 经人工判断无需处理。 |
recovered |
已恢复 | 恢复条件满足或收到恢复事件。 |
expired |
已失效 | 长时间未刷新且无法确认恢复。 |
合法流转:
触发中 -> 已确认 -> 已恢复
触发中 -> 已忽略
触发中 -> 已恢复
触发中 -> 已失效
已确认 -> 已恢复
已确认 -> 已忽略
已确认 -> 已失效
非法流转:
- 已恢复告警不能重新变为触发中;同一资源同一规则再次异常时,应创建或激活新的告警周期。
- 已忽略告警不能自动派单。
- 已失效告警不能再确认,只能作为历史查看。
7.4 事件状态机
| 状态码 | 中文名 | 说明 |
|---|---|---|
open |
待处理 | 已创建事件,尚未分派。 |
assigned |
已分派 | 已指定处理人或处理组。 |
in_progress |
处理中 | 处理人已开始处理。 |
suspended |
已挂起 | 等待外部条件或人工决策。 |
resolved |
已解决 | 技术处理完成,等待关闭确认。 |
closed |
已关闭 | 闭环完成。 |
合法流转:
待处理 -> 已分派 -> 处理中 -> 已解决 -> 已关闭
处理中 -> 已挂起 -> 处理中
已分派 -> 待处理
已解决 -> 处理中
非法流转:
- 已关闭事件不能回到处理中。
- 未关联告警或资源的事件不能进入已关闭。
- 已解决事件若关联告警再次触发,应退回处理中或新建事件,不能静默覆盖。
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 通知状态机
待发送 -> 发送中 -> 已发送
待发送 -> 发送中 -> 失败 -> 待重试 -> 发送中
失败 -> 已取消
待重试 -> 已取消
规则:
- 任何通知失败都不能阻断告警和工单状态流转。
- 通知失败必须可见、可重试、可审计。
- 短信和邮件必须记录第三方返回码或失败原因。
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 |
已关闭 | 处理完成并关闭。 |
合法流转:
已创建 -> 已接单 -> 处理中 -> 已关闭
已创建 -> 已撤回
已接单 -> 已转交 -> 已接单
处理中 -> 已转交 -> 已接单
处理中 -> 已挂起 -> 已重启 -> 处理中
已接单 -> 已关闭
非法流转:
- 已关闭工单不能转交、撤回或挂起。
- 已撤回工单不能重新接单,只能新建工单。
- 同一告警不能重复自动创建多个未关闭工单。
- 无权限用户不能关闭、转交或撤回工单。
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. 核心关系
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,错误场景包含可操作建议。