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

Observability:使用 Elastic Agent 来收集定制的 TCP 日志

自定义 TCP 日志包初始化一个侦听 TCP 套接字,该套接字收集接收到的任何 TCP 流量并将每一行作为文档发送到 Elasticsearch。 可以通过将 ingest pipeline 的名字添加到管道配置选项来添加自定义摄取管道,可以通过 API 或摄取节点管道 UI创建自定义摄取管道。

前提条件

在进行下面的练习之前,请先阅读我之前的文章 “Observability:使用 Elastic Agent 来进行 Uptime 监控” 来搭建自己的测试环境。我们按照那篇文章的配置来进行,直到我们添加 integration 那一步。

添加 integration

为了能够把 TCP 的日志包写入到 Elasticsearch 中,我们可以添加 Custom TCP Logs 集成:

 

我们保存当前的配置:

从上面的配置中,我们可以看出来,我们的 tcp-1 集成收集 localhost:9900 端口的 TCP 日志并传入到 Elasticsearch 中。 

经过上面的配置后,我们可以使用如下的命令来检查当前 Ubuntu 机器上的 9900 端口的使用情况:

sudo netstat -tulpn | grep LISTEN | grep 9900
liuxg@liuxgu:~$ sudo netstat -tulpn | grep LISTEN | grep 9900
[sudo] password for liuxg: 
tcp        0      0 127.0.0.1:9900          0.0.0.0:*               LISTEN      10368/filebeat

我们可以看到当前的 9900 是正在使用的。

测试集成

为了能够测试这个集成,我们在 Ubuntu 机器的一个目录中创建如下的一个 logs 文件。它是一个典型的 Syslog 日志:

liuxg@liuxgu:~/data/customtcplogs$ pwd
/home/liuxg/data/customtcplogs
liuxg@liuxgu:~/data/customtcplogs$ ls
logs
liuxg@liuxgu:~/data/customtcplogs$ cat logs
May  4 00:10:36 liuxg xpcproxy[69746]: libcoreservices: _dirhelper_userdir: 557: bootstrap_look_up returned (ipc/send) invalid destination port

我们使用如下的命令来发送日志到 localhost:9900 的 TCP 端口中:

head -n 1 logs | nc localhost 9900
liuxg@liuxgu:~/data/customtcplogs$ pwd
/home/liuxg/data/customtcplogs
liuxg@liuxgu:~/data/customtcplogs$ head -n 1 logs | nc localhost 9900

我们接下去 Kibana 查看一下:

 我们可以看到在过去 15分钟里有一个文档。点击详情:

 从上面的 message 字段中,我们可以看出来我们发送来的一个日志信息。它就是我们之前发送的。

我们也可以通过如下的命令来发送信息:

 在上面,我们使用 telnet 来发送一个信息到 TCP 端口 9900。同样,我们再去 Kibana 进行查看:

 这次,我们可以看到有两条信息发送进来了。

从上面显示的信息,我们看出来 message 字段还是一个非结构化的字段。它不便于我们对这个信息的分析。为此,我们希望使用 ingest pipeline 来对这个信息进行结构化。为了下面的步骤的进行,我们先使用如下的命令来删除已经写入的文档:

POST .ds-logs-tcp.generic-*/_delete_by_query
{
  "query": {
    "match": {
      "data_stream.dataset": "tcp.generic" 
    }
  }
}

结构化输入的信息

首先,我们使用 ingest pipeline API 来测试我们的 pipelines:

POST _ingest/pipeline/_simulate
{
  "pipeline": {
    "processors": [
      {
        "grok": {
          "field": "message",
          "patterns": [
            "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:[%{POSINT:syslog_pid}])?:%{GREEDYDATA:syslog_message}"
          ]
        }
      }
    ]
  },
  "docs": [
    {
      "_source": {
        "message": "May  4 00:10:36 liuxg xpcproxy[69746]: libcoreservices: _dirhelper_userdir: 557: bootstrap_look_up returned (ipc/send) invalid destination port"
      }
    }
  ]
}

我们使用上面的测试命令,可以看到如下的结果:

{
  "docs": [
    {
      "doc": {
        "_index": "_index",
        "_id": "_id",
        "_version": "-3",
        "_source": {
          "syslog_program": "xpcproxy[69746]",
          "message": "May  4 00:10:36 liuxg xpcproxy[69746]: libcoreservices: _dirhelper_userdir: 557: bootstrap_look_up returned (ipc/send) invalid destination port",
          "syslog_hostname": "liuxg",
          "syslog_message": " libcoreservices: _dirhelper_userdir: 557: bootstrap_look_up returned (ipc/send) invalid destination port",
          "syslog_timestamp": "May  4 00:10:36"
        },
        "_ingest": {
          "timestamp": "2022-09-21T09:23:14.824894Z"
        }
      }
    }
  ]
}

很显然,我们可以看到结构化的字段,比如 syslog_program, syslog_hostname 等。当然,我们还可以使用另外一个 processor 来删除 message 这个字段。如果你对 ingest pipeline 还不是很熟的话,请阅读我之前的文章 “Elastic:开发者上手指南” 中的 “Ingest pipeline” 章节。

我们接下来创建一个叫做 structure_message 的 pipeline:

PUT _ingest/pipeline/structure_message
{
  "description": "This is used to structure messages",
  "processors": [
    {
      "grok": {
        "field": "message",
        "patterns": [
          "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:[%{POSINT:syslog_pid}])?:%{GREEDYDATA:syslog_message}"
        ]
      }
    }
  ]
}

我们接下来重新来编辑之前的 integration:

 

 

 

 

这样,我们就更新成功了。

接下来,我们再次使用上面的命令来写入一个文档: 

head -n 1 logs| nc localhost 9900
liuxg@liuxgu:~/data/customtcplogs$ pwd
/home/liuxg/data/customtcplogs
liuxg@liuxgu:~/data/customtcplogs$ head -n 1 logs | nc localhost 9900

我们回到 Kibana 的界面:

 我们可以看到有一个文档被写入进来了。我们点击上面文档的详情:

 

从上面,我们可以看出来,我们这次看到的数据是分析好的结构化的数据。这个便于我们对日志数据进行分析和统计。 

相关文章:

  • 【C++】C++ 入门
  • Flink Kafka Sink 源码分析
  • 高斯消元法(2)——保姆级笔记
  • R语言因子分析全流程
  • Nginx简单配置 - 基础安全
  • 基于sdrpi的openwifi实践2:生成BOOT.BIN
  • 七、安装Centos7+8系统+超级优化
  • Kali-登录暴力破解器工具-medusa使用
  • 除砷树脂HP-776
  • 矿产行业供应链协同系统解决方案:构建数智化平台,保障矿产资源安全供应
  • 申请专利流程及费用。
  • HTML+CSS期末网页设计前端作品(大三)
  • java-php-python-ssm-民航售票管理系统-计算机毕业设计
  • 学生台灯用led灯好还是荧光灯好?推荐几款高品质的LED灯
  • RabbitMQ安装
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • Android开源项目规范总结
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • Angular 响应式表单之下拉框
  • express如何解决request entity too large问题
  • JAVA_NIO系列——Channel和Buffer详解
  • JAVA并发编程--1.基础概念
  • JS题目及答案整理
  • linux学习笔记
  • Netty 4.1 源代码学习:线程模型
  • nodejs实现webservice问题总结
  • Python - 闭包Closure
  • storm drpc实例
  • VUE es6技巧写法(持续更新中~~~)
  • win10下安装mysql5.7
  • 将 Measurements 和 Units 应用到物理学
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 小程序 setData 学问多
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • #100天计划# 2013年9月29日
  • #13 yum、编译安装与sed命令的使用
  • #etcd#安装时出错
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (09)Hive——CTE 公共表达式
  • (1)虚拟机的安装与使用,linux系统安装
  • (12)目标检测_SSD基于pytorch搭建代码
  • (第61天)多租户架构(CDB/PDB)
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (定时器/计数器)中断系统(详解与使用)
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (转)3D模板阴影原理
  • (转)Scala的“=”符号简介
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • .NET Core跨平台微服务学习资源
  • .NET 中使用 Mutex 进行跨越进程边界的同步