點擊此處,立即查看視頻課程!
背景
想象一下,你站在一個巨大的圖書館裏,這裏有成千上萬本書,但每本書的目錄都散落在不同的房間裏,而且每間房間的索引方式都不一樣。當你想要找一本關於“服務調用”的書時,你需要在 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 查詢
2.1 數據模型
數據結構
UModel 查詢返回的數據具有固定的五字段結構:
注意:metadata、schema、spec 是 JSON 格式的 string,需要使用 json_extract_scalar 函數進行提取。
數據示例
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 字符描述關係方向:
查詢 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 查詢可以:
- 探索 Schema 結構:快速瞭解系統中定義的所有實體類型和關係類型
- 分析數據模型:深入分析 EntitySet 的字段設計、主鍵配置、複雜度等
- 構建關係圖譜:通過圖查詢分析實體間的關聯關係,理解知識圖譜的拓撲結構
- 質量檢查:驗證元數據的完整性和一致性
- 跨域分析:分析不同域之間的關聯模式
- 快速檢索:在大量元數據中快速定位目標定義
這些能力使得 UModel 查詢成為數據建模分析、Schema 管理和知識圖譜探索的不可或缺的工具,為構建和維護高質量的可觀測性數據模型提供了堅實的基礎。
點擊此處查看視頻演示。