點擊此處,立即查看視頻課程!

背景

想象一下,你站在一個巨大的圖書館裏,這裏有成千上萬本書,但每本書的目錄都散落在不同的房間裏,而且每間房間的索引方式都不一樣。當你想要找一本關於“服務調用”的書時,你需要在 APM 房間、K8s 房間、雲資源房間之間來回奔波,還要記住每個房間不同的查找規則...

這就是很多企業在可觀測性領域面臨的真實困境。而 UModel 就像是為這個混亂的圖書館建立了一套統一的“智能管理系統”,讓你能夠輕鬆探索和理解整個知識圖譜的結構。

1.1 UModel 是什麼

UModel 是一種基於圖模型的可觀測數據建模方法,旨在解決企業級環境中可觀測數據採集、組織和利用的核心挑戰。UModel 採用 Node(節點)和 Link(邊)組成的圖結構來描述 IT 世界,通過標準化的數據建模方式,實現可觀測數據的統一表示、存儲解耦和智能分析。

作為阿里雲可觀測體系的數據建模基礎,UModel 為企業提供了一套通用的可觀測“交互語言”,讓人、程序和 AI 都能夠理解和分析可觀測數據,從而構建真正的全棧可觀測能力。

核心概念

UModel 採用圖論的基本概念,使用 Node(節點)和 Link(邊)組成有向圖來描述 IT 系統:

  • Node(節點):核心部分為 Set(數據集),表示同類型實體或數據的集合,如 EntitySet(實體集)、MetricSet(指標集)、LogSet(日誌集)等;此外還包含數據集的存儲類型(Storage),如 SLS、Prometheus、MySQL 等
  • Link(關聯):表示 Node 之間的關係,如 EntitySetLink(實體關聯)、DataLink(數據關聯)、StorageLink(存儲關聯)等
  • Field(字段):用於約束和描述 Set 和 Link 的屬性,包含名稱、類型、約束規則、分析特性等 20 多種配置項

1.2 UModel 查詢是什麼

UModel 查詢是 EntityStore 中用於查詢知識圖譜元數據的專用查詢接口,通過 .umodel 查詢語法,可以探索 EntitySet 定義、EntitySetLink 關係以及完整的知識圖譜結構,為數據建模分析和 Schema 管理提供強大支持。

查詢目標區分

UModel 查詢與其他查詢類型的區別:

UModel 查詢:阿里雲如何通過圖模型實現企業級可觀測數據的統一建模與分析_元數據

UModel 查詢專注於元數據層面的探索,幫助用户理解數據模型的結構和定義,而非具體的運行時數據。

UModel 查詢

2.1 數據模型

數據結構

UModel 查詢返回的數據具有固定的五字段結構:

UModel 查詢:阿里雲如何通過圖模型實現企業級可觀測數據的統一建模與分析_雲原生_02

注意:metadata、schemaspec 是 JSON 格式的 string,需要使用 json_extract_scalar 函數進行提取。

數據示例

UModel 查詢:阿里雲如何通過圖模型實現企業級可觀測數據的統一建模與分析_阿里雲_03

2.2 查詢語法

基礎查詢語法
-- 基礎查詢格式
.umodel | [SPL操作...]
-- 帶限制條件的查詢
.umodel | where <condition> | limit <count>
核心查詢模式
1. List 場景 - 列表查詢

查詢所有 UModel 數據:

-- 列出所有umodel數據(不建議使用)
.umodel
-- 帶分頁的查詢
.umodel | limit 0, 10

按類型過濾:

-- 查詢所有EntitySet定義
.umodel | where kind = 'entity_set' | limit 0, 10
-- 查詢所有EntitySetLink定義
.umodel | where kind = 'entity_set_link' | limit 0, 10
-- 查詢所有邊類型(關係定義)
.umodel | where __type__ = 'link' | limit 0, 10
-- 查詢所有節點類型(實體定義)
.umodel | where __type__ = 'node' | limit 0, 10

按屬性過濾:

-- 查詢特定名稱的實體定義
.umodel | where json_extract_scalar(metadata, '$.name') = 'acs.ecs.instance' | limit 0, 10
-- 查詢特定域的所有定義
.umodel | where json_extract_scalar(metadata, '$.domain') = 'apm' | limit 0, 10
-- 查詢多個域的定義
.umodel | where json_extract_scalar(metadata, '$.domain') in ('acs', 'apm', 'k8s') | limit 0, 10
2. 圖計算場景 - 關係分析

UModel 支持基於元數據的圖計算,用於分析 EntitySet 之間的關係:

基礎圖查詢語法:

.umodel | graph-match <path> project <output>

基礎概念:

在圖查詢中,有兩個關鍵性的圖概念:

節點類型,即 label 信息,在 UModel 的元數據圖查詢中,為 <domain>@<kind>,例如 apm@entity_set 節點 ID,即 __entity_id__ 信息,在 UModel 的元數據圖查詢中,為 kind::domain::name,例如 entity_set::apm::apm.service

圖查詢路徑(PATH)使用 ASCII 字符描述關係方向:

UModel 查詢:阿里雲如何通過圖模型實現企業級可觀測數據的統一建模與分析_阿里雲_04

查詢 EntitySet 的鄰居關係:

-- 查詢特定EntitySet的所有關聯關係
.umodel 
| graph-match (s:"acs@entity_set" {__entity_id__: 'entity_set::acs::acs.ecs.instance'})
              -[e]-(d) 
  project s, e, d | limit 0, 10

方向性關係查詢:

-- 查詢指向某個EntitySet的關係
.umodel 
| graph-match (s:"acs@entity_set" {__entity_id__: 'entity_set::acs::acs.ecs.instance'})
              <--(d) 
  project s, d | limit 0, 10
-- 查詢從某個EntitySet出發的關係  
.umodel 
| graph-match (s:"acs@entity_set" {__entity_id__: 'entity_set::acs::acs.ack.cluster'})
              -->(d) 
  project s, d | limit 0, 10

2.3 高級查詢功能

JSON 路徑提取

由於 UModel 數據採用 JSON 結構存儲,需要使用 JSON 函數進行字段提取:

-- 提取基礎信息
.umodel 
| extend 
    entity_name = json_extract_scalar(metadata, '$.name'),
    entity_domain = json_extract_scalar(metadata, '$.domain'),
    entity_description = json_extract_scalar(metadata, '$.description.zh_cn')
| project entity_name, entity_domain, entity_description | limit 0, 100
複雜條件篩選
-- 多條件組合查詢
.umodel 
| where kind = 'entity_set'
  and json_extract_scalar(metadata, '$.domain') in ('apm', 'k8s')
  and json_array_length(json_extract(spec, '$.fields')) > 5
| extend 
    entity_name = json_extract_scalar(metadata, '$.name'),
    field_count = json_array_length(json_extract(spec, '$.fields'))
| sort field_count desc
| limit 20
聚合分析
-- 按域統計EntitySet數量
.umodel 
| where kind = 'entity_set'
| extend domain = json_extract_scalar(metadata, '$.domain')
| stats entity_count = count() by domain
| sort entity_count desc

2.4 性能優化建議

使用精確過濾
-- 優化前:範圍過大
.umodel | where json_extract_scalar(metadata, '$.name') like '%service%'
-- 優化後:精確匹配
.umodel | where kind = 'entity_set' 
  and json_extract_scalar(metadata, '$.domain') = 'apm'
  and json_extract_scalar(metadata, '$.name') = 'apm.service'
過濾前置
-- 優化前:後期過濾
.umodel 
| extend name = json_extract_scalar(metadata, '$.name')
| where name = 'apm.service'
-- 優化後:過濾前置
.umodel 
| where json_extract_scalar(metadata, '$.name') = 'apm.service'
| extend name = json_extract_scalar(metadata, '$.name')
圖查詢優化
-- 優化前:全圖搜索
.umodel | graph-match (s)-[e]-(d) project s, e, d
-- 優化後:指定起始點
.umodel 
| graph-match (s:"apm@entity_set" {__entity_id__: 'entity_set::apm::apm.service'})
              -[e]-(d) 
  project s, e, d

UModel 查詢具體應用場景

UModel 查詢在實際應用中能夠解決多種場景下的問題,為數據建模、Schema 管理和知識圖譜分析提供強大支持。

3.1 Schema 探索與發現

場景描述

在大型可觀測性系統中,可能存在數百個 EntitySet 定義,分佈在不同的域(domain)中。用户需要快速瞭解系統中定義了哪些實體類型,以及它們的基本信息。

應用示例

探索所有實體類型:

-- 列出所有EntitySet及其基本信息
.umodel 
| where kind = 'entity_set'
| extend 
    entity_name = json_extract_scalar(metadata, '$.name'),
    entity_domain = json_extract_scalar(metadata, '$.domain'),
    description = json_extract_scalar(metadata, '$.description.zh_cn')
| project entity_name, entity_domain, description
| sort entity_domain, entity_name
| limit 0, 100

按域分類查看:

-- 查看特定域(如APM)下的所有實體定義
.umodel 
| where kind = 'entity_set' 
  and json_extract_scalar(metadata, '$.domain') = 'apm'
| extend 
    entity_name = json_extract_scalar(metadata, '$.name'),
    description = json_extract_scalar(metadata, '$.short_description.zh_cn')
| project entity_name, description
| limit 0, 50

3.2 數據建模分析

場景描述

在進行數據建模優化時,需要分析現有 EntitySet 的字段複雜度、主鍵設計、索引配置等信息,以便識別需要優化的模型。

應用示例

分析字段複雜度:

-- 分析各域下EntitySet的字段數量分佈
.umodel 
| where kind = 'entity_set'
| extend 
    domain = json_extract_scalar(metadata, '$.domain'),
    entity_name = json_extract_scalar(metadata, '$.name'),
    field_count = json_array_length(json_extract(spec, '$.fields'))
| stats 
    avg_fields = avg(field_count),
    max_fields = max(field_count),
    min_fields = min(field_count),
    entity_count = count()
  by domain
| sort entity_count desc

查找複雜實體:

-- 找出字段數量最多的EntitySet(可能需要優化)
.umodel 
| where kind = 'entity_set'
| extend 
    entity_name = json_extract_scalar(metadata, '$.name'),
    domain = json_extract_scalar(metadata, '$.domain'),
    field_count = json_array_length(json_extract(spec, '$.fields'))
| sort field_count desc
| limit 20

3.3 關係圖譜分析

場景描述

理解 EntitySet 之間的關係對於構建完整的知識圖譜至關重要。通過圖查詢可以分析實體間的關聯關係,發現數據模型中的依賴和連接。

應用示例

查詢實體的所有關聯關係:

-- 查詢某個EntitySet(如apm.service)的所有關聯關係
.umodel 
| graph-match (s:"apm@entity_set" {__entity_id__: 'entity_set::apm::apm.service'})
              -[e]-(d) 
  project s, e, d
| limit 0, 50

分析關係類型分佈:

-- 統計不同關係類型的數量
.umodel 
| where kind = 'entity_set_link'
| extend 
    link_name = json_extract_scalar(metadata, '$.name'),
    link_type = json_extract_scalar(metadata, '$.link_type')
| stats limk_count = count() by link_type
| sort limk_count desc

查找特定關係:

-- 查找所有"runs_on"類型的關係定義
.umodel 
| where kind = 'entity_set_link'
  and json_extract_scalar(metadata, '$.link_type') = 'runs_on'
| extend 
    link_name = json_extract_scalar(metadata, '$.name'),
    source = json_extract_scalar(metadata, '$.source'),
    target = json_extract_scalar(metadata, '$.target')
| project link_name, source, target

3.4 元數據質量檢查

場景描述

確保 UModel 元數據的完整性和一致性,檢查缺失的描述、未定義的字段等問題。

應用示例

檢查缺失描述的 EntitySet:

-- 找出沒有中文描述的EntitySet
.umodel 
| where kind = 'entity_set'
  and (json_extract_scalar(metadata, '$.description.zh_cn') = '' 
       or json_extract_scalar(metadata, '$.description.zh_cn') is null)
| extend 
    entity_name = json_extract_scalar(metadata, '$.name'),
    domain = json_extract_scalar(metadata, '$.domain')
| project entity_name, domain

驗證字段定義完整性:

-- 檢查沒有定義字段的EntitySet
.umodel 
| where kind = 'entity_set'
  and (json_extract(spec, '$.fields') is null 
       or json_array_length(json_extract(spec, '$.fields')) = 0)
| extend 
    entity_name = json_extract_scalar(metadata, '$.name'),
    domain = json_extract_scalar(metadata, '$.domain')
| project entity_name, domain

3.5 跨域關聯分析

場景描述

在複雜的可觀測性系統中,不同域(如 APM、K8s、雲資源)的實體可能存在關聯關係。通過 UModel 查詢可以分析這些跨域的關聯模式。

應用示例

查找跨域關係:

-- 查找連接不同域的EntitySetLink
.umodel 
| where kind = 'entity_set_link'
| extend 
    link_name = json_extract_scalar(metadata, '$.name'),
    source_domain = json_extract_scalar(spec, '$.src.domain'),
    target_domain = json_extract_scalar(spec, '$.dest.domain')
| where source_domain != target_domain
| project link_name, source_domain, target_domain
| limit 0, 50

分析域間連接度:

-- 統計各域之間的連接關係數量
.umodel 
| where kind = 'entity_set_link'
| extend 
    source_domain = json_extract_scalar(spec, '$.src.domain'),
    target_domain = json_extract_scalar(spec, '$.dest.domain')
| stats count = count() by source_domain, target_domain
| sort count desc

3.6 版本與演進分析

場景描述

UModel Schema 會隨着業務發展而演進,需要跟蹤 Schema 的版本變化和演進歷史。

應用示例

查看 Schema 版本信息:

-- 查看所有EntitySet的Schema版本
.umodel 
| where kind = 'entity_set'
| extend 
    entity_name = json_extract_scalar(metadata, '$.name'),
    schema_version = json_extract_scalar(schema, '$.version'),
    schema_url = json_extract_scalar(schema, '$.url')
| project entity_name, schema_version, schema_url
| limit 0, 100

3.7 快速定位與檢索

場景描述

在大量元數據中快速找到特定的 EntitySet 或關係定義,支持模糊匹配和精確查詢。

應用示例

按名稱模糊搜索:

-- 搜索包含"service"的EntitySet
.umodel 
| where kind = 'entity_set'
  and json_extract_scalar(metadata, '$.name') like '%service%'
| extend 
    entity_name = json_extract_scalar(metadata, '$.name'),
    domain = json_extract_scalar(metadata, '$.domain')
| project entity_name, domain
| limit 0, 20

精確查找特定實體:

-- 精確查找特定EntitySet的完整定義
.umodel 
| where json_extract_scalar(metadata, '$.name') = 'apm.service'
| limit 1

總結

UModel 查詢作為 EntityStore 中專門用於查詢知識圖譜元數據的接口,為可觀測性數據建模提供了強大的支持能力。通過 UModel 查詢可以:

  1. 探索 Schema 結構:快速瞭解系統中定義的所有實體類型和關係類型
  2. 分析數據模型:深入分析 EntitySet 的字段設計、主鍵配置、複雜度等
  3. 構建關係圖譜:通過圖查詢分析實體間的關聯關係,理解知識圖譜的拓撲結構
  4. 質量檢查:驗證元數據的完整性和一致性
  5. 跨域分析:分析不同域之間的關聯模式
  6. 快速檢索:在大量元數據中快速定位目標定義

這些能力使得 UModel 查詢成為數據建模分析、Schema 管理和知識圖譜探索的不可或缺的工具,為構建和維護高質量的可觀測性數據模型提供了堅實的基礎。

點擊此處查看視頻演示。