OML 对象模型语言
OML (Object Modeling Language) 是 Warp Parse 使用的数据转换语言,用于对 WPL 解析后的结构化数据进行转换、聚合和富化。
📚 文档导航
按学习路径
🆕 新手入门
↓
01-quickstart.md ────────→ 5分钟上手,复制即用
↓
07-complete-example.md ──→ 🌟 完整功能演示(强烈推荐)
↓
02-core-concepts.md ─────→ 理解设计理念和核心概念
↓
03-practical-guide.md ───→ 按任务查找解决方案
↓
04-functions-reference.md → 查阅函数
↓
05-integration.md ───────→ 集成到数据流
按用户角色
| 我是… | 推荐阅读 |
|---|---|
| OML 新手 | 01-quickstart.md → 07-complete-example.md |
| 日常使用者 | 03-practical-guide.md - 按任务查找 |
| 开发者/集成 | 07-complete-example.md + 04-functions-reference.md |
| 系统集成 | 05-integration.md - WPL/OML/Sink 关联 |
按任务查找
| 我想… | 查看文档 |
|---|---|
| 🚀 快速上手 | 01-quickstart.md |
| 🌟 查看完整示例 | 07-complete-example.md |
| 💡 理解概念 | 02-core-concepts.md |
| 📝 提取字段 | 03-practical-guide.md § 数据提取 |
| 🔄 类型转换 | 03-practical-guide.md § 数据转换 |
| 📦 创建对象/数组 | 03-practical-guide.md § 数据聚合 |
| ✅ 条件判断 | 03-practical-guide.md § 条件处理 |
| 🔍 SQL 查询 | 03-practical-guide.md § 数据富化 |
| ⚙️ 查某个函数 | 04-functions-reference.md |
| 🔗 集成到流水线 | 05-integration.md |
| 📖 查语法规则 | 06-grammar-reference.md |
📖 文档列表
| 文档 | 内容 | 适合人群 |
|---|---|---|
| 01-quickstart.md | 5 分钟快速入门 + 3 个最常用操作 | 所有人 |
| 🌟 07-complete-example.md | 完整功能演示(强烈推荐) | 所有人 |
| 02-core-concepts.md | 设计理念 + 类型系统 + 读取语义 | 想深入理解的用户 |
| 03-practical-guide.md | 按任务组织的实战示例 | 日常使用者 |
| 04-functions-reference.md | 所有函数的标准化参考 | 开发者 |
| 05-integration.md | WPL/OML/Sink 集成指南 | 系统集成者 |
| 06-grammar-reference.md | EBNF 形式化语法定义 | 编译器开发者 |
⚡ 快速示例
基础字段提取
name : nginx_access
rule : /nginx/access_log
---
user_id = read(user_id) ;
uri = read(request_uri) ;
status : digit = read(status) ;
数据聚合
name : system_metrics
rule : /system/metrics
---
metrics : obj = object {
hostname : chars = read(hostname) ;
cpu : float = read(cpu_usage) ;
memory : float = read(mem_usage) ;
} ;
条件处理
name : log_classifier
rule : /app/logs
---
level = match read(status_code) {
in (digit(200), digit(299)) => chars(success) ;
in (digit(400), digit(499)) => chars(client_error) ;
in (digit(500), digit(599)) => chars(server_error) ;
_ => chars(unknown) ;
} ;
管道转换
name : data_transform
rule : /data/raw
---
# 时间转时间戳
ts = read(event_time) | Time::to_ts_zone(0, ms) ;
# URL 解析
domain = read(url) | url(domain) ;
path = read(url) | url(path) ;
# Base64 解码
decoded = read(base64_data) | base64_decode(Utf8) ;
SQL 数据富化
name : user_enrichment
rule : /app/user_activity
---
user_id = read(user_id) ;
# 从数据库查询用户信息
user_name, user_level =
select name, level
from users
where id = read(user_id) ;
🎯 核心特性
- 声明式:描述“想要什么“,而非“怎么做“
- 类型安全:8 种数据类型,自动推断或显式声明
- WPL 关联:通过
rule字段匹配 WPL 解析规则 - 读取模式:read(非破坏性)vs take(破坏性)
- 强大的管道:链式转换(时间/编解码/URL 解析等)
- 条件匹配:match 表达式支持范围、否定、多源匹配
- 数据聚合:object(对象)和 collect(数组)
- SQL 集成:直接查询数据库进行数据富化
🔗 WPL 与 OML 关联
OML 通过 rule 字段与 WPL 的 package/rule 建立关联:
原始数据
↓
[WPL 解析] → 生成结构化数据 + rule 标识
↓
数据携带: rule = "/nginx/access_log"
↓
[查找匹配的 OML] → 匹配 rule 字段
↓
[执行 OML 转换]
↓
[输出到 Sink]
示例:
WPL 规则:
package nginx {
rule access_log {
(ip:client_ip, chars:uri, digit:status)
}
}
OML 配置:
name : nginx_handler
rule : /nginx/access_log # 匹配 WPL 的 package/rule
---
client : ip = read(client_ip) ;
uri : chars = read(uri) ;
status : digit = read(status) ;
💬 快速帮助
常见问题
Q: 从哪里开始学习? A: 从 01-quickstart.md 开始,然后查看 🌟 完整功能示例。
Q: 如何将 OML 与 WPL 关联?
A: 使用 rule 字段匹配 WPL 的 package/rule 值,详见 05-integration.md。
Q: read 和 take 有什么区别?
A: read 是非破坏性的(可重复读取),take 是破坏性的(读取后移除),详见 02-core-concepts.md。
Q: 某个函数怎么用? A: 查看 04-functions-reference.md 或 🌟 完整功能示例。
Q: 如何调试 OML 转换? A: 参考 05-integration.md § 故障排查。
📝 相关文档
开始学习: 01-quickstart.md - 5分钟快速入门
完整示例: 🌟 07-complete-example.md - 所有功能演示