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

news2024/9/20 8:59:23

作者: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: true
        name: 'David P'

使用条件

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

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

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

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

使用更多条件

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

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

使用脚本添加字段

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

processors:
  - script:
      lang: javascript
      source: >
        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: javascript
      file: /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: javascript
      files:
        - /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 社区论坛上提问。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1532886.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Introduction to Data Mining 数据挖掘

Why Data Mining? • The Explosive Growth of Data: from terabytes to petabytes — Data collection and data availability ◦ Automated data collection tools, database systems, Web, computerized society — Major sources of abundant data ◦ Business: Web, e-co…

Linux-shell中变量的引用($变量名,${变量名})

1. 背景 最近写脚本时,发现有个变量在某个地方生效,某个地方又不生效,引用方式为 $变量名。 2. 方法 其实 shell 脚本中对变量的引用有两种方式: $变量名${变量名} 用下面的脚步,去测试效果: a100 b2…

excel处理_多个excel文件合并

data文件夹内,有多个xls文件。每个xls文件格式一致, 表头占两行,表位汇总数据占一行。 表头两行,拼接前第二行设置为表头,且删除第二行。 在python读入的dataframe中,游轮成本表是表头,第一行是…

Python 深度学习第二版(GPT 重译)(四)

九、高级计算机视觉深度学习 本章涵盖 计算机视觉的不同分支:图像分类、图像分割、目标检测 现代卷积神经网络架构模式:残差连接、批量归一化、深度可分离卷积 可视化和解释卷积神经网络学习的技术 上一章通过简单模型(一堆Conv2D和MaxP…

【鸿蒙HarmonyOS开发笔记】通知模块之为通知添加行为意图

概述 WantAgent提供了封装行为意图的能力,这里所说的行为意图主要是指拉起指定的应用组件及发布公共事件等能力。HarmonyOS支持以通知的形式,将WantAgent从发布方传递至接收方,从而在接收方触发WantAgent中指定的意图。例如,在通…

js【详解】深拷贝

什么是深拷贝? 对于引用类型的数据,才有深浅拷贝的说法 浅拷贝 :执行拷贝的变量只复制被拷贝变量内存的引用数据的地址。 被拷贝变量内地址指向的数据发生变化时,执行拷贝的变量也会同步改变 深拷贝: 在堆内存中开…

迁移学习的技术突破与应用前景

目录 前言1 迁移学习技术1.1 原理与分类1.2 主要挑战 2 迁移学习应用2.1 计算机视觉2.2 医疗健康 3 未来展望3.1 推动各领域发展3.2 提高模型泛化能力和效果3.3 在新兴领域中广泛应用 结语 前言 迁移学习作为机器学习领域的重要技术之一,以其能够将从一个任务中学到…

[C语言]——内存函数

目录 一.memcpy使用和模拟实现(内存拷贝) 二.memmove 使用和模拟实现 三.memset 函数的使用(内存设置) 四.memcmp 函数的使用 C语言中规定: memcpy拷贝的就是不重叠的内存memmove拷贝的就是重叠的内存但是在VS202…

腾讯和香港中文大学发布文字生成视频AI模型DynamiCrafter

前言 在数字化时代,视觉内容的创造和动态化已成为创意表达和信息传递的重要工具。最近由香港中文大学、腾讯AI Lab联合研发的视频AI模型DynamiCrafter,这一模型能够将静态图像转化为逼真的动态视频,开创了文本到视频生成技术的新纪元。 Hugg…

Nexus介绍

1.什么是Nexus Nexus是一个强大的仓库管理器,主要用于搭建和管理公司内部的软件构件仓库。 以下是一些关于Nexus的重要信息: 功能:Nexus可以作为Maven、NuGet、npm等工具的仓库服务器,允许用户在本地网络中共享和管理依赖项和构…

计算机三级——网络技术(综合题第二题)

路由器工作模式 用户模式 当通过Console或Telnet方式登录到路由器时,只要输入的密码正确,路由器就直接进入了用户模式。在该模式下,系统提示符为一个尖括号(>)。如果用户以前为路由器输入过名称,则该名称将会显示在尖指号的前…

目标检测——YOLOX算法解读

论文:YOLOX: Exceeding YOLO Series in 2021(2021.7.18) 作者:Zheng Ge, Songtao Liu, Feng Wang, Zeming Li, Jian Sun 链接:https://arxiv.org/abs/2107.08430 代码:https://github.com/Megvii-BaseDetection/YOLOX YOLO系列算法…

序列化与反序列化介绍

文章目录 一、序列化与反序列化二、PHP反序列化漏洞成因三、JAVA反序列化 一、序列化与反序列化 在PHP语言开发层面上基本都是围绕着serialize(),unserialize()这两个函数。serialize()函数序列化对象后,可以很方便的将它传递给其他需要它的地方&#x…

【数据结构和算法初阶(C语言)】二叉树的顺序结构--堆的实现/堆排序/topk问题详解---二叉树学习日记②12

目录 ​编辑 1.二叉树的顺序结构及实现 1.1 二叉树的顺序结构 2 堆的概念及结构 3 堆的实现 3.1堆的代码定义 3.2堆插入数据 3.3打印堆数据 3.4堆的数据的删除 3.5获取根部数据 3.6判断堆是否为空 3.7 堆的销毁 4.建堆以及堆排序 4.1堆排序---是一种选择排序 4.2升序建大堆&a…

LeetCode每日一题【206. 反转链表】

思路:双指针,一前一后,逐个把指向后面的指针指向前面。 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), ne…

自动化的免下车服务——银行、餐厅、快餐店、杂货店

如果您在20世纪70年代和2020年分别驾车经过免下车服务餐厅(汽车穿梭餐厅),您会发现,唯一的不同是排队的车型。50多年来,免下车技术一直为我们提供着良好的服务,但现在也该对它进行现代化改造了。 乘着AI和自…

mini2440 LCD(型号:P43)驱动的背光驱动失效原因分析

目录 概述 1 背光驱动移植 1.1 问题描述 1.2 LCD背光驱动 1.2.1 原理图分析 2 移植驱动程序 2.1 编写驱动代码 2.2.1 编写代码 2.2.2 添加驱动配置 2.2 配置驱动至内核 3 测试背光控制 4 分析P43屏的资料 4.1 查询P43的资料 4.2 关于P43的介绍 5 失效原因分析 概…

ZYNQ AXI GPIO

1 原理介绍 一个AXI GPIO 模块有两个GPIO,分别是GPIO和GPIO2,也就是channel1和channel2,为 双向IO。 AXI GPIO的寄存器也不多,主要是两个channel 的数据寄存器GPIO_DATA和GPIO2_DATA,两个channel的方向控制GPIO_TRI和…

Tempo Talents | 创新专业建设方案,赋能高校4+N大数据学科人才培养

数字经济成为国家战略,是新一轮的经济发展引擎,数字人才、复合型人才成为发展的关键和核心要素。各级政府、区域开始以区域产业为导向,培育、聚集产业所需的数智化人才。 高校作为人才培养的重要基地,也发挥着不可或缺的作用。他…

【Spark编程基础】实验三RDD 编程初级实践(附源代码)

目录 一、实验目的二、实验平台三、实验内容1.spark-shell 交互式编程2.编写独立应用程序实现数据去重3.编写独立应用程序实现求平均值问题 一、实验目的 1、熟悉 Spark 的 RDD 基本操作及键值对操作; 2、熟悉使用 RDD 编程解决实际具体问题的方法 二、实验平台 …