基于 UModel 高效构建可观测场景统一实体搜索引擎

简介: 在复杂的云原生环境中,服务、Pod、主机等可观测实体动辄成千上万,散落在 APM、K8s、云资源等多个系统中。当故障发生时,如何快速从海量数据中“找到那个出问题的服务”,成为 SRE 和运维工程师的核心挑战。

作者:路遥


01 背景


在可观测性系统中,UModel 定义了统一的数据模型(Schema),UModel 查询专注于探索知识图谱元数据,而 Entity 查询则用于查询和检索具体的实体实例数据。Entity 查询基于 USearch 引擎,提供了强大的全文检索、精确查找、条件过滤等能力,支持跨域、跨实体类型的联合查询。


与 UModel 查询关注 Schema 定义不同,Entity 查询专注于运行时实体数据,帮助用户快速定位、检索和分析具体的实体实例,如服务实例、Pod 实例、主机实例等。


1.1 Entity 查询解决的问题

在实际的可观测性场景中,我们经常需要:

  1. 快速定位实体根据关键词、属性值快速找到相关实体
  2. 跨域检索在多个域(APM、K8s、云资源等)中联合搜索
  3. 精确查询根据已知的实体 ID 批量查询详细信息
  4. 条件过滤基于实体属性进行复杂的条件筛选
  5. 统计分析对实体数据进行聚合分析和计算


Entity 查询通过 USearch 引擎的统一接口,解决了传统多系统查询的痛点,提供了高效、灵活的实体检索能力。


1.2 三种查询类型的区别

在 EntityStore 中,存在三种不同类型的查询:


EntityStore 是 UModel 系统中的统一存储引擎,负责存储和管理可观测性领域的核心 Metadata 数据,包括 UModel 元数据、实体数据和实体关系数据。它为可观测性分析提供高性能的数据存储和查询能力。

1765183643219_04598e57b6f546a382fde6aa1022ef31.png

Entity 查询专注于实体实例数据,是日常运维和问题排查中最常用的查询方式。


02 Entity 查询介绍


2.1 数据模型

三层存储结构

USearch 采用分层存储结构,确保数据的逻辑隔离和高效查询:

  1. Workspace 层最顶层隔离单位,不同 workspace 之间完全隔离
  2. Domain 层域级别的分类,用于业务逻辑分组(如 apm、k8s、acs 等)
  3. EntityType 层具体的实体类型,包含实际的实体数据(如 apm.service、k8s.pod 等)


Workspace: my-observability
├── Domain: apm
│   ├── EntityType: apm.service
│   ├── EntityType: apm.host  
│   └── EntityType: apm.instance
├── Domain: k8s
│   ├── EntityType: k8s.pod
│   ├── EntityType: k8s.node
│   └── EntityType: k8s.service
└── Domain: acs
    ├── EntityType: acs.ecs.instance
    └── EntityType: acs.rds.instance


数据存储特点

  • 唯一性保证在同一 EntityType 下,__entity_id__ 保证唯一性
  • 列式存储支持多行多列的表结构数据,支持 SPL 进行统计分析
  • 索引优化针对检索场景进行全文索引优化,支持多关键词检索和 Ranking 打分
  • 时序支持支持基于时间范围的数据查询和过滤,支持回溯任意时刻的实体和关系状态


2.2 USearch 核心功能

检索能力

USearch 提供强大的全文检索能力,支持:

  • 多类型联合检索跨多个 domain 和 entity_type 进行联合查询,统一打分排序
  • 多关键词检索打分基于词权重、字段权重等信息计算相关性分数
  • 智能分词自动分词和相关性打分,提高检索准确性


-- 检索所有domain中包含"cart"的实体
.entity with(domain='*', name='*', query='cart')

扫描能力

除了检索模式,USearch 还支持扫描模式,读取原始数据后通过 SPL 进行更多的过滤和计算,适用于需要复杂数据处理的场景。


-- 扫描apm域中香港区域的应用数量
.entity with(domain='apm', name='apm.service')
| where region_id = 'cn-hongkong'
| stats count = count()


2.3 查询语法

基础语法结构


.entity with(
    domain='domain_pattern',     -- 域过滤模式
    name='type_pattern',         -- 类型过滤模式  
    query='search_query',        -- 查询条件
    topk=10,                     -- 返回条数
    ids=['id1','id2','id3']      -- 精确ID查询
)

参数详解

1765183811214_1f24018569954df4957173361a27dca5.png

fnmatch 语法说明支持通配符匹配,如 *匹配任意字符,?匹配单个字符。参考 fnmatch 文档:https://docs.python.org/3/library/fnmatch.html

域和类型过滤模式


-- 匹配模式示例
.entity with(domain='ac*')           -- ac开头的domain
.entity with(domain='a*c')           -- a开头、c结尾的domain  
.entity with(name='*instance')       -- 以instance结尾的类型
.entity with(name='k8s.*')           -- k8s域下的所有类型
.entity with(domain='*', name='*')   -- 所有domain和类型


03 查询模式详解


3.1 精确 ID 查询

当知道具体的实体 ID 时,使用 ids 参数进行精确查询:


-- 查询特定ID的实体
.entity with(
    domain='apm', 
    name='apm.service', 
    ids=['4567bd905a719d197df','973ad511dad2a3f70a']
)


适用场景

  • 根据告警中的实体 ID 查询详细信息
  • 验证特定实体的存在性和状态
  • 批量查询已知 ID 的实体信息


3.2 全文检索模式

基础全文搜索


-- 简单关键词搜索
.entity with(query='web application')
-- 多词OR关系(默认行为)
.entity with(query='kubernetes docker container')


搜索特性

  • 多个词之间是 OR 关系,出现任意一个词即满足条件
  • 搜索所有字段,包括系统字段和自定义字段
  • 自动分词和相关性打分

短语搜索

对于通过符号连接(-)的词,必须在同一字段下完整匹配:


-- 完整短语匹配
.entity with(query='opentelemetry.io/name-fraud-detection')
-- 普通搜索(命中任意一个词)
.entity with(query='opentelemetry.io/name cart')

字段限定搜索

指定在特定字段中搜索:


-- 在描述字段中搜索
.entity with(query='description:"error handling service"')
-- 在自定义属性中搜索
.entity with(query='cluster_name:production')
-- 在标签中搜索
.entity with(query='labels.team:backend')

逻辑条件组合

支持 and、or、not 逻辑运算符:


-- AND条件:同时满足两个条件
.entity with(query='service_name:web AND status:running')
-- OR条件:满足任一条件
.entity with(query='environment:prod OR environment:staging')
-- NOT条件:满足左侧、不满足右侧
.entity with(query='type:service NOT status:stopped')
-- 复杂组合
.entity with(query='(cluster:prod OR cluster:staging) AND NOT status:maintenance')


特殊字符处理

  • 包含特殊字符(如 |:)的查询必须用双引号包含
  • 示例:query='description:"ratio is 1:2"'


3.3 多类型联合检索

支持跨多个 domain 和 entity_type 进行联合查询,统一打分排序:


-- 检索所有domain中包含"cart"的实体
.entity with(domain='*', name='*', query='cart') 
-- 检索所有domain中包含"service"的实体类型,属性中存在"production"的实体
.entity with(domain='*', name='*service*', query='production')
-- 检索特定domain下的多种实体类型,属性中存在"error"或"rate"的实体
.entity with(domain='apm', name='apm.*', query='error rate')


3.4 结合 SPL 进行数据计算分析

无论检索模式还是扫描模式,都可以结合 SPL 进行更深入的数据计算:


-- 检索apm域中在香港区域的不同语言的应用数量,按照应用数量降序排列
.entity with(domain='apm', name='apm.service') 
| where region_id = 'cn-hongkong'
| stats count = count() by language 
| project language, count 
| sort count desc


04 打分和排序机制


4.1 相关性打分

USearch 使用多因素综合打分算法:

  1. 词频权重关键词在文档中出现的频率
  2. 字段权重不同字段的重要性权重(如名称字段权重高于描述字段)
  3. 文档长度较短文档中的匹配通常得分更高
  4. 逆文档频率稀有词汇获得更高权重


4.2 排序规则

默认按相关性分数降序排列,分数相同时按时间戳排序:


-- 默认相关性排序
.entity with(query='web service error', topk=20)
-- 结合SPL自定义排序
.entity with(query='kubernetes pod')
| sort __last_observed_time__ desc
| limit 50
-- 多字段排序
.entity with(domain='apm', name='apm.service')
| sort cluster asc, service_name asc


05 Entity 查询具体应用场景


5.1 场景一:快速定位和检索实体

问题描述线上出现告警或需要查找特定实体时,需要快速定位相关实体实例。

解决方案根据场景选择不同的查询方式。


-- 方式1:根据告警中的实体ID精确查询
.entity with(
    domain='apm', 
    name='apm.service', 
    ids=['4567bd905a719d197df','973ad511dad2a3f70a']
)
-- 方式2:根据关键词全文检索
.entity with(query='user-service error', topk=10)
-- 方式3:字段限定精确查询
.entity with(query='service_name:user-service')
-- 方式4:通过标签查找特定团队的服务
.entity with(
    domain='apm', 
    name='apm.service', 
    query='labels.team:backend AND labels.language:java AND status:running'
)


效果:快速获取问题实体的完整信息,包括状态、属性、标签等,支持多种查询方式满足不同场景需求。


5.2 场景二:跨域联合检索

问题描述需要在多个域(APM、K8s、云资源等)中搜索包含特定关键词的实体,避免在多系统间切换。

解决方案使用多类型联合检索。


-- 在所有域中搜索包含"error"的实体
.entity with(domain='*', name='*', query='error', topk=50)
-- 检索特定前缀domain下的多种实体类型
.entity with(domain='apm*', name='*', query='error', topk=50)


效果统一接口检索跨域实体,打破数据孤岛,提高查询效率。


5.3 场景三:条件过滤和数据分析

问题描述需要找出满足特定条件的实体,并进行统计分析,识别问题模式或进行数据洞察。

解决方案结合 SPL 进行条件过滤和聚合分析。


-- 找出java语言的apm服务,按集群统计
.entity with(domain='apm', name='apm.service') 
| where language='java'
| stats count=count() by cluster
-- 查询生产环境或预发环境中运行的服务
.entity with(query='(environment:prod OR environment:staging) AND status:running')
| stats count=count() by environment, cluster
-- 检索apm域中ARMS生产应用在不同区域的数量,按照应用数量降序排列
.entity with(domain='apm', query='environment:prod') 
| where telemetry_client='ARMS' 
| stats service_count = count() by service, region_id 
| project region_id, service, service_count 
| sort service_count desc


效果快速识别问题实体,进行数据聚合分析,发现数据模式。


06 性能优化建议


6.1 使用精确匹配

字段限定查询比全文搜索更高效:


-- ❌ 全文搜索(较慢)
.entity with(query='production')
-- ✅ 字段限定(更快)
.entity with(query='environment:production')


6.2 避免前缀通配符

后缀通配符比前缀通配符性能更好:


-- ❌ 前缀通配符(较慢)
.entity with(name='*service')
-- ✅ 后缀通配符(更快)
.entity with(name='service*')


6.3 合理使用逻辑运算符

简单的 AND 条件比复杂的 OR 条件更高效:


-- ✅ 简单AND条件
.entity with(query='status:running AND cluster:prod')
-- ⚠️ 复杂OR条件(性能较差)
.entity with(query='name:a OR name:b OR name:c OR name:d')


6.4 合理设置 topk

根据实际需求设置 topk 值,避免返回过多不必要的数据:


-- 只需要前10条结果
.entity with(query='error', topk=10)
-- 需要更多结果时再增加
.entity with(query='error', topk=100)


07 总结


Entity 查询作为 EntityStore 中用于查询实体实例的核心接口,为可观测性场景提供了强大的检索和分析能力。通过 Entity 查询,用户可以:


  1. 快速定位通过关键词、ID、条件快速找到目标实体
  2. 跨域检索统一接口查询多个域的实体数据
  3. 精确查询支持字段限定、逻辑组合等精确查询方式
  4. 数据分析结合 SPL 进行复杂的数据过滤和统计分析


这些能力使得 Entity 查询成为日常运维、问题排查、数据分析等场景中不可或缺的工具,为可观测性数据的有效利用提供了坚实的基础。

相关文章
|
11天前
|
机器学习/深度学习 人工智能 运维
AIOps已逝,欢迎进入AgenticOps(运维智能体)时代
GenAI和智能体技术的爆发,为IT运维打开了一扇新的大门,一个更具主动性、自治性和协作性的新时代已经来临,这就是AgenticOps(基于智能体的IT运维)。
|
26天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
816 225
|
13天前
|
搜索推荐 Java 关系型数据库
基于Android的在线音乐个性化推荐APP系统
本研究聚焦数字时代下在线音乐个性化推荐APP的开发,探讨其背景、意义与技术实现。面对海量音乐内容带来的发现难题,结合Android Studio、Java、SpringBoot与MySQL等技术,构建智能推荐系统,提升用户体验与平台价值,推动音乐产业数字化发展。
|
19天前
|
人工智能 运维 监控
从代码到生产推理服务:DevPod 全流程部署 DeepSeek-OCR 模型实战指南
DevPod重塑AI开发范式,实现从云端开发、调试到生产部署的全流程闭环。依托预置环境与GPU资源,一键完成模型服务化,打通AI落地“最后一公里”,让开发者专注业务创新。
|
2月前
|
数据采集 监控 API
告别手动埋点!Android 无侵入式数据采集方案深度解析
传统的Android应用监控方案需要开发者在代码中手动添加埋点,不仅侵入性强、工作量大,还难以维护。本文深入探讨了基于字节码插桩技术的无侵入式数据采集方案,通过Gradle插件 + AGP API + ASM的技术组合,实现对应用性能、用户行为、网络请求等全方位监控,真正做到零侵入、易集成、高稳定。
505 39
|
2月前
|
人工智能 安全 API
近期 AI 领域的新发布所带来的启示
2024 年以来,AI 基础设施的快速发展过程中,PaaS 层的 AI 网关是变化最明显的基建之一。从传统网关的静态规则和简单路由开始,网关的作用被不断拉伸。用户通过使用网关来实现多模型的流量调度、智能路由、Agent 和 MCP 服务管理、AI 治理等,试图让系统更灵活、更可控、更可用。国庆期间 AI 界发布/升级了一些产品,我们在此做一个简报,从中窥探下对 AI 网关演进新方向的启示。
382 33
|
2月前
|
消息中间件 弹性计算 运维
PalmPay 携手阿里云 RocketMQ,共建非洲普惠金融“高速通道”
通过采用阿里云云消息队列 RocketMQ 版,PalmPay 成功构建了一套高可用、高可靠、高弹性的消息中间件体系,全面提升了系统的稳定性、消息处理效率与业务连续性。云消息队列 RocketMQ 版在支付消息通知、高并发交易处理以及资源弹性伸缩等方面发挥了关键作用,有力支撑了 PalmPay 在非洲市场快速增长的数字支付需求。
298 17
|
1月前
|
分布式计算 监控 API
DMS Airflow:企业级数据工作流编排平台的专业实践
DMS Airflow 是基于 Apache Airflow 构建的企业级数据工作流编排平台,通过深度集成阿里云 DMS(Data Management Service)系统的各项能力,为数据团队提供了强大的工作流调度、监控和管理能力。本文将从 Airflow 的高级编排能力、DMS 集成的特殊能力,以及 DMS Airflow 的使用示例三个方面,全面介绍 DMS Airflow 的技术架构与实践应用。
|
22天前
|
区块链 数据安全/隐私保护 计算机视觉
FSViewer看图软件安装教程!可以批量格式转换、批量重命名、批量压缩的看图软件(还有其他几款看图软件可以看看)
FSViewer是一款功能强大的免费看图软件,支持BMP、JPG、PNG、GIF、RAW等主流图片格式,具备快速浏览、批量格式转换、重命名、压缩及图片编辑功能,操作简便,适合日常图像处理需求。
217 72
|
11天前
|
JSON 监控 数据可视化
云监控 UModel Explorer:用“图形化”重新定义可观测数据建模
阿里云 UModel Explorer 正式发布:告别复杂配置,拖拽即建模,点击即洞察,实现建模、探索、分析一体化,让可观测真正高效协同,开启可视化运维新时代!
134 15