当前位置: 首页 > news >正文

从边缘设备丰富你的 Elasticsearch 文档

作者:David Pilato

我们在之前的文章中已经了解了如何丰富 Elasticsearch 本身和 Logstash 中的数据。 但如果我们可以从边缘设备中做到这一点呢? 这将减少 Elasticsearch 要做的工作。 让我们看看如何从具有代理处理器的 Elastic 代理中执行此操作。

Elastic Agent 代理文档说:

Elastic Agent 处理器是轻量级处理组件,可用于解析、过滤、转换和丰富源数据。 例如,你可以使用处理器来:

  • 减少导出字段的数量
  • 使用附加元数据增强事件
  • 执行额外的处理和解码
  • 清理数据

这正是我们想要做的,但 Elastic Agent 处理器的限制之一是它无法使用来自 Elasticsearch 或其他自定义数据源的数据来丰富事件。

这意味着我们需要在这里保持非常静态。 我们需要提前知道我们想要用什么来丰富我们的数据。 这不是什么大问题,因为我们随时可以更改代理的配置以在以后添加新的功能。 例如,我们可以将采集管道添加到 Elasticsearch 中,或者将数据从 Elastic Agent 发送到 Logstash 来丰富它。

启动 Elastic 代理

从 Elastic Cloud 运行时,你只需按照说明 enroll 代理或转到 Fleet 控制台并从 “Settings” 选项卡获取 URL:

以及 Enrollment tokens选项卡中的秘密 TOKEN:

由于我想使用 Docker 在本地运行代理,因此我将使用以下命令并将 URL 和 TOKEN 值替换为我的 Fleet 控制台中的值:

docker run \--env FLEET_ENROLL=1 \--env FLEET_URL=URL \--env FLEET_ENROLLMENT_TOKEN=TOKEN \-v $(pwd)/datadir:/usr/share/elastic-agent/db \--rm docker.elastic.co/beats/elastic-agent:8.12.0

请注意,我将本地目录安装到 /usr/share/elastic-agent/db ,以便我可以在本文后面共享一些内容。 几秒钟后,你应该在 Fleet 控制台中看到你的代理可用:

添加字段

我们可以使用 add_fields 处理器向文档添加字段。 例如,我们可以在文档中添加 vip 和 name 字段:

processors:- add_fields:fields:vip: truename: 'David P'

使用条件

前面的示例将向每个文档添加 vip 和 name 字段。 显然,我们只想在满足条件时添加字段。 例如,只有当 clientip 字段为 30.156.16.164 时,我们才能添加 vip 和 name 字段:

processors:- add_fields:when:equals:clientip: '30.156.16.164'fields: vip: truename: 'David P'

由于这里有一个网络 IP 地址,因此我们还可以使用 CIDR 表示法,它不比较 “字符串”,而是比较 “网络地址”。 我们正在使用网络处理器条件:

processors:- add_fields:when:network:clientip: '30.156.16.164'fields:vip: truename: 'David P'

使用更多条件

由于我们的条件数量有限,我们可以使用多个 add_fields 处理器根据条件添加字段:

processors:- add_fields:when:network:clientip: '30.156.16.164'fields:vip: truename: 'David P'- add_fields:when:network:clientip: '164.85.94.243'fields:vip: truename: 'Philipp K'

使用脚本添加字段

我们还可以使用 script processor 来使用 JavaScript 添加字段。 例如,我们可以根据 clientip 字段的值添加 vip 字段:

processors:- script:lang: javascriptsource: >function process(event) {var clientip = event.Get('network.clientip');if (clientip == '30.156.16.164') {event.Put('vip', true);event.Put('name', 'David P');}}

这里我们内联了脚本,但我们也可以使用包含脚本的文件:

processors:- script:lang: javascriptfile: /usr/share/elastic-agent/db/enrich.js

而 enrich.js 的内容是:

function process(event) {var clientip = event.Get('network.clientip');if (clientip == '30.156.16.164') {event.Put('vip', true);event.Put('name', 'David P');}
}

还有另一个有趣的选项允许我们从一个目录加载多个脚本:

processors:- script:lang: javascriptfiles:- /usr/share/elastic-agent/db/dataset.js- /usr/share/elastic-agent/db/enrich.js

我们可以在 dataset.js 中构建 IP 地址和名称之间的映射:

var dataset = {'30.156.16.164': {'vip': true, 'name': 'David P'},'164.85.94.243': {'vip': true, 'name': 'Philipp K' },'50.184.59.162': {'vip': true, 'name': 'Adrienne V' },'236.212.255.77': {'vip': true, 'name': 'Carly R' },'16.241.165.21': {'vip': true, 'name': 'Naoise R' },'246.106.125.113': {'vip': true, 'name': 'Iulia F' },'81.194.200.150': {'vip': true, 'name': 'Jelena Z' },'111.237.144.54': {'vip': true, 'name': 'Matt R' }
}

我们现在可以修改 enrich.js 脚本以使用此数据集:

function process(event) {var clientip = event.Get('network.clientip');if (dataset[clientip]) {event.Put('vip', dataset[clientip].vip);event.Put('name', dataset[clientip].name);}
}

结论

我们现在拥有一组三个解决方案来丰富我们的数据:

  • 丰富 Elasticsearch 本身的数据
  • 加快 Logstash 中的 Elasticsearch 查找速度
  • 使用代理处理器丰富边缘数据

第一个解决方案是最灵活的,但它需要一个具有足够资源的集群来处理负载。 第二种解决方案是一个很好的折衷方案,因为它允许你减少 Elasticsearch 的负载,但它要求你拥有 Logstash 集群。 第三种解决方案是最容易实现的解决方案,但也是最静态的解决方案。

我希望你喜欢这一系列的帖子。 如果你有任何疑问,请随时在 Elastic 社区论坛上提问。

相关文章:

  • Go 限流器-漏桶 VS 令牌桶 常用包原理解析
  • 设计模式面试专题
  • 【深度学习】一文搞懂 如何计算图像数据集的RGB均值和方差(超详细的哦~)
  • MQ高级篇---消息可靠性
  • [自研开源] MyData 数据集成之任务调度模式 v0.7
  • FebHost:西班牙独立站是否需要注册.ES域名?
  • 解析服务器出现大量 TIME_WAIT 和 CLOSE_WAIT 状态的原因及排查方法
  • Qt程序可执行文件打包
  • Python学习目录
  • WSL下Ubuntu+RTX4090安装CUDA+cuDnn+Pytorch
  • 防火墙(讲解)
  • Docker 安装 Mysql
  • 2024.03.08 校招 实习 内推 面经
  • 深度学习pytorch——GPU加速(持续更新)
  • 吴恩达2022机器学习专项课程(一) 3.6 可视化样例
  • 【译】理解JavaScript:new 关键字
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • Angular Elements 及其运作原理
  • express如何解决request entity too large问题
  • Java应用性能调优
  • Java知识点总结(JavaIO-打印流)
  • Linux中的硬链接与软链接
  • uva 10370 Above Average
  • 大快搜索数据爬虫技术实例安装教学篇
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 解析带emoji和链接的聊天系统消息
  • 数组的操作
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • 正则表达式-基础知识Review
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • #NOIP 2014# day.1 T2 联合权值
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (十) 初识 Docker file
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (转)编辑寄语:因为爱心,所以美丽
  • .gitignore
  • .NET项目中存在多个web.config文件时的加载顺序
  • .NET学习全景图
  • .pyc文件是什么?
  • .sh
  • [20170705]diff比较执行结果的内容.txt
  • [Angularjs]ng-select和ng-options
  • [Asp.net MVC]Asp.net MVC5系列——Razor语法
  • [C#]获取指定文件夹下的所有文件名(递归)
  • [CCIE历程]CCIE # 20604
  • [CISCN2019 华北赛区 Day1 Web5]CyberPunk --不会编程的崽
  • [HNOI2006]鬼谷子的钱袋
  • [HUBUCTF 2022 新生赛]
  • [javaSE] GUI(Action事件)
  • [Kubernetes]2. k8s集群中部署基于nodejs golang的项目以及Pod、Deployment详解
  • [Linux] 常用命令--版本信息/关机重启/目录/文件操作
  • [one_demo_14]一个简单的easyui的demo
  • [POJ 1915] Knight Moves