玖叶教程网

前端编程开发入门

基于ELK技术栈Beats的大数据感知采集系统的设计与实现

背景介绍

出于业务、运维、安全的需要,我们经常需要采集服务器端多维度的信息,例如设备信息、网络信息、操作系统信息、应用信息、进程信息、流量信息、日志信息等等与环境和应用相关的重要数据。而在数据采集、存储、分析领域,以elasticseach、logstash、kibana开源技术为核心的技术栈有着广泛的使用。就采集程序来讲,ELK技术栈中的beats,提供了一种采集各类信息的框架,使用者紧紧专注于采集的业务逻辑就好。像与elasticsearch的读写操作,程序的打包执行等等基础功能,它都实现了。而且它提供了很多基础的beats,例如metricsbeat,filebeat等,让使用者可以在低代码的思想下,仅仅需要简单的配置,就能够完成采集的工作。今天,给大家演示下如何使用beat以及定制化的beat的执行逻辑是什么

术语

elastic beats里面主要有三种对象,分别是beat,module,metricset.

一个beat由多个module组成。像metricbeat,它就包含system、ceph、mysql等module,从这个地方看,module其实就是采集的对象。

一个module又包含多个metricset,即从一个对象可以采集很多指标集。每个metricset都是一堆指标。像network metricset,它包含上行数据包,下行数据包,上行速率,下行速率4个指标

测试开发环境搭建

我们为了快速搭建开发测试环境,使用了docker启动了elasticsearch和kibana。具体的命令如下所示

  1. 网络虚拟化
docker network create elastic

2.elasticsearch 启动

docker run -d --name es01-test --net elastic -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e "xpack.security.enabled=true" -v /root/elk/elastic-data:/usr/share/elasticsearch/data docker.elastic.co/elasticsearch/elasticsearch:7.16.2

3.创建内置用户

进入elasticsearch 容器,交互模式,设置密码

docker exec -it es01-test /bin/bash
bin/elasticsearch-setup-passwords interactive

4.启动kibana容器

其中ELASTICSEARCH_PASSWORD就是上面设置的密码

docker run --name kib01-test -d --net elastic -p 5601:5601 -e "ELASTICSEARCH_HOSTS=http://es01-test:9200" -e "ELASTICSEARCH_USERNAME=kibana_system" -e "ELASTICSEARCH_PASSWORD=123456" docker.elastic.co/kibana/kibana:7.16.2

构建全新beat

安装mage

mage主要是用来构建基于go语言的项目的。所以本小节主要给出它的安装

使用bootstrap脚本构建mage,生成的可执行文件mage地址,在终端中会显示

git clone https://github.com/magefile/mage
cd mage
go run bootstrap.go

Running target: Install

exec: go "env" "GOBIN"

exec: go "env" "GOPATH"

exec: git "rev-parse" "--short" "HEAD"

exec: git "describe" "--tags"

exec: go "build" "-o" "/Users/dongluyang1/go/bin/mage" "-ldflags=-X \"github.com/magefile/mage/mage.timestamp=2022-01-06T14:36:27+08:00\" -X \"github.com/magefile/mage/mage.commitHash=2f1ec40\" -X \"github.com/magefile/mage/mage.gitTag=v1.12.1\"" "github.com/magefile/mage"

从上面的输出中可以看出,地址是在/Users/dongluyang1/go/bin下面,如果这个地址不在你的path路径下面,请把这个路径放在PATH中。

创建新beat

但是要注意master分支很有可能有问题,我使用master时,运行python2.7 generate.py,这个脚本只能用python2运行,python3有问题。脚本提示This script is deprecated. Please use `mage GenerateCustomBeat`,但是运行mage GenerateCustomBeat又遇到Unknown target specified: "GenerateCustomBeat"。所以选择branch很重要,一般不要选择master,因为这个分支在告诉变化,还没有形成版本。下面我使用的是分支7.15

cd ${GOPATH}/src/github.com/elastic (如果没有,请创建)
git clone [email protected]:elastic/beats.git
git checkout 7.15
mkdir -p ${GOPATH}/src/github.com/{user} 
mage GenerateCustomBeat
     Beat Name [Examplebeat]: countbeat
     Your Github Name [your-github-name]: dongluyang
     Beat Path [github.com/dongluyang/countbeat]:
     Firstname Lastname: dongluyang
     Enter the beat type [beat]: beat
     Enter the github.com/elastic/beats revision [master]: 7.15

编译打包并运行

${GOPATH}/src/github.com/{user}
mage build
    >> build: Building countbeat
./countbeat -e
2022-01-06T17:21:39.159+0800	INFO	beater/Countbeat.go:62	Event sent
2022-01-06T17:21:39.165+0800	INFO	[monitoring]	log/log.go:184	Non-zero metrics in the last 30s	{"monitoring": {"metrics": {"beat":{"cpu":{"system":{"ticks":72,"time":{"ms":72}},"total":{"ticks":264,"time":{"ms":267},"value":264},"user":{"ticks":192,"time":{"ms":195}}},"info":{"ephemeral_id":"3cf1c38c-6bbc-4924-9dff-7f03d8ed2648","uptime":{"ms":30041},"version":"7.15.3"},"memstats":{"gc_next":12242672,"memory_alloc":10731464,"memory_sys":75383816,"memory_total":33118016,"rss":47915008},"runtime":{"goroutines":13}},"libbeat":{"config":{"module":{"running":0}},"output":{"events":{"acked":28,"active":0,"batches":9,"total":28},"read":{"bytes":7519},"type":"elasticsearch","write":{"bytes":109103}},"pipeline":{"clients":1,"events":{"active":2,"published":30,"retry":3,"total":30},"queue":{"acked":28,"max_events":4096}}},"system":{"cpu":{"cores":4},"load":{"1":2.4795,"15":2.7275,"5":2.6279,"norm":{"1":0.6199,"15":0.6819,"5":0.657}}}}}}

kibana查看

定制化的beat运行原理

1.main方法执行的入口,我们看到,主要是调用了cmd.RootCmd的Execute方法。那么cmd.RootCmd是什么呢。接着向下看

2.在cmd/root.go里面,可以看到上面的RootCmd是BeatsRootCmd类型的变量,而且它继承了cobra.Command

type BeatsRootCmd struct {
   cobra.Command
   RunCmd        *cobra.Command
   SetupCmd      *cobra.Command
   VersionCmd    *cobra.Command
   CompletionCmd *cobra.Command
   ExportCmd     *cobra.Command
   TestCmd       *cobra.Command
   KeystoreCmd   *cobra.Command
}

3.我们来看看第一步中GenRootCmdWithSettings方法里面是如何生成上面的RootCmd变量的.从下面的2张图可以看到,rootCmd := &BeatsRootCmd{}, 而且它的RunCmd等相关命令也是一种cobra.Command。即rootCmd是一种cobra.Command,它自己的各个命令也是cobra.Command。上面给出的BeatsRootCmd结构体也可以看出来

4.它怎么运行的呢,别忘了第一步main入口里面的cmd.RootCmd.Execute(),它最终还是调用了RootCmd的execute方法,而这个execute方法就是执行cobra.Command定义的run方法。这个run方法就是上面的4图中标示.它的主要逻辑还是执行了beat的launch方法

6.执行countbeat逻辑代码

在beat的launch代码里面,会创建一个我们的countbeat结构体。下面的bt就是传过来的countbeat.go里面的创建函数。然后它会设置一系列的通用参数。图6给出部分解释,然后launch的最后一句就是执行了beater.Run方法,就是countbeat的run方法。

beater, err := b.createBeater(bt)
.
.
.
.
return beater.Run(&b.Beat)

创建metricset

切换到具体的module目录下面,本例以system模块为例。我们先切换到system目录下面

运行下面命令,根据提示,填写module名称、metricset名称。我们分别输入的是system和log

make create-metricset

得到的代码目录:

然后我们直接运行代码,发现system/log找不到。这个地方有个坑,文档里面,让运行make collect和make两个命令,但是结果却是make: *** No rule to make target `collect'. Stop. 我们索性通过修改list_common.go文件,把新建的metricset log添加进去。这样再次运行就可以采集log数据了

总结

本文,给大家介绍了如何在ELK beats框架下,创建一个全新的beat,或是在一个现有的beat里面添加一个新的metricset的实战操作。希望给大家有所启发和帮助。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言