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.