BQL(Bonree Query Language)语法说明
什么是 BQL?
博睿查询语言(BQL) 是一组用于搜索数据的命令。
通过拼装简单独立的命令去实现想要的功能,格式类似于Linux的管道命令:
Query | SPL command1 | SPL command2 | …
对于每个命令而言,都会有 一个输入和输出, Query的输出将会作为SPL1的输入, SPL1的输出则会作为SPL2的输入,以此类推,得到最终结果。
了解 BQL 语法
以下部分介绍了 BQL 命令所使用的语法。
同时支持 SPL 和 SQL 语法
为了简化 Bonree 软件的使用和用户采用,BQL 同时支持 SPL 和 SQL 语法模式。
核心 SPL 命令本身包含在 BQL 中。对于未直接包含在 BQL 中的 SPL 命令,您可以将其作为函数导入,也可以在 BQL 搜索中直接运行 SPL。
BQLfrom命令包含所有 SQL SELECT 命令子句:SELECT、FROM、JOIN、WHERE、GROUP BY、HAVING、ORDER BY、LIMIT 和 OFFSET。您可以使用 FROM 子句开始 BQL 搜索。
以下搜索使用 BQL 中的 SPL 语法:
from metrics
| stats max('host.cpu.idle') AS idle BY hostId
| where entityName(hostId, "host") in ("aliyun", "aws")
| eval verified=if(idle =*, 1,0)
| fields idle, hostId, verified
以下是使用 BQL 中的 SQL 语法进行相同的搜索:
from metrics
where entityName(hostId, "host") in ("aliyun", "aws")
group by hostId
select max('host.cpu.idle') AS idle, hostId
| eval verified=if(idle =*, 1, 0)
BQL 基于由竖线字符 ( | ) 分隔的命令。BQL 易于编写和阅读,因为您可以将一个命令附加到另一个命令之后,而不是像某些搜索语言那样添加越来越深的嵌套。
必需参数和可选参数
BQL 命令由必需参数和可选参数组成。
- 必需参数显示在尖括号 < > 中。
- 可选参数括在方括号 [ ] 中。
考虑这个命令语法:
bin
[<bin-options>...]
<field> [AS <newfield>]
必需的参数是<field>;。要使用此命令,至少必须指定bin <field>。
可选参数是 [<bin-options>...]和[AS <newfield>]。
字段名称
以 az、AZ 或下划线 ( _ ) 字符以外的任何字符开头的字段名称必须用单引号 ( ' ) 括起来。
包含除 az、AZ、0-9 或下划线 ( _ ) 字符以外的任何字符的字段名称必须用单引号 ( ' ) 括起来。这包括通配符 ( * )、破折号 ( - ) 和空格字符。
引号
在 BQL 中,使用引号有特定的原因。下表介绍了何时使用不同类型的引号:
| 符号 | 描述 | 示例 |
|---|---|---|
| 单引号 (') | 使用 单引号将包含特殊字符、空格、破折号和通配符的字段名称引起来。 | FROM metrics SELECT avg(cpu_usage) AS 'Avg Usage' |
| 双引号(“) | 使用双引号将所有字符串值括起来。 | FROM logs WHERE user="ladron" |
转义字符
使用 BQL 时,使用反斜杠字符 ( \ ) 来忽略搜索中具有特殊含义的字符,例如引号、管道符和反斜杠字符本身。
何时使用转义字符
下表说明了需要使用转义字符的情况:
| 数据类型 | 规则 |
|---|---|
| 字符串值 | 字符串值必须用双引号 (") 括起来。如果字符串值包含单引号 ( ' ),则无需对该单引号进行转义。例如``... WHERE game_name="Tzolk'in: The Mayan Calendar"``如果字符串值包含双引号 ( " ),则必须对该双引号进行转义。否则,搜索将误解字符串值的结束位置。 例如:``... WHERE _raw="The user \"vpatel\" isn't authenticated."``如果您没有对用户名"vpatel"两侧的引号进行转义,则搜索会将字符串值解释为"The user "。由于搜索无法解释 WHERE 子句的其余部分,因此搜索将返回语法错误。 |
| 字段名称 | 包含字母、数字或下划线 ( _ ) 字符以外的任何内容的字段名称必须用单引号 ( ' ) 括起来。 如果字段 名称包含单引号 ( ' ),则必须对该单引号进行转义。否则,搜索将误解字段名称的结束位置。 在下面的示例中,字段名称Berlin's values包含空格,必须用单引号括起来。由于字段名称Berlin's也包含单引号,因此必须对该单引号进行转义。` ``... |
转义反斜杠
转义反斜杠的最常见示例是 Windows 文件路径。假设您要在事件中 搜索路径C:\windows\temp。您必须转义反斜杠 ( \ ):
...WHERE path="C:\\windows\\temp"
保留字
一些词是为 BQL 语法保留的,并且在该语言中具有预定义的含义。
不能使用保留字作为字段名称、数据集名称、函数名称等标识符。
但是,如果将保留字括在单引号中,则可以使用该保留字。例如,您不能将其用作dedup字段名称,但可以使用'dedup'。
以下是 BQL 中的保留字列表(不区分大小写):
| from | fromPromQL | dbquery | eval | fields |
|---|---|---|---|---|
| head | rename | sort | stats | where |
| or | and | not | as | by |
| in | like | between | is | null |
| distinct | select | group | order | having |
| limit | true | false | all | asc |
| desc | offset | query | type | step |
| instant | range | source | fetchsize | maxrows |
| timeout | params |
命令介绍
- 生成命令:生成数据的命令,用于产生数据, 例如:from、dbquery、frompromql
- 流式命令:对数据一行一行处理,处理一行产生一行,例如:bucket、eval、fields、head、rename、where
- 转换命令:需要所有数据才能产生结果,例如:stats、sort
命令处理流程介绍
当接收到BQL之后,找到第一个出现的不能下推的命令,将之前的命令下推到引擎分布式处理
开始搜索
您可能会问自己:“那么我该如何开始搜索我的数据?”
首先要做出决定。你需要问自己,你是喜欢使用类似 SQL 的命令进行搜索,还是喜欢使用类似互联网的关键字进行搜索。
从生成命令开始
您的搜索必须以生成命令开始,这些命令是您用来从数据中生成搜索结果的命令。
确定要使用的生成命令后,您必须确定要搜索哪个数据模型。
什么是博睿数据模型?
数据模型是数据的集合。就这么简单。
创建搜索时,您必须确定要搜索哪个数据模型。要识别数据模型,请指定数据模型的名称。
| datamodel | 描述 |
|---|---|
| metrics | 指实体在各种活动中产生的测量数据。 |
| logs | 指实体在各种活动中,产生的日志信息。 |
| entity | 指可观测领域观测对象,通常是物理对象或逻辑对象。 |
| events | 指实体相关的服务意外中断或服务质量降低。 |
| entity_relationships | 指实体与实体之间的关系。 |
| records | 指实体在活动中产生的上下文信息。 |
| dictionarys | 指模型中的枚举常量信息,通常以数值存储,需进行中英文转义显示。 |
| tags | 指实体的标签信息,通常为提供管理或分析使用。 |
| meta | 指描述模型的数据,包含模型的属性、属性类型等信息 |
| profile(后续支持) | |
| tracing(后续支持) |
搜索数据模型
搜索数据模型很容易。
使用该from命令可以读取位于任何类型的数据模型中的数据。唯一需要的语法是:
from <datamodel>
这个简单的搜索会返回数据模型中的所有数据。数据量可能很大。您应该尝试通过在搜索中添加过滤器来缩小数据模型返回的结果范围。您可以使用过滤器来指定要查找的内容或要从数据中排除的内容。
为了向您展示其工作原理,我们给出了以下几个示例
查询指标(后续支持)
from metrics
where entityName(hostid, "host") in ("aliyun", "aws")
group by hostid
select avg(host.cpu.idle) as idle
| fields idle, entityAttr(hostid, "customizedName", "host"), entityName(hostid, "host")
查询日志
from logs(rizhiyi)
where serviceId < 1 and logStatus = "error" AND monitorTime> "2013-22-12:12:21:12" AND TRUE
group by logStatus
select avg(serviceId) as avgValue,logStatus
order by logStatus,avgValue asc
limit 100
offset 0