跳到主要内容
版本:3.7.0

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 中的保留字列表(不区分大小写):

fromfromPromQLdbqueryevalfields
headrenamesortstatswhere
orandnotasby
inlikebetweenisnull
distinctselectgrouporderhaving
limittruefalseallasc
descoffsetquerytypestep
instantrangesourcefetchsizemaxrows
timeoutparams

命令介绍

  • 生成命令:生成数据的命令,用于产生数据, 例如: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

查询事件

from events 
where event_type = "one.detectionEvent"
select eventLevel, eventType, envId

查询实体(后续支持)

FROM entity.host 
WHERE kind!="internal"
SELECT kind, status

搜索特定时间范围

创建搜索时,请尝试仅指定您感兴趣的日期或时间。指定一个狭窄的时间范围是过滤数据集中的数据并避免产生比您实际需要更多的结果的好方法。

以下是一些示例:

  • 要使用精确的日期范围搜索数据,例如从 10 月 15 日晚上 8 点到 10 月 22 日晚上 8 点,请使用时间格式%Y-%m-%d:%H:%M:%S并指定日期,例如time>="2019-10-15:20:00:00" time<"2019-10-22:20:00:00"

组合命令

您可以组合命令。管道符 ( | ) 用于将一个命令的语法与下一个命令的语法分开。

以下示例从metrics数据模型读取数据,然后将该数据通过管道传输到eval命令。您可以使用该 eval命令来计算表达式。该表达式的结果将放入返回给您的搜索结果中的字段中。

此搜索获取metircs数据模型中bytes字段中的数据,并将字节转换为千字节。结果存储在名为 kbytes的新字段中。

from metrics | eval kbytes = bytes / 1024

分组搜索结果

from命令还支持使用该GROUP BY子句结合SELECT子句中的聚合函数调用进行聚合,如下所示:

FROM metrics WHERE earliest=-5m@m AND latest=@m GROUP BY host SELECT sum(bytes) AS sum, host

过滤数据

聚合数据时,有时您希望根据聚合函数的结果进行过滤。使用子句HAVING在聚合后进行过滤,如下所示:

FROM entity.host GROUP BY host SELECT sum(bytes) AS sum, host HAVING sum > 1024*1024

此示例仅返回字节总和大于 1 兆字节 (MB) 的主机的行。

单值计算函数

快速参考

功能类型支持的函数和语法描述
比较和条件函数if(<predicate>,<true_value>,<false_value>)如果<predicate>表达式计算结果为 TRUE,则返回<true_value>。否则函数返回<false_value>
in(<value>,<list>)如果列表中的某个值与您指定的值匹配,则返回 TRUE。
like(<str>,<pattern>)如果字符串值与模式匹配,则返回 TRUE。
实体函数entityName(<entityId>,<entityType>)通过对象ID、对象类型,查询对象信息
entityAttr(<entityId>,<attrName>,<entityType>)通过对象ID、对象类型、对象属性,查询对象信息
entityTag(<entityId>,<entityType>)通过对象标签,查询对象信息

比较和条件函数

if(<predicate>, <true_value>, <false_value>)

如果<predicate>表达式计算结果为 TRUE,则返回<true_value>,否则函数返回<false_value>

基本示例

... | eval err=if(error == 200, "OK", "Error")

in(<value>, <list>)

如果列表中的某个值与您指定的值匹配,则该函数返回 TRUE。此函数采用逗号分隔的值列表。

用法

支持以下语法:

命令句法
WHERE 子句...WHERE in(<value>, [<list>]) ...WHERE <value> in ([<list>])
eval 命令eval new_field=if(in(<value>, [<list>]), "true_value", "false_value")
where 命令where in(<value>, [<list>])

基本示例

... | where in(status, "400", "401", "403", "404")

... | eval error=if(in(status, "error", "failure", "severe"),"true","false")

... | eval error=if(in(status, "404","500","503"),"true","false") | stats count() by error

like(<str>, <pattern>)

此函数仅当str匹配pattern时才返回 TRUE 。匹配可以是精确匹配,也可以是使用通配符的匹配:

  • 使用百分号 ( % ) 作为通配符来匹配多个字符
  • 使用下划线 ( _ ) 字符作为通配符来匹配单个字符

用法

<str>可以是字段名,也可以是字符串值,<pattern>必须是用双引号括起来的字符串表达式。

支持以下语法:

命令句法
WHERE 子句...WHERE like(<str>, <pattern>) ...WHERE <str> LIKE <pattern>
eval 命令eval new_field=if(like(<str>, <pattern>)
where 命令where like(<str>, <pattern>)

基本示例

... | eval is_a_foo=if(like(field, "foo%"), "yes a foo", "not a foo")

... | where like(ipaddress, "198.%")

实体函数

entityName(<entityId>,<entityType>)

通过对象ID、对象类型,查询对象信息

用法

<entityId>是字段名,<entityType>必须是用双引号括起来的字符串表达式。

支持以下语法:

命令句法
WHERE 子句...where entityName(hostid, "host") in ("aliyun", "aws")
eval 命令eval new_field=entityName(hostid, "host")
where 命令where in (entityName(hostid, "host"), "aliyun", "aws")

基本示例

from metrics 
where entityName(hostid, "host") in ("aliyun", "aws")
group by hostId
select avg(host.cpu.idle) as idle, hostId
| fields idle, entityName(hostid, "host")

entityAttr(<entityId>,<attrName>,<entityType>)

通过对象ID、对象类型、对象属性,查询对象信息

用法

<entityId>是字段名,<attrName>,<entityType>必须是用双引号括起来的字符串表达式。

支持以下语法:

命令句法
WHERE 子句...where entityAttr(hostid, "customizedName", "host") in ("aliyun", "aws")
eval 命令eval new_field=entityAttr(hostid, "customizedName", "host")
where 命令where in (entityAttr(hostid, "customizedName", "host"), "aliyun", "aws")

基本示例

... | fields idle, entityAttr(hostid, "customizedName", "host"), entityName(hostid, "host")

entityTag(<entityId>,<entityType>)

通过对象标签,查询对象信息

用法

<entityId>是字段名,<entityType>必须是用双引号括起来的字符串表达式。

支持以下语法:

命令句法
WHERE 子句...where entityTag(hostid, "host") in ("aliyun", "aws")
eval 命令eval new_field=entityTag(hostid, "host")
where 命令where in (entityTag(hostid, "host"), "aliyun", "aws")

基本示例

... | fields idle, entityTag(hostid, "host")

统计和图表函数

快速参考

功能类型支持的函数和语法描述
聚合函数avg(<value>)返回字段中值的平均值。
count(<value>)返回字段中出现的次数。
distinctCount(<value>)返回字段中不同值的计数。
max(<value>)返回字段中的最大值。
min(<value>)返回字段中的最小值。
perc(<value>,<percentile>)返回数字字段中值的第 n 个百分位数。
sum(<value>)返回字段中的值的总和。
事件顺序函数first(<value>)返回字段中第一个看到的值。
last(<value>)返回字段中最后看到的值。

聚合函数

avg(<value>)

返回字段中值的平均值。

基本示例

... | stats avg(size) BY host

count(<value>)

返回字段中出现的次数。

基本示例

...| stats count(status) AS count_status BY sourcetype

distinctCount(<value>)

此函数返回字段中不同值的数量。

基本示例

...| stats distinctCount(device) AS numdevices

max(<value>)

此函数返回字段中的最大值。

基本示例

此示例返回该字段size的最大值。

... | stats max(size)

min(<value>)

此函数返回字段中的最小值。

基本示例

from logs | stats min(size), max(size)

perc(<value>,<percentile>)

此函数根据数字字段中的值返回近似百分位数。

这些函数返回数字字段中值的 n 个百分点。您可以将其视为前 N% 的起始位置的估计值。例如,95 个百分点表示字段中 95% 的值低于估计值,而字段中 5% 的值高于估计值。

有效百分位数是 0 到 100 之间的浮点数,例如 99.95。

基本示例

...| stats perc(score,95), perc(score,50), perc(score,25)

sum(<value>)

返回字段中的值的总和。

基本示例

...| stats sum(bytes) AS "total bytes" by date_hour

事件顺序函数

first(<value>)

返回字段中第一个看到的值。

基本示例

...| stats first(field1)

last(<value>)

返回字段中最后看到的值。

基本示例

FROM logs WHERE sourcetype="secure"
| fields _time, source, _raw
| stats last(raw)

检索命令

快速参考

命令描述例子
eval计算表达式并将结果值放入搜索结果字段。示例:创建一个包含计算结果的新字段。创建一个在每个事件中调用的新字段。通过将字段distance中的值除以字段time中的值来计算速度velocity eval velocity=distance/time
fields根据您指定的字段列表,保留或删除搜索结果中的字段。示例:指定要包含在搜索结果中的字段列表。仅返回搜索结果中的 hostsrc字段。fields host, src
from从数据模型(例如指标、日志、时间、实体)中检索数据。该from命令具有灵活的语法,使您可以使用FROM子句或SELECT子句开始搜索。示例:返回logs中最近 5 分钟的数据。按主机对结果进行分组。计算字节字段的总和。返回总和以及字节总和大于 I MB 的主机字段。 FROM logs WHERE time &ge; 2024-11-27:17:13:12 GROUP BY host SELECT sum(bytes) AS sum, host HAVING sum > 1024*1024
head按搜索顺序返回前 N 个指定结果。示例:最多返回 50 条结果。 head 50
rename重命名一个或多个字段。示例:重命名包含特殊字符的字段。将字段重命名ip-addIPAddress。包含除 az、AZ、0-9 或“_”之外的任何内容的字段名称需要使用单引号。rename 'ip-add' AS IPAddress
sort根据指定字段对所有结果进行排序。例如:先按surname字段升序对结果进行排序,再按firstname 字段降序对结果进行排序。sort surname, -firstname
stats计算结果集的聚合统计信息,例如平均值、计数和总和。示例:获取传入的结果集并计算sbyte字段的sum,并根据host字段中的值对总和进行分组。stats sum(bytes) BY host
where根据布尔表达式的结果过滤搜索结果。示例:使用like比较运算符和百分号 ( % ) 作为通配符。此示例返回字段ipaddress包含以“192.”开头的值的所有结果。where ipaddress like "192.%"**示例:**使用字段值对进行过滤。where host="www1"

from 命令

命令语法详细信息

FROM <datamodel>
[ WHERE ( <predicate-expression> [<logical-operator> <predicate-expression>] ) ... ]
[ GROUP BY ( <expression>[,<expression>... ] | span ( <field> ) | span ( <field>, [<int>]<timescale> ) | <field> span=( [<int>]<timescale> ) ]
[ (SELECT | SELECT DISTINCT) <expression> [, <expression>] ... ]
[ HAVING <expression> ]
[ ORDER BY <expression>[,<expression>... ] [ASC | DESC] ]
[ LIMIT <integer> ]
[ OFFSET <integer> ]

必需参数

datamodel

语法:<datamodel>

描述: Bonree 数据模型。

可选参数

WHERE clause

语法:WHERE <predicate-expression> [<logical-operator> <predicate-expression>...]

描述: 使用谓词表达式过滤数据。指定多个谓词表达式时,必须在表达式之间指定逻辑运算符。

在使用包含聚合的其他子句之前,请使用该WHERE子句过滤数据。例如,以下搜索在SELECT子句中包含聚合。该WHERE子句通过根据时间范围缩小事件范围来过滤数据。然后,过滤后的数据将传递给该SELECT子句:

FROM main WHERE earliest=-5m@m AND latest=@m GROUP BY host SELECT sum(bytes) AS sum, host HAVING sum > 1024*1024

在 <predicate-expression> 中,WHERE子句仅支持将通配符与like函数一起使用。

默认值:无

GROUP BY clause

语法:GROUP BY ( <expression>[,<expression>... ] | span ( <field>, [<int>]<timescale> ) )

描述 :仅在搜索中受支持。一个或多个表达式,以逗号分隔。表达式可以是字段名称或任意表达式,例如upper(first_name)

如果指定了GROUP BY子句,则还必须指定SELECT子句。

默认值: 如果未指定GROUP BY子句,则from命令将根据WHERE子句返回所有行。

SELECT clause

语法:(SELECT | SELECT DISTINCT) <expression> [ AS <field> [,<expression> [AS <field>] ]... ]

描述: 使用SELECT子句检索特定字段。在搜索中,您还可以使用 SELECT 执行指定字段的聚合函数,例如max(delay)。在搜索中,使用SELECT DISTINCT检索所选字段值的唯一组合。如果多行包含相同的字段值组合,则仅返回一行。

下表包含几个显示SELECTGROUP BY子句之间依赖关系的示例:

描述例子
SELECT子句具有count()、聚合函数以及 字段host_time。该 GROUP BY 子句必须同时包含host_time 字段。FROM metrics WHERE sourcetype="web_access" GROUP BY host, _time SELECT count(), host, _time
SELECT子句具有count()、聚合函数、 host字段和latest(_time) AS _time聚合函数表达式。该GROUP BY子句必须包含host字段。FROM metrics WHERE sourcetype="web_access" GROUP BY host SELECT count(), host, latest(_time) AS _time
ORDER BY clause

语法:ORDER BY <expression>[,<expression>... ] [ASC | DESC]

描述: 仅在搜索中受支持。用于对结果进行排序的一个或多个表达式。

默认值: 无。

HAVING clause

语法:HAVING <expression>

描述: 仅在搜索中受支持。使用该HAVING子句作为数据的过滤器。您指定的表达式必须产生 true 或 false 的结果。如果表达式是字符串,则必须用双引号括起来。

传统上,您使用HAVING子句在带有聚合的子句之后过滤数据。例如,此搜索在SELECT子句中包含聚合。WHERE子句用于在 SELECT 子句中的聚合之前过滤数据。

FROM main WHERE earliest=-5m@m AND latest=@m GROUP BY host SELECT sum(bytes) AS sum, host HAVING sum > 1024*1024

默认值:无

LIMIT clause

语法:LIMIT <integer>

描述: 仅在搜索中受支持。用于限制返回的行数。例如,仅返回前 100 个结果。

默认值:无

OFFSET clause

语法:OFFSET <integer>

描述: 仅在搜索中受支持。用于跳过多个匹配项。例如,如果您指定OFFSET 15,则第 16 个结果将是返回的第一个结果。OFFSET 子句通常与 LIMIT 子句结合使用。

默认值:无

命令示例

1. 搜索多个索引

以下搜索查找EMEAAPAC索引中的数据:

FROM logs(EMEA, APAC)
WHERE count(orders) > 1000
GROUP BY country

2.使用 ORDER BY 子句对搜索结果进行排序

假设您使用以下搜索返回按productId字段分组的已采取操作的数量。

FROM logs
WHERE status=200 AND host="www4"
GROUP BY productId
SELECT count(action), productId

fromPromQL 命令

是一个可以使用 PromQL 来查询 Prometheus 的数据并作为 BQL 的查询语句的命令。

命令语法详细信息

语法

fromPromQL query = <string>
[type = <string>]
[step = <string>]

必选参数

query

语法: query = <string>

描述: Prometheus 的 PromQL 语句

默认值:

可选参数

type

语法: type= <string>

描述: 查询方式 (INSTANT / RANGE)

默认值: RANGE

step

语法: step = <string>

描述: 数据点间隔

默认值:

命令示例

-- 查询指标 PromQL
fromPromQL query="max_over_time(rate(http_requests_total[5m])[1h:30s])" type=instant step=1
| fields max_over_time

dbquery 命令

是一个可以使用sql来查询远程数据库的数据并作为 BQL 的查询语句的命令。

命令语法详细信息

语法

dbquery source=<string> query=<string> 
[params = <string> ["," <string> ]...]
[fetchsize=<int>]
[maxrows=<int>]
[timeout="<int>]

必选参数

source

语法: source = <string>

描述: 指的是数据源名称(该数据源是配置页面配置好的)

默认值:

query

语法: query = <string>

描述: 使用的 SQL 语句或者其他数据库支持的查询语句

默认值:

可选参数

fetchsize

语法: fetchsize = <int>

描述: 一次从数据库返回的行数。为了避免内存不足,查询结果集被分成多个部分,并一次返回一个部分到 DB Connect。此参数指定每个部分中有多少行。根据服务器的最大堆大小以及目标数据库表是否包含任何异常大的列,您可能需要为此参数指定一个较小的值。此选项的最大值为 10,000。

默认值: 10000

maxrows

语法: maxrows = <int>

描述: 要返回的最大行数。如果您未指定maxrows的值,dbxquery最多返回 100,000 行。此参数没有最大值,但检索大量记录可能会导致性能问题或内存不足消息。在这种情况下,您应该尝试将maxrows设置为 BQL 服务器硬件可管理的较低数字。

默认值: 100000

timeout

语法: timeout = <int>

描述: query查询超时时间(单位为秒)。

默认值: 600

params

语法: params = <string> ["," <string> ]...

描述: 您在查询或过程中定义的变量的值。参数的值采用 CSV 格式。

默认值:

命令示例

1. 查询ES

dbquery 
source="es"
query="{\"query\": {\"term\": { \"status\": \"200\"} }}"

2. 查询日志易

dbquery 
source="rizhiyi"
query="starttime=2024-08-23:19:08:24 endtime=2024-08-23:19:18:24 (('analyze_nginx_access.responseSize':89) AND 'raw_message':\"okhttp\")"
maxrows=100

3. 查询 mysql 数据和 sql_server 数据交互

dbquery 
source="mysql"
query="SELECT * FROM sakila.city"
| append [dbquery source="sql_server" query="SELECT * FROM sakila.actor"]

4. 查询日志易之后的二次业务处理

dbquery 
source="rizhyi"
query="starttime=2024-08-23:19:08:24 endtime=2024-08-23:19:18:24 (('analyze_nginx_access.responseSize':89) AND 'raw_message':\"okhttp\")"
maxrows=100
| stats max(alert_score) AS score BY endpoint, host
| where endpoint != "_*"
| eval verified=if(alert_score=*, 1,0)
| fields verified score endpoint host

eval 命令

命令语法详细信息

语法

eval
<assignment_expression> ["," <assignment_expression> ]...

要指定多个评估,请用逗号分隔每个 <assignment_expression>。

必选参数

assignment_expression

语法: <field>=<expression> [, <field>=<expression> ] ...

描述: <field> 是 <expression> 结果的目标字段名称。如果字段名称已存在于您的事件中,则该eval命令将使用 <expression> 的结果覆盖值。否则,该 eval命令将使用 <field> 创建新字段。

命令示例

1.使用 if 函数分析字段值

创建在每个事件中调用的error新字段。使用该if函数,如果status值为 200,则将error字段中的值设置为 OK。否则将error字段值设置为 Problem。

... | eval error = if(status == 200, "OK", "Problem")

2.用逗号分隔多个 eval 操作

您可以使用逗号分隔操作来指定多个 eval 操作。在下面的搜索中,评估full_name使用加号 ( + ) 将last_name字段中的值与first_name字段中的值连接起来。在此示例中,last_name字段与first_name字段之间有一个逗号和空格。low_name评估使用lower函数将full_name评估结果转换为小写。

... | eval full_name = last_name+", "+first_name, low_name = lower(full_name)

fields 命令

命令语法详细信息

fields [+|-] <field-list>

必需参数

field-list

语法: <field>, <field>, ...

描述: 要保留或删除的字段的逗号分隔列表。您可以在字段名称中使用通配符,但必须将这些字段名称括在单引号中。例如... | fields host, 'server*'

可选参数

+ | -

语法: + | -

描述: 如果指定了加号 ( + ),则field-list结果中仅保留 中的字段。如果指定了负号 ( - ),则结果中会删除field-list 中的字段。您指定的符号适用于field-list 中的所有字段。

默认值: +

命令示例

1. 指定要包含在搜索结果中的字段列表

仅返回搜索结果中的 hostsrc字段。

... | fields host, src

2. 指定要从搜索结果中删除的字段列表

使用负号 ( - ) 指定要从搜索结果中删除哪些字段。在此示例中,从结果中 删除hostip字段。

... | fields - host, ip

head 命令

命令语法详细信息

head <limit>

必需参数

limit

语法: <integer>

描述: 返回的结果数。

默认值:

命令示例

rename 命令

rename
<source-field> AS <target-field> ["," <source-field> AS <target-field>]...

命令语法详细信息

必需参数

source-field

语法: <string>

描述: 要重命名的搜索结果中的字段的名称。您可以在字段名称中使用通配符。除 az、AZ、0-9 或下划线 ( _ ) 字符之外的任何名称都必须用单引号括起来。这包括通配符 ( * )。

target-field

语法: AS <string>

描述: 要用作字段替换名称的名称。您可以在字段名称中使用通配符。除 az、AZ、0-9 或下划线 ( _ ) 字符之外的任何名称都必须用单引号括起来。这包括通配符 ( * )。

命令示例

1. 重命名一个字段

usr字段重命名为username

...| rename usr AS username

2. 重命名包含特殊字符的字段

将字段重命名ip-addIPAddress。包含除 az、AZ、0-9 或“_”之外的任何内容的字段名称需要使用单引号。

... | rename 'ip-add' AS IPAddress

sort 命令

命令语法详细信息

sort
[<count>]
<field>

必需参数

<field>

语法: <field> [,<field>]...

描述: 要按一个或多个字段进行排序。指定多个字段时,请使用逗号分隔字段名称。

可选参数

count

语法: <integer>

描述: 指定排序结果中返回的最大结果数。您必须在指定字段之前指定计数。如果未指定计数,则使用默认限制 10000。

默认值: 10000

命令示例

1. 为每个字段指定不同的排序顺序

此示例首先按lastname字段升序对结果进行排序,然后按firstname字段降序对结果进行排序。由于升序是默认排序顺序,因此除非您想明确指定,否则无需指定。

... | sort lastname, -firstname

2.指定要返回的排序结果数

本示例对结果进行排序,并返回最多 100 条排序后的结果。结果首先按size字段降序排列。如果size字段中有重复值,则按source字段升序排列。

... | sort 100 -size, +source

stats 命令

命令语法详细信息

stats
<aggregation> ...
( [<by-clause>] [span=<time-span>] )

必需参数

aggregation

语法: <aggregate-function> "("<field> [AS <field>] ")" ["," <aggregate-function> "("<field> [AS <field>] ")" ]...

描述: 统计聚合函数。该函数可应用于 eval 表达式,或应用于一个或多个字段。默认情况下,输出中使用的字段名称与聚合函数相同。例如,如果您的搜索是,则... | stats sum(bytes)输出中的字段名称是sum(bytes)。使用 AS 子句将结果放入具有您指定名称的新字段中,例如... | stats sum(bytes) AS 'sum of bytes'

可选参数

by-clause

语法: BY <field> [span=<timespan>] ["," <field> [span=<timespan>] ]...

描述: 用于对结果进行分组的一个或多个字段的名称。您可以指定应用于分组的时间跨度。<by-clause> 为 <by-clause> 字段中的每个不同值返回一行。您不能使用通配符来指定具有相似名称的多个字段。您必须单独指定每个字段。

默认值: 如果未指定 <by-clause>,则该stats命令仅返回一行,这是对整个传入结果集的聚合。

命令示例

1. 计算某个字段的总和

如果您只想要进行简单计算,则可以指定聚合而不使用任何其他参数。例如:

... | stats sum(bytes)

2. 按字段对结果进行分组

此示例获取传入的结果集并计算bytes字段的总和,然后根据host字段中的值对总和进行分组。

... | stats sum(bytes) BY host

where 命令

命令语法详细信息

 
where <predicate-expression>

必需参数

predicate-expression

语法: <predicate-expression>

描述: 一个表达式,当求值时,返回 TRUE 或 FALSE。

命令示例

1. 指定通配符

您只能通过使用该like函数在where命令中指定通配符。百分号 ( % ) 是您必须在该like函数中使用的通配符。

在此示例中,where命令返回以198. 开头的ipaddress字段中的值的搜索结果。

 
... | where like(ipaddress, "198.%")