Beats是 Elastic 公司开发提供的开源数据收集器集合,它可以帮助你将指定的数据发送到 Elasticsearch。Elastic 提供了多种类的 Beats 用来收集不同的数据,如审计数据、日志文件、云端数据、运行时间监控、指标、网络数据和 Windows 事件日志等。这些 Beats 都可以通过简单的配置实现数据收集功能。

除了 Elastic 提供的 Beats 外,还有一些第三方开源 Beats,如 libbeat。libbeat 是 Elastic Stack 的一部分,它是一个轻量级的数据收集器,可以与 Elastic Stack 无缝集成。

要开发 Beats,你需要了解 libbeat 模块的功能图。一个 Beat 应该包含以下两部分:一个数据收集组件(用来收集数据)和一个数据推送组件(用来将收集到的数据推送到指定的输出源)。在这个过程中,你可以参考 libbeat 的官方文档和示例代码来了解如何编写 Beats。

总之,Beats 是一种强大的数据收集工具,可以帮助你轻松地将各种类型的数据发送到 Elasticsearch 进行分析和处理。通过学习和使用 Beats,你可以更好地了解和利用 Elastic Stack 的强大功能。

```

1. 拉取 beats 代码

第一步:在终端中执行以下命令,拉取 beats 代码:

```bash

git clone https://github.com/elastic/beats.git

```

2. 创建项目

第二步:进入 beats 目录,创建一个新的项目文件夹,并进入该文件夹:

```bash

cd beats

mkdir my_project

cd my_project

```

3. 修改配置文件

第三步:根据需要修改 `winlogbeat.yml` 和 `system` 文件。例如,可以修改 `winlogbeat.yml` 中的 `hostname` 和 `name`,以及 `system` 文件中的 `filesize` 和 `modtime`。

4. 构建项目

第四步:在项目根目录下执行以下命令,构建项目:

```bash

./gradlew build

```

以下是重构后的内容:

1. 创建目录结构并克隆 elastic/beats 仓库:

```bash

mkdir -p ${GOPATH}/src/github.com/elastic

git clone https://github.com/elastic/beats ${GOPATH}/src/github.com/elastic/beats

git checkout 7.0

```

2. 建立自己的 beat 项目:

```bash

mkdir ${GOPATH}/src/github.com/{user}

cd ${GOPATH}/src/github.com/{user}

```

3. 生成通用代码:

```bash

python $GOPATH/src/github.com/elastic/beats/script/generate.py Beat Name [Examplebeat]: Countbeat Your Github Name [your-github-name]: {username} Beat Path [github.com/{github id}/{beat name}]: Firstname Lastname: {Full Name}

```

4. 拉取依赖数据:

```bash

cd ${GOPATH}/src/github.com/{user}/countbeat

make setup

```

5. 编译文件,生成一个二进制可执行文件 countbeat:

```bash

mage build

```

6. 执行:

```bash

./countbeat -e -d "*"

```

3.2. Beater接口

每个 beat 都需要实现 libbeat中定义的 Beater 接口。

```go

type Beater interface { // 主事件循环,此方法应该阻塞,直到通过调用Stop()方法来停止。

Run(b *Beat) error

// 调用此方法以指示Run()方法应完成其执行。

// 它最多会被调用一次。

Stop()

}

```

以下是重构后的代码:

```

type Countbeat struct {

done chan struct{}

config config.Config

client publisher.Client

}

func New(b *beat.Beat, cfg *common.Config) (beat.Beater, error) {

config := config.DefaultConfig

if err := cfg.Unpack(&config); err != nil {

return nil, fmt.Errorf("Error reading config file: %v", err)

}

bt := &Countbeat{

done: make(chan struct{}),

config: config,

}

return bt, nil

}

func (bt *Countbeat) Run(b *beat.Beat) error {

// TODO: implement the logic of running the beat in here.

return nil

}

func (bt *Countbeat) Stop() {

close(bt.done)

// TODO: implement the logic of stopping the beat in here.

}

```

countbeat: # Defines how often an event is sent to the output

period: 10s

config/config.go_meta/beat.yml

```yaml

type Config struct {

Period time.Duration `config:"period"`

Path string `config:"path"`

}

var DefaultConfig = Config{

Period: 1 * time.Second,

Path: ".",

}

```

countbeat:

period: 10s

path: "."

make update

```yaml

- name: Countbeat

config:

period: 1s # 设置定时器的时间间隔

...

fields: # 定义字段

- name: done

type: "bool"

...

description: "停止计数器的信号"

- name: client

type: "mesos.ClientID"

...

description: "客户端连接"

- name: counter

type: "int"

...

description: "当前计数器值" # 重构后的内容如下:

- name: Countbeat

config:

period: 1s # 设置定时器的时间间隔

...

fields: # 定义字段

- name: done

type: "bool"

...

description: "停止计数器的信号"

- name: client

type: "mesos.ClientID"

...

description: "客户端连接"

- name: counter

type: "integer" # 将 int 改为 integer,使其更符合 Golang 语言规范

...

description: "当前计数器值" # 将 <-bt.done; 改为 <-client,将 <-ticker.C; 改为 event := common.MapStr{},使代码更具可读性。

Countbeat

## 3.2.3. Stop方法

`Stop()` 函数用于停止服务。

```go

func (bt *Countbeat) Stop() {

bt.client.Close()

close(bt.done)

}

```

## 3.2.4. 主函数

在 `main` 函数中,我们首先生成一个根命令,然后执行它。如果出现错误,将退出程序。

```go

package main

import (

"os"

"github.com/elastic/beats/libbeat/beat"

"github.com/elastic/beats/libbeat/cmd"

"github.com/elastic/beats/libbeat/cmd/instance"

"github.com/kimjmin/countbeat/beater"

)

var RootCmd = cmd.GenRootCmdWithSettings(beater.New, instance.Settings{Name: "countbeat"})

func main() {

if err := RootCmd.Execute(); err != nil {

os.Exit(1)

}

}

```

Microseconds is the smallest unit of time, equivalent to 1/1,000,000 seconds. It is also known as nanoseconds and normalized. In computer science, it is often used to measure the speed of data transmission or the response time of a system. For example, if a program takes 5 microseconds to complete a task, you can say that it completes in 5 cycles per second, which is the same as saying that it completes in 5 million nanoseconds. On the other hand, 1 nanosecond is equal to 1/1,000,000,000,000,000 seconds, or about 1 trillionth of a second. This makes it much smaller than a microsecond, which is why it is often referred to as the "nano-scale" or "nanometer scale" of time.