本文以 DevOps 场景为例,展示如何从业务需求出发,一步步开发实体数据和关系数据。
开发流程概览
开发实体数据和关系数据遵循如下统一的流程:
步骤 | 实体开发 | 关系开发 |
1. 定义Schema | 定义 EntitySet | 定义 EntitySetLink |
2. 实现数据采集 | 从数据源获取实体数据 | 从实体数据或配置生成关系 |
3. 数据转换 | 字段映射、生成 entity_id | 匹配源和目标 entity_id |
4. 上传数据 | 上传到 | 上传到 |
DevOps场景开发实施示例
此处以常见微服务DevOps场景为例,演示实体和关系的完整开发流程。
DevOps典型流程:
开发阶段:研发人员在DevOps平台创建和管理代码仓库。
发布阶段:代码合并后打Tag,创建代码发布记录。
构建阶段:CI流程根据代码发布构建容器镜像。
存储阶段:容器镜像推送到ACR镜像仓库。
部署阶段:K8s从镜像仓库拉取镜像,部署Pod实例。
监控阶段:APM系统监控运行中的服务性能。
本场景的完整代码素材为umodel_and_codes.zip,项目目录如下:
├── devops_data_generator/ # 数据生成器主目录
│ ├── config/ # 配置文件
│ │ ├── app_config.yaml # 应用配置(API凭证、SLS配置等)
│ │ ├── data_mapping.yaml # 实体/关系字段映射配置
│ │ ├── static_topo.yaml # 静态关系配置
│ │ └── repo_image_mapping.yaml # 代码仓库与镜像仓库映射
│ ├── tasks/ # 任务实现
│ │ ├── developer_task.py # 开发人员实体生成
│ │ ├── code_repository_task.py # 代码仓库实体生成
│ │ ├── code_release_task.py # 代码发布实体生成
│ │ ├── image_registry_task.py # 镜像仓库实体生成
│ │ ├── image_task.py # 镜像实体生成
│ │ ├── kubernetes_pod_task.py # Pod实体生成
│ │ ├── developer_manages_code_repository_task.py # 管理关系生成
│ │ ├── code_release_sourced_from_code_repository_task.py # 发布来源关系
│ │ ├── image_sourced_from_code_release_task.py # 镜像来源关系
│ │ ├── image_registry_contains_image_task.py # 包含关系
│ │ ├── pod_uses_image_task.py # 使用关系生成
│ │ └── static_topo_task.py # 静态关系处理
│ ├── generator/ # 数据生成器
│ │ └── sls_data_generator.py # SLS数据格式转换
│ ├── sender/ # 数据发送器
│ │ └── sls_data_sender.py # SLS数据上传
│ ├── shared/ # 共享组件
│ │ └── data_context.py # 任务间数据共享
│ ├── orchestrator.py # 任务编排器
│ ├── main.py # 命令行入口
│ ├── app.py # Flask API入口
│ ├── Dockerfile # Docker构建文件
│ ├── Makefile # 快速操作命令
│ └── requirements.txt # Python依赖
└── umodel/ # UModel Schema定义
├── entity_set/ # 实体定义
│ ├── devops_devops.developer.yaml
│ ├── devops_devops.code_repository.yaml
│ ├── devops_devops.code_release.yaml
│ ├── devops_devops.image_registry.yaml
│ └── devops_devops.image.yaml
└── entity_set_link/ # 关系定义
├── devops.developer_manages_devops.code_repository.yaml
├── devops.code_release_sourced_from_devops.code_repository.yaml
├── devops.image_sourced_from_devops.code_release.yaml
├── devops.image_registry_contains_devops.image.yaml
└── k8s.pod_uses_devops.image.yaml完整介绍该场景实体和关系的开发过程会过于冗长,因此以其中开发人员实体(developer)和管理关系(manages)为例,演示从Schema定义到数据上传的完整开发过程。UModel的实体建模方法、关系建模方法、数据采集流程、上传策略等开发流程是通用的,其他实体和关系的开发具体实现可参考上述代码目录。
步骤一:定义Schema
定义开发人员实体Schema。
定义管理关系Schema。
步骤二:实现数据采集
从数据源获取开发人员实体原始数据,确定上传策略,并编写代码。
数据源与采集方式:从DevOps API采集。
数据源:阿里云DevOps API - ListRepositoryMemberWithInherited。
采集方式:遍历所有代码仓库,获取成员并去重。
上传策略:由于人员变动不频繁,即变化频率低;数据量约几百人,全量上传成本低;因此推荐策略为定时全量上传。
执行频率:数据变化慢,每天一次即可。
KeepAlive:2天(172800秒),全量周期的2倍,防止任务失败。
从数据源获取管理关系实体原始数据,确定上传策略,并编写代码。
数据源与采集方式:获取开发人员管理代码仓库的关系。
数据源:YAML配置文件,获取关系(开发人员——代码仓库)。
采集方式:通过已有实体ID,关联静态配置。
上传策略:由于管理关系相对稳定,即变化频率低;数据来源为人工维护的静态配置文件;因此推荐策略为定时全量上传。
执行频率:每小时一次,及时同步配置变更。
KeepAlive:2小时,全量周期的2倍,防止任务失败。
第三步:数据转换
编写代码,将原始数据转换为EntityStore格式。
第四步:上传数据
使用SLS SDK将数据上传到目标Logstore。
上传实体数据与关系数据。
重要注意请通过批量上传提升性能,如每批次1000条。
所有字段值必须转为字符串。
添加异常处理和日志记录。
相关参考
其他实体的数据采集
以下列出的是DevOps场景Demo中涉及的实体类型,实际项目中请根据业务需求选择合适的实体,并调整数据源和采集方式。
DevOps场景包含多种实体,根据数据源不同采用不同的采集方式:
DevOps实体(从阿里云DevOps API采集)
实体类型 | 说明 | 数据源 | 采集方式 |
| 代码仓库 | DevOps API | 列举组织下所有仓库 |
| 代码发布 | DevOps API | 获取仓库Tag列表 |
| 开发人员 | DevOps API | 遍历仓库成员并去重 |
容器镜像实体(从阿里云ACR采集)
实体类型 | 说明 | 数据源 | 采集方式 |
| 镜像仓库 | ACR API | 列举镜像仓库列表 |
| 容器镜像 | ACR API | 遍历仓库获取镜像标签 |
K8s实体(从可观测监控CMS采集)
实体类型 | 说明 | 数据源 | 采集方式 |
| K8s Pod | CMS指标查询 | 查询Pod实体数据 |
其他关系的生成方式
以下列出的是DevOps场景Demo中涉及的关系类型,实际项目中请根据实体间的业务关联选择合适的关系类型,并配置相应的生成规则。
DevOps场景中的关系根据生成方式可分为静态关系和动态关系:
静态关系(基于配置文件)
关系类型 | 源实体 | 目标实体 | 配置方式 | 数据源 |
| 开发人员 | 代码仓库 | YAML配置文件 |
|
| APM服务 | 代码仓库 | YAML配置文件 |
|
| APM服务 | 代码发布 | 混合关系(静态+动态) |
|
| 开发人员 | APM服务 | 混合关系(静态+动态) |
|
| 开发人员 | 镜像仓库 | 动态对动态 |
|
动态关系(基于数据关联)
关系类型 | 源实体 | 目标实体 | 关联方式 | 匹配规则 |
| 代码发布 | 代码仓库 | 字段匹配 | 通过repo_id关联 |
| 容器镜像 | 镜像仓库 | 字段匹配 | 通过registry_id关联 |
| 容器镜像 | 代码发布 | Tag匹配 | 镜像Tag与发布Tag匹配 |
| 镜像仓库 | 容器镜像 | 字段匹配 | 通过registry_id关联 |
| K8s Pod | 容器镜像 | 镜像名匹配 | Pod容器镜像与镜像实体匹配 |
实体与关系的上传策略参考
以下是DevOps场景Demo的上传策略配置示例,实际项目中需要根据数据变化频率、数据量大小、业务实时性要求等因素调整策略类型、执行频率和KeepAlive时间。
实体/关系 | 策略 | 频率 | KeepAlive | 数据源 |
devops.developer | 定时全量 | 每天1次 | 2天 | DevOps API |
devops.code_repository | 定时全量 | 1小时 | 2小时 | DevOps API |
devops.code_release | 定时增量 | 5分钟 | 2小时 | DevOps API |
devops.image_registry | 定时全量 | 1小时 | 2小时 | ACR API |
devops.image | 定时增量 | 30分钟 | 2小时 | ACR API |
k8s.pod | 实时查询 | 5 分钟 | 10 分钟 | K8S Server |
developer manages code_repository | 定时全量 | 每小时 | 2小时 | 配置文件 |
code_release sourced_from code_repository | 定时增量 | 5分钟 | 2小时 | 字段关联 |
image sourced_from image_registry | 定时增量 | 30分钟 | 2小时 | 字段关联 |
image sourced_from code_release | 定时增量 | 30分钟 | 2小时 | Tag匹配 |
image_registry contains image | 定时增量 | 30分钟 | 2小时 | 字段关联 |
pod uses image | 实时查询 | 5 分钟 | 10分钟 | 镜像名匹配 |
apm.service sourced_from code_repository | 定时全量 | 4 小时 | 8 小时 | 配置文件 |