概述
在 UModel 数据建模体系中,Link(关联关系)是连接不同数据集合的重要机制。通过 Link,我们可以建立 EntitySet 之间、EntitySet 与 DataSet 之间,以及 DataSet 与 Storage 之间的关联关系,构建完整的数据关系网络。
UModel 提供三种类型的 Link 来满足不同的关联场景:
Link类型
用途
连接对象
EntitySetLink
定义实体间的关系
EntitySet <-> EntitySet
DataLink
定义数据集的关联
EntitySet/EntitySetLink -> DataSet
StorageLink
定义存储映射关系
EntitySet/EntitySetLink/DataSet -> Storage
应用案例
当前应用案例相关素材,请参考:umodel.zip
EntitySetLink - 实体关系建模
基本概念
EntitySetLink 用于定义两个 EntitySet 之间的关系,是构建实体关系图的核心组件。每个 EntitySetLink 必须包含:
源 EntitySet:关系的起始点。
目标 EntitySet:关系的终点。
链接类型:描述关系的性质。
关系类型
EntitySetLink 支持丰富的关系类型,涵盖各种业务场景:
关系类型 | 含义 | 应用场景 |
| 调用 | 服务调用关系 |
| 运行 | 进程运行关系 |
| 实例 | 实例与类型关系 |
| 父级 | 层级关系 |
| 包含 | 容器关系 |
| 管理 | 管理关系 |
| 监控 | 监控关系 |
| 服务 | 服务提供关系 |
| 托管于 | 部署关系 |
| 关联到 | 通用关联关系 |
核心配置
字段映射
通过fields_mapping
定义源 EntitySet 和目标 EntitySet 之间的字段对应关系:
spec:
fields_mapping:
source_field_1: target_field_1
source_field_2: target_field_2
动态关系
设置dynamic: true
可启用动态 EntitySetLink:
关系内容从 Storage 实时获取,而非存储在 EntityStore 中。
适用于关系频繁变化的场景。
需要配合 Storage 使用。
配置示例
kind: entity_set_link
schema:
url: "umodel.aliyun.com"
version: "v0.1.0"
metadata:
name: "apm.service_calls_apm.service"
display_name:
en_us: >
Service-Calls-Service
zh_cn: "应用-调用-应用"
description:
en_us: >
The link between "apm.service" and "apm.service".
zh_cn: "应用-调用-应用"
domain: apm
spec:
src:
domain: apm
kind: entity_set
name: apm.service
dest:
domain: apm
kind: entity_set
name: apm.service
entity_link_type: calls
DataLink - 数据关联建模
基本概念
DataLink 用于定义 EntitySet/Link 与 DataSet 之间的关系,以及 DataSet 之间的关联。它是连接实体模型和数据模型的桥梁。
链接类型
DataLink 支持两种链接类型:
类型 | 含义 | 使用场景 |
| 产生 | EntitySet产生相关的数据集 |
| 关联 | 弱关联关系,数据间存在相关性 |
核心配置
字段映射
定义源数据集和目标数据集之间的字段对应关系:
spec:
fields_mapping:
entity_id: data_entity_id
timestamp: data_time
数据过滤
通过data_filter
可对目标数据进行过滤(不推荐使用):
spec:
data_filter: "type='db'" # 过滤出数据库类型的指标
注意:data_filter
使用query类型的filter语法,较为复杂,建议通过其他方式实现数据过滤。
配置示例
kind: data_link
schema:
url: "umodel.aliyun.com"
version: "v0.1.0"
metadata:
name: "apm.service_related_to_apm.metric.apm.service"
display_name:
en_us: >
APM Service - APM Service Request Metrics
zh_cn: "应用-流量指标"
description:
en_us: >
The link between "apm.service" and "apm.metric.apm.service".
zh_cn: "应用-流量指标"
domain: apm
spec:
src:
domain: apm
kind: entity_set
name: apm.service
dest:
domain: apm
kind: metric_set
name: apm.metric.apm.service
data_link_type: related_to
fields_mapping:
"service_id": "acs_arms_service_id"
StorageLink - 存储映射建模
基本概念
StorageLink 定义 EntitySet/EntitySetLink/DataSet 与 Storage 之间的映射关系,实现数据集合与底层存储的连接。
核心配置
字段映射
定义数据集合字段与存储字段之间的映射关系:
spec:
fields_mapping:
logical_field_name: storage_column_name
entity_id: storage_id
timestamp: storage_time
配置示例
kind: storage_link
schema:
url: "umodel.aliyun.com"
version: "v0.1.0"
metadata:
name: "app.log.common_storage_link"
display_name:
en_us: >
App Log Set Storage Link
zh_cn: "应用日志数据集存储链接"
description:
en_us: >
Storage link for app log set data.
zh_cn: "应用日志数据集的存储链接"
domain: apm
spec:
src:
domain: app
kind: log_set
name: app.log.common
dest:
domain: app
kind: sls_logstore
name: app.log.common.storage
高级配置:字段映射配置
字段映射原则
字段映射(fields_mapping
)是 Link 建模中的核心配置,用于建立源对象和目标对象之间的字段对应关系。正确的字段映射设计是确保数据关联准确性的关键。
核心原则
主键优先映射:实体到 DataSet 的关联中,必须配置实体的主键字段到 DataSet 字段的映射。
完整性保证:映射应覆盖所有关键标识字段,确保能够精确定位特定实体的数据。
类型兼容性:确保源字段和目标字段的数据类型兼容。
语义一致性:映射的字段应具有相同的业务语义。
实体主键映射示例
以APM应用实体为例,应用实体的主键字段需要完整映射到指标数据,此外,由于 APM 的服务名也是唯一的,且和MetricSet中的服务名一致,因此需要进行映射。
# APM应用实体关联指标数据
kind: data_link
metadata:
name: "apm.service_related_to_apm.metric.apm.service"
spec:
src:
domain: apm
kind: entity_set
name: apm.service
dest:
domain: apm
kind: metric_set
name: apm.metric.apm.service
data_link_type: related_to
fields_mapping:
# 实体主键字段映射
"service_id": "acs_arms_service_id" # 应用唯一标识,主键字段
"service_name": "service" # 应用名称
层次实体映射示例
以阿里云 NAS 文件系统为例,展示如何建立实体与多类型指标的映射:
# NAS实体关联CPFS指标
kind: data_link
metadata:
name: "acs.nas.filesystem_related_to_acs.metric.prometheus_cpfs_userid_filesystemid"
spec:
src:
domain: acs
kind: entity_set
name: acs.nas.filesystem
dest:
domain: acs
kind: metric_set
name: acs.metric.prometheus_cpfs_userid_filesystemid
data_link_type: related_to
fields_mapping:
# 完整的实体主键映射
region_id: region_id # 区域标识
resource_group_id: resource_group_id # 资源组标识
instance_id: fileSystemId # 文件系统实例ID
user_id: userId # 用户标识
高级配置:过滤条件配置
UModel提供两种过滤机制来精确控制数据关联的范围,它们的使用场景和过滤对象完全不同。
filter_by_entity:实体级过滤
filter_by_entity
用于在源实体层面进行过滤,只有满足条件的实体才会建立 Link 关联。
注意:filter_by_entity
的语法为 SPL Bool 表达式语法的子集,关于 UModel 中 SPL 表达式语法,请参考SPL基础语法。
使用场景
同一个 EntitySet 包含多种子类型,需要针对特定子类型建立关联。
根据实体属性值筛选需要关联的实体范围。
根据特定实体,选择对应的存储实例(Storage)。
配置示例
以NAS文件系统为例,根据文件系统类型建立不同的指标关联:
# CPFS类型文件系统关联CPFS指标
kind: data_link
metadata:
name: "acs.nas.filesystem_related_to_acs.metric.prometheus_cpfs_userid_filesystemid"
spec:
src:
domain: acs
kind: entity_set
name: acs.nas.filesystem
dest:
domain: acs
kind: metric_set
name: acs.metric.prometheus_cpfs_userid_filesystemid
data_link_type: related_to
filter_by_entity: file_system_type in ('cpfs', 'bmcpfs') # 只关联CPFS类型
fields_mapping:
region_id: region_id
instance_id: fileSystemId
user_id: userId
# 标准NAS类型文件系统关联NAS指标
kind: data_link
metadata:
name: "acs.nas.filesystem_related_to_acs.metric.prometheus_nas_userid_filesystemid"
spec:
src:
domain: acs
kind: entity_set
name: acs.nas.filesystem
dest:
domain: acs
kind: metric_set
name: acs.metric.prometheus_nas_userid_filesystemid
data_link_type: related_to
filter_by_entity: file_system_type = 'standard' # 只关联标准NAS类型
fields_mapping:
region_id: region_id
instance_id: fileSystemId
user_id: userId
data_filter:数据级过滤
data_filter
用于在目标数据层面进行过滤,即目标DataSet中只有满足条件的数据与源实体建立关联。
注意:data_filter
的语法为 SPL Bool表达式语法的子集,关于 UModel 中 SPL 表达式语法,请参考SPL基础语法。
使用场景
目标 DataSet 包含多种数据类型,只需要关联特定类型的数据。
根据数据内容筛选相关数据范围。
实现数据的条件关联。
配置示例
# 应用实体关联数据库类型的调用指标
kind: data_link
metadata:
name: "apm.service_related_to_database_metrics"
spec:
src:
domain: apm
kind: entity_set
name: apm.service
dest:
domain: apm
kind: metric_set
name: apm.metric.external_calls
data_link_type: related_to
data_filter: "call_type='database'" # 只关联数据库调用的指标数据
fields_mapping:
service_id: service_id
过滤条件对比
过滤类型 | 过滤对象 | 使用场景 | 语法 |
filter_by_entity | 源实体 | 实体分类、实体属性筛选 | 查询语法表达式 |
data_filter | 目标数据 | 数据分类、数据内容筛选 | 查询语法表达式 |
过滤配置最佳实践
1. 优先使用filter_by_entity
在实体层面进行过滤性能更好。
语义更清晰,易于理解和维护。
避免复杂的查询语法。
2. 谨慎使用data_filter
data_filter使用查询语法,较为复杂。
会影响查询性能,应避免过于复杂的过滤条件。
建议通过多个专门的DataSet替代复杂的data_filter。
3. 过滤条件设计原则
精确性:过滤条件应准确反映业务需求。
性能性:避免影响查询性能的复杂条件。
可维护性:过滤条件应易于理解和修改。
4. 实际应用建议
场景 | 推荐方案 | 原因 |
实体子类型分组 | 使用filter_by_entity | 实体层面筛选,性能好 |
数据内容过滤 | 创建专门的DataSet | 避免复杂查询语法 |
临时数据筛选 | 使用data_filter | 快速实现特殊需求 |
注意事项
合理设计 Link 的粒度和数量。
定期检查关系图的拓扑结构。
谨慎使用动态 Link,需要额外的存储查询开销。
确保 Link 两端的实体/数据集确实存在。
及时更新因实体变更导致的 Link 失效。