为 Beats 做贡献
如果您有想要贡献的错误修复或新功能,请先在论坛上发起一个话题。可能已经有人在处理相关事宜,或者在您实施更改之前,有一些特定的问题是您需要了解的。
我们乐于与贡献者合作,以让他们的代码被接受。解决问题的方法有很多,在编写大量代码之前找到最佳方案非常重要。在提交代码后,请查看Elastic 贡献者计划 (Elastic Contributor Program),在那里您可以为自己的贡献赚取积分和奖励。
为任何 Elastic 存储库做出贡献的过程都是相似的。
- 请确保您已签署我们的贡献者许可协议 (Contributor License Agreement)。我们并不要求您将版权转让给我们,而是希望您授予我们不受限制地分发您的代码的权利。我们要求所有贡献者这样做,是为了向我们的用户保证代码的来源和持续存在。您只需要签署一次 CLA。
- 发送拉取请求 (Pull Request)!将您的更改推送到您的存储库 fork,并使用我们的拉取请求指南提交拉取请求。新的 PR 会合并到主分支 (main branch)。Beats 核心团队会在必要时将您的 PR 向后移植 (backport)。
在拉取请求中,请描述您的更改内容,并提及与该拉取请求相关的任何错误/问题。此外,请使用变更日志工具在 ./changelog/fragments 中添加变更日志。
Beats 是 Go 程序,因此请安装 Beats 开发所使用的 1.22.10 版本 Go。
安装 Go 后,设置 GOPATH 环境变量以指向您的工作区位置,并确保 $GOPATH/bin 在您的 PATH 中。
使用 GVM Go 版本管理器是安装适用于 Beats 的正确 Go 版本的一种确定性方法。Mac 用户的一个示例如下
gvm use 1.22.10
eval $(gvm 1.22.10)
然后您可以克隆 Beats git 存储库
mkdir -p ${GOPATH}/src/github.com/elastic
git clone https://github.com/elastic/beats ${GOPATH}/src/github.com/elastic/beats
如果您有多个 go 路径,请使用 ${GOPATH%%:*} 而不是 ${GOPATH}。
Beats 开发人员主要使用 Mage 进行开发。您可以使用 make 目标安装 mage
make mage
然后,您可以使用 Mage 编译特定的 Beat。例如,对于 Filebeat
cd beats/filebeat
mage build
您可以使用以下命令列出所有可用的 mage 目标
mage -l
一些 Beat 可能有额外的开发要求,在这种情况下,您会在 Beat 目录中找到 CONTRIBUTING.md 文件。
我们在 beats 存储库中使用 EditorConfig 文件来标准化不同编辑器处理我们文件中的空格、换行符和其他编码样式的方式。大多数主流编辑器都有 EditorConfig 插件,我们强烈建议您安装它。
Beats 使用各种基于 Python、make 和 mage 的脚本来生成配置文件和文档。请确保使用 .python-version 文件中列出的 Python 版本。
更新生成文件的主要命令是
make update
每个 Beat 都有自己的 update 目标(适用于 make 和 mage),以及存储库根目录中的主 update 目标。如果 PR 添加或删除了依赖项,请在根 beats 目录中运行 make update。
另一个命令可以正确格式化 go 源文件并添加版权声明头
make fmt
这两个命令都应在提交 PR 之前运行。您可以使用 make help 查看所有可用的 make 目标。
这些命令具有以下依赖项
Python venv 模块包含在 Python 3 的标准库中。在 Debian/Ubuntu 系统上,还需要安装 python3-venv 软件包,其中包含额外的支持脚本
sudo apt-get install python3-venv
Beats 是使用 make release 目标构建的。默认情况下,make 会从有限数量的预设构建目标中进行选择
- darwin/amd64
- darwin/arm64
- linux/amd64
- windows/amd64
您可以使用 PLATFORMS 环境变量更改构建目标。使用 PLATFORMS 变量设置的目标可以是 GOOS 值,也可以是 GOOS/arch 对。例如,linux 和 linux/amd64 都是有效的目标。您可以选择多个目标,并且 PLATFORMS 列表以空格分隔,例如 darwin windows 将在所有受支持的 darwin 和 windows 架构上进行构建。此外,您可以通过在给定目标前加上 + 或 - 来添加或从构建目标列表中删除目标。例如:+bsd 或 -darwin。
您可以使用 go tool dist list 找到受支持构建目标的完整列表。
Beats 使用 golangci-lint。您可以针对您的更改运行预配置的 linter
mage llc
llc 代表 Lint Last Change,它包含在最后一次提交(如果您在 main 分支上)或您的功能分支与 main 分支之间的差异中更改的所有 Go 文件。
有时贡献者可能会被要求修复与其贡献无关的 linter 问题,这是预料之中的,因为 linter 的引入时间晚于某些文件中的更改。
您还可以针对单个包运行 linter,例如 filebeat 命令包
golangci-lint run ./filebeat/cmd/...
您可以使用以下命令运行整个测试套件
make testsuite
运行测试套件有以下要求
- Python >= 3.7
- Docker >= 1.12
- Docker-compose >= 1.11
有关更多详细信息,请参阅测试 (Testing) 指南。
所有 Beats 文档都位于 elastic/beats 存储库中
beats/docs/extend包含有关开发和贡献 Beats 代码的文档。beats/docs/reference包含每个单独 Beat 的文档,以及beats/docs/reference/libbeat目录中所有 Beats 通用的某些内容。beats/docs/release-notes包含所有产品更新说明。
从 9.0.0 版本开始,所有 开源搜索教程均以 Markdown 格式提供。有关为 开源搜索教程做出贡献的一般信息(包括版本控制指南、语法参考等),请参阅 Elastic Docs v3 欢迎页面。
为了创建 Beats,我们依赖 Golang 库和其他外部工具。
除了 Go 库之外,我们还使用开发工具来为输入和处理器生成解析器。
运行 go generate 需要以下软件包
- FlatBuffers >= 1.9
- Graphviz >= 2.43.0
- Ragel >= 6.10
要及时了解官方 Beats 面向社区开发人员的变更,请关注此处的开发人员变更日志。