ESQL 简介 — 一种用于实现灵活的迭代式分析的新型查询语言

blog-thumb-elevate-our-work-1680x980.png

长久以来,Elastic Platform 作为用于搜索用例和机器生成的数据的分析系统,一直广受好评。分析的重点是处理采集到的数据,在这个过程中,尤其重点考虑了如何在 Elasticsearch 中索引数据时优化数据的结构。Kibana 提供了 Elasticsearch 聚合,并使用它们来创建交互式仪表板、可视化和告警。

但是,随着 Elastic Platform 更广泛地用作搜索、安全、可观测性和一般分析平台,分析师用户需要能够获取采集到的数据,在采集后对数据进行转换以满足他们的调查需求,并通过分析底层 Elasticsearch 索引数据得出见解。他们需要一种简洁、集成化的高效工作流,并能够由丰富的表达性查询来提供支持,以便通过一个查询表达式,在不需要切换 UI 上下文或只需很少切换操作的情况下,即可执行搜索、筛选、聚合以及转换操作。

为了应对这些挑战,Elastic 团队目前正在开发 Elasticsearch 查询语言 (ESQL)。ESQL 将为 Elastic 用户提供一种灵活且功能强大的查询表达式语言来查询数据。此外,ESQL 还会提供卓越的查询用户体验,以及采集后处理功能,从根本上转变和扩展 Elasticsearch 的分析和数据处理功能。

新的查询和聚合计算架构 

ESQL 不仅仅是一种语言,它还代表着在 Elasticsearch 内部开发全新计算能力的重大投资。为了实现 ESQL 在功能和性能两方面的要求,必须构建一种全新的计算架构。ESQL 搜索、聚合和转换函数是直接在 Elasticsearch 内部执行的。查询表达式不会转译为 QueryDSL 来执行,而且,我们在 Elasticsearch 内部即可对 ESQL 函数提供原生支持。

ESQL 引入了分布式计算功能,可满足角色各异且技能水平参差不齐的用户的需求。这些计算功能使 ESQL 能够在一些关键方面简化用户工作流。

使用 ESQL,您可以:

  • 利用卓越的查询用户体验:ESQL 查询表达式支持复杂的分析和数据处理,而且很容易学习、理解和分享。
  • 通过新的 Elasticsearch 计算和数据处理功能,结合使用 Elasticsearch 的筛选、聚合和转换功能与子查询和查找。
  • Kibana 的 Discover、Kibana Lens 以及 Elastic 解决方案中使用 ESQL,为您提供无缝衔接的工作流。您将能够可视化 ESQL 查询,通过仪表板或以查询形式与团队分享结果,并使用查询来创建定制告警。

如何使用 ESQL 

ESQL 是一种管道查询语言,用户可通过竖线分隔的命令序列来处理 Elasticsearch 数据。一个命令的输出将成为下一个命令的输入,从而定义一个逻辑数据管道。ESQL 表达式属于线性逻辑表达式,非常易读。这些表达式十分简单,对于分析师来说,不管有没有使用经验,都可以轻松地进行编写、使用和修改。下面是一个简单的示例:

search index_name
| eval field_c = (field_a + field_b)
| sort field_c desc

上面的表达式将会从索引中检索所有数据,针对每条记录创建新的 fieldC,用于表示 fieldA 与 fieldB 的和。最终,结果将按 fieldC 进行排序。

ESQL 在安全方面的运用

在安全分析师执行临时性威胁猎捕时,ESQL 非常有用。分析师可以先查询日志数据,以显示由“powershell.exe”引发的独特进程,并按命令行参数的字符串长度进行排序。

from winlog
  | where host.os.family == ‘windows’
  | where process.name == "powershell.exe"
  | unique process.command_line
  | sort len(process.command_lin) desc
  | limit 3

host.os.family

process.name

process.command_line

windows

powershell.exe

(get-acl \\smb_file\share).access | ft IdentityReference,FileSystemRights,AccessControlType,IsInherited,InheritanceFlags -auto

windows

powershell.exe

Get-ADComputer -property * -filter { ipv4address -eq ‘172.16.0.3’}

windowspowershell.exeGet-ADGroupMember -identity Helpdesk

结果显示,PowerShell 正在被用于检索文件系统信息,以及有关 Active Directory 的信息。这可能是正常的系统行为,但也可能表明有恶意活动。

为了进一步调查,对查询进行修改以筛选 Active Directory 和文件系统相关命令行参数。然后计算 process.command_line 的唯一值,并按 hostname 进行分组

from winlog
  | where host.os.family == ‘windows’
  | where process.name == "powershell.exe"
  | where process.command_line in (‘*get-acl*’, ‘*Get-AD*’)
  | stats count(unique process.command_line) as cl_count by hostname
  | sort cl_count desc
  | limit 3

cl_count

hostname

155

host2

74

host1

67host3

结果显示,host2 调用文件和 AD 相关命令行参数的 PowerShell 进程远多于其他主机。分析师可以继续修改和扩展 ESQL 查询表达式,以确定 host2 是否存在恶意活动。通过这种调查,最终可以了解威胁来源,以便采取补救措施,并了解将来如何防止这个威胁。

ESQL 在搜索方面的运用

不论现在还是将来,Elasticsearch 都将会始终用于搜索。因此,ESQL 支持搜索、相关性和排序函数,而这些函数一直都包含在 Elasticsearch 中。通过 ESQL,可以非常轻松地使用这些搜索函数的全部功能。

以一个简单的词条聚合为例,假设我们想要使用分类字段中的前三个词条生成存储桶,按文档计数排序。

from music
| stats terms((genre), 3, doc_count, unwind)
| sort doc_count desc

doc_count

term

6

electronic

3

rock

2jazz

同样也支持存储桶聚合,例如日期直方图。在这个查询中,我们根据价格字段以 50 为间隔通过销售指数创建了一个直方图。

from sales
| stats histogram(price, 50)
| sort bucket desc

doc_count

bucket

3

200

2

150

0100
150
10

此外,通过 ESQL 还可以非常轻松地按照与现在的管道聚合类似的方法来处理数据。例如,假设您想要计算一个导数的导数。最简单的形式如下:

from sales
| eval (stats derivative(sales)) as fist_der
| eval (stats derivative(first_der)) as second_der

ESQL 在可观测性方面的运用

网站可靠性工程师 (SRE) 在处理大量数据时往往会遇到挑战。他们负责使用这些数据来防止和修复系统中断以及其他相关问题。他们监测着数以千计的系统,这些系统会生成重要的痕迹、日志和指标数据。然后,SRE 会使用这些数据来识别问题,并采取措施以防止系统或应用程序未来发生中断。因此,对于 SRE 来说,在综合了解多个数据集的基础上分析系统行为的能力是必不可少的。  

从本质上来说,可观测性采集数据是不可预测的。ESQL 为 SRE 提供了多种方法来关联和重塑数据,以便更深入地洞察系统和应用程序行为。它让 SRE 不仅能够在发现问题之后进行事后分析,而且还可直接使用有用的见解来防止类似问题在将来再次发生。 

下面关于数据处理的部分将使用可观测性示例。

通过新的 Elasticsearch 计算功能探索一种全新的数据处理方式

ESQL 表达式不但灵活,而且功能强大,可以通过索引数据获得有用的见解。但这些表达式背后的繁重工作都会在 Elasticsearch 中完成。我们打造了一款全新的计算引擎,以支持 ESQL 提供的数据处理功能。最值得一提的是,改进了采集后的数据处理、中间数据状态、查找函数和子查询。 

ESQL 完全依赖 Elasticsearch 中新的计算和处理功能。ESQL 并不是通过编译进行解释和执行的。而且,ESQL 表达式是完全通过 Elasticsearch 本身处理的。 

采集后处理

ESQL 与 Kibana 完全融合,可以快速轻松地访问最常见且有用的聚合和预测。想象一下处理指标数据的索引。分析师可能想要计算比率或对采集的数据执行聚合。使用 ESQL,这些操作都可以通过底层索引轻松完成。

from network_flow 
| stats count(*) filter (where transport == ‘udp’) as udp_count
| stats count(*) filter (where transport == ‘tcp’) as tcp_count
| eval total_transport_events = udp_count + tcp_count
| eval udp_per_total = udp_count / total_transport_events

通过快速、简单地聚合和转换底层索引,ESQL 可让分析师在整理和探索数据时获得重要的全新见解。这简化了数据采集,因为 ESQL 可让分析师通过大量底层索引得出新的结构和见解。

数据管道和中间数据

支持 ESQL 表达式的另一个关键部分是处理处于中间状态的数据。在数据通过不同的管道阶段进行传递的过程中,处理和修改数据的能力是 ESQL 所提供的处理能力的核心。  

在下面的查询中,我们会搜索指标索引,以找到五个 CPU 利用率处于最高峰值的主机名。

from metrics
| stats max(system.process.cpu.total.pct) as max_cpu by hostname
| where max_cpu > .800 and hostname == '*web*' 
| sort max_cpu desc
| limit 5

这个数据管道的每个阶段都会生成表格式的输出。初始的 from metrics 命令会检索所有索引数据。然后,这个表通过 system.process.cpu.total.pct 进行聚合,并按照 hostname 进行分组,从而生成一个唯一的表。然后,再对这些表格式结果进行筛选和排序,以生成所需的输出。

max_cpu

hostname

.989

1webapache

.978

1websftp

.964nfsweb
.9552webredis
.943web_staging_primary

然后可以基于这个输出进行可视化或生成告警。

查找和子查询

ESQL 还在 Elasticsearch 中引入了查找和子查询功能。 

ESQL 可以在一个单独的查找索引中查找值。这项功能最常用于在查询时充实结果。查找与 SQL 左连接非常类似,都会使用指定的键从外键索引返回字段。

例如,查找索引包含有关通过唯一键识别的系统用户的信息。ESQL 表达式可以在这些索引中查找数据,以在结果中返回这个外键数据。这个查询将通过从 user_info_lookup 索引获得的用户数据来充实从 access_logs 索引获得的结果。具体来说,就是会返回查找索引中的 email 和 state 字段。

from access_logs where user != 'root'
| lookup user_info_lookup['email', 'state'] on userid

userid

[ … access_logs … ]

emailstateuserid

3455

bobNY3455

通过子查询,可让用户将不同的查询以参数形式嵌套到其他查询中。例如,SRE 可能想针对同一索引将聚合用作某个查询中的参数。在下例中,SRE 正在使用登录总次数来计算特定用户的登录百分比。

from user_login where userid = 1234
| eval stats count(*) as 1234_logins
| eval total_logins = [from logs where userid = *| stats count(*) as  total_logins]
| eval round((1234_logins / total_logins), 2) as 1234_pct

通过使用查找和子查询,分析师和 SRE 都可以充分利用他们的 Elasticsearch 来生成非常丰富的数据结构,并在 Elasticsearch 中通过数据获得新的见解。

ESQL 从根本上改变和改进了您在 Elastic Search Platform 中与数据交互的方式。ESQL 可通过强大的功能充分发挥数据的价值,以快速转换和关联大型数据集;搜索、筛选和处理海量数据;以及缩短响应和解决时间。我们期待看到您能在工作中使用它!

加入我们这次的分析之旅 

是不是对 ESQL、转换和关联以及使用多步查询感到兴奋不已?我们也是。请持续关注以了解更多最新消息,Elastic 团队会继续开发和准备发布这些功能。

想要抢先尝试这一解决方案?您可以通过论坛或我们的 Elastic 社区 Slack 频道与我们联系。欢迎大家提供反馈意见,帮助我们在开发新型查询语言、计算引擎和基于查询的调查工作流方面确定发展方向。

本博文所描述的任何特性或功能的发布及上市时间均由 Elastic 自行决定。当前尚未发布的任何特性或功能可能无法按时提供或根本不会提供。