Elasticsearch:ESQL 简介 — 一种用于灵活、迭代分析的新查询语言
2023年4月23日 | by mebius
作者:Seth Payne
特别声明:截止撰写该博文,在目前的公开发行版中,该功能还不能公开测试。这个功能将在未来的发行版中发布。
长期以来,Elastic Platform 一直被视为搜索用例和机器生成数据的分析系统。 分析专注于处理摄入的数据,其中重要的思想是如何在 Elasticsearch 中索引数据时优化结构数据。 Kibana 公开 Elasticsearch 聚合并使用它们来创建交互式仪表板、可视化和警报。
但随着 Elastic Platform 被更广泛地用作搜索、安全、可观察性和通用分析平台,分析师用户需要能够将数据作为摄入的数据,对其进行转换以适应摄入后的调查需求,并从底层 Elasticsearch 索引数据中获得洞察力 。 他们需要一个简洁、集成和高效的工作流,由丰富且富有表现力的查询支持,其中搜索、过滤、聚合和转换通过单个查询表达式执行,几乎没有 UI 上下文切换。
为了解决这些挑战,Elastic 团队目前正在开发 Elasticsearch 查询语言 (ESQL)。 ESQL 为 Elastic 用户提供了一种灵活、强大且健壮的查询表达式语言来查询数据。 ESQL 还提供具有后摄取处理功能的卓越查询 UX,从根本上转变和扩展 Elasticsearch 的分析和数据处理功能。
使用新的 Elasticsearch 查询语言 ESQL 实现 joins、管道等
新的查询和聚合计算架构
ESQL 不仅仅是一种语言。 它代表了对 Elasticsearch 中新计算功能的重大投资。 要同时满足 ESQL 的功能和性能要求,有必要构建一个全新的计算体系结构。 ESQL 搜索、聚合和转换功能直接在 Elasticsearch 本身内执行。 查询表达式不会转换为 QueryDSL 来执行。 相反,我们在 Elasticsearch 中构建了对 ESQL 函数的本地支持。
ESQL 为不同角色和不同技能水平的用户引入了分布式计算功能。 这些计算能力使 ESQL 能够以多种关键方式简化用户工作流程。
使用 ESQL,你可以:
- 利用卓越的查询 UX:ESQL 查询表达式支持复杂的分析和数据处理。 它们易于学习、阅读和分享。
- 将 Elasticsearch 的过滤、聚合和转换功能与子查询和查找结合使用,新的 Elasticsearch 计算和数据处理功能使之成为可能。
- 在 Discover、Kibana Lens 和 Elastic Solutions 中跨 Kibana 使用 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_fileshare).access | ft IdentityReference,FileSystemRights,AccessControlType,IsInherited,InheritanceFlags -auto |
windows | powershell.exe | Get-ADComputer -property * -filter { ipv4addtgcoderess -eq ‘172.16.0.3’} |
windows | powershell.exe | Get-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 |
67 | host3 |
结果表明,与其他主机相比,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 |
2 | jazz |
还支持日期直方图等分桶聚合。 在此查询中,我们根据价格字段使用 50 的间隔从销售指数创建直方图。
from sales
| stats histogram(price, 50)
| sort bucket desc
doc_count | bucket |
---|---|
3 | 200 |
2 | 150 |
0 | 100 |
1 | 50 |
1 | 0 |
ESQL 还使以类似于当今管道聚合的方式处理数据变得极其简单。 例如,假设你要计算导数的导数。 以最简单的形式:
from sales
| eval (stats derivative(sales)) as fist_der
| eval (stats derivative(first_der)) as second_der
使用 ESQL 实现可观察性
站点可靠性工程师 (SRE) 在处理海量数据时面临着挑战。 他们负责使用tgcode这些数据来防止和修复系统停机和其他相关问题。 他们监控数千个生成重要跟踪、日志和指标数据的系统。 然后 SRE 使用此数据来识别问题并实施措施以防止将来系统或应用程序中断。 因此,对于 SRE 而言,结合对多个数据集的理解来分析系统行为的能力至关重要。
可观察性摄取的数据本质上是不可预测的。 ESQL 为 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 允许分析师从一组广tgcode泛的基础索引中获得新的结构和见解。
数据管道和中间数据
支持 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 |
.964 | nfsweb |
.955 | 2webredis |
.943 | web_staging_primary |
然后可以将此输出用作可视化或警报的基础。
查找和子查询
ESQL 还向 Elasticsearch 引入了查找和子查询功能。
ESQL 可以在单独的查找索引中查找值。 这最常用于在查询时丰富结果。 查找类似于 SQL 左连接,因为它们使用指定的键从外部索引返回字段。
例如,查找索引包含有关由唯一键标识的系统用户的信息。 ESQL 表达式可以在这些索引中查找数据以在结果中返回这些外部数据。 此查询使用来自 user_info_lookup 索引的用户数据丰富了 access_logs 索引的结果。 具体来说,将返回查找索引中的电子邮件和状态字段。
from access_logs where user != 'root'
| lookup user_info_lookup['email', 'state'] on userid
userid | [ … access_logs … ] | state | userid | |
3455 | … | bob | NY | 3455 |
子查询使用户能够将不同的查询作为参数嵌入到其他查询中。 例如,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 自行决定。 当前不可用的任何特性或功能可能无法按时交付或根本无法交付。
原文:https://www.elastic.co/blog/introduction-to-esql-new-query-language-flexible-iterative-analytics
文章来源于互联网:Elasticsearch:ESQL 简介 — 一种用于灵活、迭代分析的新查询语言
相关推荐: Elasticsearch:使用 Logstash 构建从 Kafka 到 Elasticsearch 的管道 – Nodejs
在我之前的文章 “Elastic:使用 Kafka 部署 Elastic Stack”,我构建了从 Beats => Kafka => Logstash => Elasticsearch 的管道。在今天的文章中,我将描述从 Nodejs=&g…