实体关系生成与写入

概述

在 UModel 系统中,实体关系(Entity Relationship)描述 UModel 中不同实体之间的连接和依赖关系,如服务调用关系、主机包含关系等。本文档详细介绍实体关系的数据格式、写入方法和最佳实践。

说明

关于 UModel、EntitySetLink、EntityRelations 的详细概念,请参见EntityStore 简介

应用案例

当前应用案例相关素材,请参考:umodel.zip

关系数据格式

实体关系数据通过 SLS Log 协议写入到 EntityStore 的${workspace}__topo日志库中。每个关系记录描述两个实体之间的有向连接。

系统字段

字段名

类型

是否必须

示例

说明

__src_domain__

string

apm, k8s

源实体所属的域

__src_entity_type__

string

apm.service

源实体类型

__src_entity_id__

string

391274C9A1D369FB5222E273D02B81B8

源实体唯一标识符

__dest_domain__

string

apm, k8s

目标实体所属的域

__dest_entity_type__

string

apm.host

目标实体类型

__dest_entity_id__

string

D91192729ED1688E9096E98801A5D7CA

目标实体唯一标识符

__relation_type__

string

runs_on, calls, contains

关系类型,定义关系的业务含义

__method__

string

否(默认Update)

Update, Expire

操作类型,控制关系的生命周期

__first_observed_time__

int

1700000000

首次观察时间,秒级时间戳

__last_observed_time__

int

否(默认LogTime)

1700000001

最近观察时间,秒级时间戳

__keep_alive_seconds__

int

否(默认3600)

3600

存活时间,秒为单位

说明

当前实体关系数据不支持存储边上信息,边上数据建议使用 DataLink 连接 DataSet 进行存储。

字段说明

实体标识符

  • 源实体:由__src_domain__ + __src_entity_type__ + __src_entity_id__唯一确定。

  • 目标实体:由__dest_domain__ + __dest_entity_type__ + __dest_entity_id__唯一确定。

  • 实体ID格式:与实体写入相同,支持128hex值或自动转换。

关系方向性

关系具有明确的方向性:从源实体指向目标实体。

  • A --calls--> B:表示A调用B。

  • A --runs_on--> B:表示A运行在B上。

  • A --contains--> B:表示A包含B。

时间字段

请参见实体生成与写入中的相关内容。

关系写入方法

请参见实体生成与写入中的相关内容。

关系时间区间与查询覆盖机制

请参见实体生成与写入中的相关内容。

常见关系类型

说明

UModel 系统中,并不强制限制关系类型,可以根据实际业务需求进行定义。

关系类型

含义

应用场景

calls

调用

服务调用关系

runs_on

运行

进程运行关系

contains

包含

容器关系

manages

管理

管理关系

serves

服务

服务提供关系

hosted_by

托管于

部署关系

related_to

关联到

通用关联关系

说明

关系类型需要与 EntitySetLink 中的关系类型保持一致。

关系写入最佳实践

1. 关系发现策略

基于监控数据发现

  • APM Trace数据:从调用链中提取服务间调用关系。

  • 网络流量数据:从网络监控中发现通信关系。

  • 资源监控数据:从主机、容器监控中发现运行关系。

基于配置数据发现

  • K8s配置:从Pod、Service、Deployment配置中提取关系。

  • 云资源配置:从VPC、安全组、负载均衡配置中发现关系。

  • 应用配置:从应用配置文件中发现依赖关系。

2. 时间窗口管理

说明

KeepAlive时间根据上报周期进行调整,建议不低于1个上报周期。此外定期上报周期建议不低于5分钟,避免频繁更新影响查询性能。

短期关系(调用关系)

  • KeepAlive时间:10-30分钟。

  • 适用:服务调用、API请求等动态关系。

  • 更新频率:1-5分钟。

中期关系(部署关系)

  • KeepAlive时间:1-4小时。

  • 适用:应用部署、容器运行等半静态关系。

  • 更新频率:10-30分钟。

长期关系(基础设施关系)

  • KeepAlive时间:4-24小时。

  • 适用:网络连接、存储挂载等静态关系。

  • 更新频率:1-6小时。

3. 关系生命周期管理

建议使用增量 + 全量策略:

  • 增量更新:实时或近实时更新活跃关系。

  • 全量同步:定期全量同步,确保数据完整性。

  • 失效清理:通过KeepAlive机制自动清理过期关系。

跨域关系设计原则

  1. 明确边界:清晰定义不同域的职责范围。

  2. 标准化类型:统一跨域关系类型的命名规范。

  3. 避免循环:防止跨域关系形成复杂的循环依赖。

  4. 性能考虑:跨域查询可能影响性能,合理设计查询路径。

注意事项

1. 关系一致性

  • 确保关系两端的实体真实存在。

  • 定期检查和清理悬挂关系(实体已删除但关系仍存在)。

2. 性能优化

  • 限制关系数量(单一类型关系不超过10万,整体关系不超过100万),避免影响查询性能。

  • 合理设置 KeepAlive 时间,避免无效关系积累。

  • 控制关系数据的写入频率,避免过度更新。

3. 数据质量

  • 验证关系类型的合理性(如不应该存在 Pod calls Service 的关系)。

  • 确保关系方向的正确性。

  • 定期审查关系数据的准确性。