Phase 2 Object模式 - 服务发现

应用案例

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

1. Object模式概述

Object 模式提供面向实体(EntitySet)的抽象访问方式,通过统一的SPL接口调用实体的方法来获取与实体相关的各类观测数据或元信息。相比于直接访问数据集(Phase 1 Table模式),Object模式具备以下特点:

  • 面向对象:以EntitySet为中心组织能力,语义清晰、贴近业务对象。

  • 动态能力:运行时可发现实体支持的方法并进行调用(类似“反射”)。

  • 自动映射:自动应用DataLink/StorageLink字段映射与过滤条件。

  • 关系语义:天然支持实体与实体之间的关系数据访问。

基本语法:

.entity_set with(domain='域名', name='实体名称', [ids|query|其他参数])
| entity-call 方法名(参数...)

通用参数:

参数名

类型

必填

说明

示例值

domain

string

EntitySet 所属域

‘apm’

name

string

EntitySet 名称

‘apm.service’

ids

array

实体ID列表

[‘id1’,‘id2’]

query

string

过滤条件,请参考 SPL 表达式语法

‘service_id = “xxx”’

适用场景:

  • 需要基于业务实体(如服务、接口、主机)进行观测与分析。

  • 需要自动处理字段映射与过滤条件,降低调用复杂度。

  • 需要在不同实体/关系上复用统一的“方法”语义。

Table模式对比:

  • Table模式:直接访问MetricSet/LogSet/...,控制更细,但需感知底层细节。

  • Object模式:以实体为中心,方法即能力,具备更高层的抽象与可组合性。

2. 动态能力发现(运行时方法反射)

Object 模式的核心是“动态能力发现”。通过内置方法__list_method__,运行时枚举当前EntitySet支持的全部方法及其参数与返回结构描述,再按需进行自适应调用。

2.1 列出可用方法

.entity_set with(domain='apm', name='apm.service')
| entity-call __list_method__()

返回字段:

字段

说明

示例值

name

方法内部名称(用于调用)

get_entity_set

display_name

方法展示名称

Get Current EntitySet

description

方法功能描述

Return the current EntitySet definition

params

参数Schema(JSON Array)

[{"key":"dest_entity_set_domain","type":"varchar","display_name":"Destination Entity Domain (empty for all domains)","description":"","required":false}, {...}]

returns

返回值Schema(JSON Array)

[{"key":"entity_set_id","type":"varchar","display_name":"EntitySet id, the format is domain@entity_set@name","description":""},{...}]

方法列表示例(节选):

name

display_name

description

list_method

List Available Methods

获取当前EntitySet可用方法

inspect

Configuration Inspector

校验UModel配置完整性与合理性

list_data_set

List DataSets

列出当前实体关联的数据集

list_related_entity_set

List Related EntitySets

列出与当前实体相关的其他实体

get_golden_metrics

Get Golden Metrics

获取实体的黄金指标数据

get_metric

Get Metric

获取关联MetricSet的指标数据

get_label_values

Get Label Values

获取关联MetricSet的标签值

get_log

Get Log

获取关联LogSet的日志数据

get_profile

Get Profile

获取关联ProfileSet的性能剖析数据

说明:__list_method__的返回会根据实体实际关联的数据集与关系而变化,因而具备“自适应发现”能力。

2.2 读取方法元信息并自适应调用

典型流程:

  1. 发现能力。

.entity_set with(domain='apm', name='apm.service')
| entity-call __list_method__()
  1. 过滤并选择目标方法(例如:get_golden_metrics)。

  2. 自适应组装参数并调用。

.entity_set with(domain='apm', name='apm.service', query='service_id = "order-service"')
| entity-call get_golden_metrics('range', '1m')

另一示例:自适应访问实体关联的数据集清单并进行方法选择:

.entity_set with(domain='apm', name='apm.service')
| entity-call list_data_set(['metric_set'], true)

根据返回的data_set_idfields_mapping,上层可以自动拼装get_metric的参数与查询过滤条件。

3. 能力发现与调用的标准流程

  1. 锁定实体上下文:domainname,可选idsquery

  2. 枚举可用方法:__list_method__()

  3. 读取方法签名:paramsreturns(JSON描述)。

  4. 选择方法并准备参数(必要时结合list_data_setlist_related_entity_set)。

  5. 执行entity-call调用,获取数据或SPL(DryRun模式下返回SPL)。

注意:

  • 若实体未关联任何数据集或关系,仅返回基础方法(如__list_method____inspect__等)。

  • 方法的可用性与参数要求会随实体关联的DataSet/Link变化。

4. 典型用法示例

4.1 发现实体可用方法

.entity_set with(domain='apm', name='apm.service')
| entity-call __list_method__()

4.2 获取黄金指标(基于发现结果)

.entity_set with(domain='apm', name='apm.service', query='service_id = "order-service"')
| entity-call get_golden_metrics('range', '1m')

4.3 查实体关联数据集并继续调用

.entity_set with(domain='apm', name='apm.service')
| entity-call list_data_set(['metric_set'], true)

根据返回:

字段

说明

data_set_id

关联数据集唯一标识,如apm@metric_set@apm.metric.apm.service

type

数据集类型,如metric_set

fields_mapping

字段映射,指导参数与过滤条件自动拼装

随后可继续:

.entity_set with(domain='apm', name='apm.service', query='service_id = "order-service"')
| entity-call get_metric('apm', 'apm.metric.apm.service', 'request_count', 'range', '1m')

5. 最佳实践

  • 先发现、再调用:优先使用__list_method__()确定实体在当前上下文下支持的能力,再按需调用。

  • 结合list_data_setlist_related_entity_set:自动化构建参数与过滤条件。

  • 使用DryRun调试:

.set "umodel_paas_mode"='dry_run';

.entity_set with(domain='apm', name='apm.service')
| entity-call get_metric('apm', 'apm.metric.apm.service', 'request_count')

DryRun将返回可执行SPL,便于审查字段映射与查询生成是否符合预期。

  • 缓存方法清单:方法清单相对稳定,可在应用侧短时缓存提升效率。