LoongCollector

1758
下载
LoongCollector 源自阿里云可观测性团队所开源的 iLogtail 项目,在继承了 iLogtail 强大的日志采集与处理能力的基础上,进行了全面的功能升级与扩展。从原来单一日志场景,逐步扩展为可观测数据采集、本地计算、服务发现的统一体。 LoongCollector 是一款集卓越性能、超强稳定性和灵活可编程性于一身的数据采集器,专为构建下一代可观测 Pipeline 设计。愿景是:打造业界领先的“统一可观测 Agent(Unified Observability Agent)”与“端到端可观

开发环境


虽然源代码编译已经提供了方便的LoongCollector编译方法,但却不适合开发场景。因为开发过程中需要不断进行编译调试,重复全量编译的速度太慢,因此需要构建支持增量编译开发环境。

进程结构

LoongCollector为了支持插件系统,引入了 libPluginAdaptor 和 libPluginBase(以下简称 adaptor 和 base)这两个动态库,它们与 LoongCollector 之间的关系如下:
LoongCollector 动态依赖于这两个动态库(即 binary 中不依赖),在初始化时,LoongCollector 会尝试使用动态库接口(如 dlopen)动态加载它们,获取所需的符号。
Adaptor 充当一个中间层,LoongCollector 和 base 均依赖它,LoongCollector 向 adaptor 注册回调,adpator 将这些回调记录下来以接口的形式暴露给 base 使用。
Base 是插件系统的主体,它包含插件系统所必须的采集、处理、聚合以及输出(向 LoongCollector 递交可以视为其中一种)等功能。
因此,完整的LoongCollector包含LoongCollector、libPluginAdaptor.so 和 libPluginBase.so 3个二进制文件。

目录结构

LoongCollector的大致目录结构如下:

Terminal window
.
├── core # C++核心代码
├── CMakeLists.txt # C++项目描述文件
└── ilogtail.cpp # C++主函数
├── plugins # Go插件代码
├── go.mod # Go项目描述文件
├── docker # 辅助编译的镜像描述目录
├── scripts # 辅助编译的脚本目录
└── Makefile # 编译描述文件

core目录包含了LoongCollector C++核心代码,ilogtail.cpp是其主函数入口文件。C++项目使用CMake描述,CMakeLists.txt是总入口,各子目录中还有CMakeLists.txt描述子目录下的编译目标。

顶层目录.本身就是一个Go项目,该项目为LoongCollector插件,go.mod为其描述文件。插件代码主体在plugins目录。

docker目录和scripts目录分别为辅助编译的镜像描述目录和脚本目录。Makefile为整个LoongCollector的编译描述文件,对编译命令进行了封装。

开发镜像

LoongCollector依赖了诸多第三方库(详见编译依赖),为了简化编译流程LoongCollector提供了预编译依赖的镜像辅助编译。开发镜像的地址在sls-opensource-registry.cn-shanghai.cr.aliyuncs.com/loongcollector-community-edition/loongcollector-build-linux,可通过下面命令获取。

Terminal window
docker pull sls-opensource-registry.cn-shanghai.cr.aliyuncs.com/loongcollector-community-edition/loongcollector-build-linux

开发镜像预先安装了gcc和go编译器,更新了git,为了代码风格统一安装了clang-format、go-tools,为了便于调试也安装了gdb、go-delve等工具。为方便国内开发者,预先设置了GOPROXY=“https://goproxy.cn,direct”

Terminal window
$ gcc --version
gcc (GCC) 9.3.1 20200408 (Red Hat 9.3.1-2)
$ go version
go version go1.16.15 linux/amd64
$ git --version
git version 2.29.3

C++核心的编译依赖在/opt/logtail/deps/目录下,该路径是CMakeLists.txt的DEFAULT_DEPS_ROOT(可以查看./core/dependencies.cmake找到修改路径的变量)。

Terminal window
$ ls /opt/logtail/deps/
bin include lib lib64 share ssl

如果需要安装更多工具或编译依赖,可以在开发镜像上镜像叠加,制作自定义的开发镜像。

from sls-opensource-registry.cn-shanghai.cr.aliyuncs.com/loongcollector-community-edition/loongcollector-build-linux
yum -y install ...
go install ...

使用VS Code构建开发环境

VS Code通过Remote Development插件可以实现远程开发、在镜像中开发,甚至远程+镜像中开发,在镜像中开发的功能使得编译环境在不同部署间都能保持统一。由于VS Code免费而功能强大,因此我们选用VS Code来为LoongCollector创建一致的、可移植的开发环境。

1. 安装插件

在VS Code的Marketplace中搜索“Remote Development”安装插件。

2. 创建镜像开发环境配置

LoongCollector代码库的顶层目录创建.devcontainer目录,并在里面创建devcontainer.json文件,文件的内容如下:

{
"image": "sls-opensource-registry.cn-shanghai.cr.aliyuncs.com/loongcollector-community-edition/loongcollector-build-linux:2.0.5",
"customizations": {
"vscode": {
"extensions": [
"golang.Go",
"ms-vscode.cpptools-extension-pack",
"DavidAnson.vscode-markdownlint",
"redhat.vscode-yaml"
]
}
}
}

其中,image指定了LoongCollector的开发镜像地址,customizations.vscode.extensions指定了开发环境的插件。部分插件介绍如下,开发者也可以按照自己的习惯进行修改,欢迎讨论

插件名用途
golang.GoGo开发必备插件
ms-vscode.cpptools-extension-packC++开发必备插件
DavidAnson.vscode-markdownlintMarkdown代码风格检查
redhat.vscode-yamlYAML语言支持

3. 在容器中打开代码库

使用Shift + Command + P(Mac)或Ctrl + Shift + P(Win)打开命令面板,输入reopen,选择Remote-Containers: Reopen in Container

或者若出现如下图提示,则可以直接点击在容器中重新打开。

首次打开时会比较慢,因为要下载编译镜像并安装插件,后面再次打开时速度会很快。按照提示进行镜像Build。
完成上述步骤后,我们已经可以使用VS Code进行代码编辑,并在其中进行代码编译。
注:如果以前拉取过编译镜像,可能需要触发Remote-Containers: Rebuild Container Without Cache重新构建。

4. 在容器中进行编译

打开新Terminal(找不到的可以在命令面板中打Terminal,选择新开一个)

  • 编译Go插件
Terminal window
go mod tidy # 若需要更新插件库
make plugin_local # 每次更新插件代码后从这里开始


如果只是对插件代码进行了修改,则只需要执行最后一行命令即可增量编译。

  • 编译C++代码
Terminal window
mkdir -p core/build # 若之前没有建过
cd core/build
cmake .. # 若增删文件,修改CMakeLists.txt后需要重新执行
make -sj$(nproc) # 每次更新core代码后从这里开始


如果只是对core代码进行了修改,则只需要执行最后一行命令即可增量编译。

默认的编译选项代码可能被优化,若需要Debug建议修改CMAKE_BUILD_TYPE开关。替换上述第2行为

Terminal window
cmake -D CMAKE_BUILD_TYPE=Debug ..

同理,若需要明确需要代码优化,则将上面的Debug改为Release。

默认的编译开关没有打开UT,如果需要编译UT,需要增加BUILD_LOGTAIL_UT开关。替换上述第2行为

Terminal window
cmake -DBUILD_LOGTAIL_UT=ON ..
  • 制作镜像

目前不支持,没有安装docker,请直接在主机上进行编译。

5. 获取编译产出

由于VS Code是直接将代码库目录挂载到镜像内的,因此主机上可以直接访问镜像内的编译产出。

目前,镜像使用的是root用户权限,因此在主机上可能需要执行sudo chown -R $USER .来修复一下权限。

可以将C++核心的构建结果拷贝到./output目录组装出完整的构建结果。

Terminal window
cp -a ./core/build/ilogtail ./output
cp -a ./core/build/go_pipeline/libGoPluginAdapter.so ./output

最终组装的./output目录的结构如下

./output
├── ilogtail (主程序)
├── libGoPluginAdapter.so(插件接口)
├── libGoPluginBase.h
└── libGoPluginBase.so (插件lib)

直接使用镜像编译

如果不方便使用VS Code,也可以通过Docker手动挂载代码库目录的方式,启动编译镜像进入编译。

1. 进入源代码顶层目录

2. 创建编译容器,并挂载代码目录

Terminal window
docker run --name ilogtail-build -d \
-v `pwd`:/src -w /src \
sls-opensource-registry.cn-shanghai.cr.aliyuncs.com/loongcollector-community-edition/loongcollector-build-linux:2.0.5 \
bash -c "sleep infinity"

3. 进入容器

Terminal window
docker exec -it ilogtail-build bash

4. 在容器内编译

后续步骤均与VS Code的操作步骤相同。

使用编译产出

在主机上,编译的后的产出可以直接替换对应的文件使用。而对于容器场景,虽然在编译镜像内没有制作镜像能力,但通过下面的方法可以在不制作新镜像的情况下实现快速测试。

1. 修改官方镜像entrypoint

基于官方镜像包进行调试,首先用bash覆盖官方镜像的entrypoint,避免杀死LoongCollector后容器直接退出。

  • docker:指定CMD
Terminal window
docker run -it --name docker_ilogtail -v /:/logtail_host:ro -v /var/run:/var/run aliyun/ilogtail:<VERSION> bash
  • k8s:用command覆盖entrypoint
command:
- sleep
- 'infinity'
# 删除livenessProbe,要不然会因为探测不到端口重启

2. 将自己编的二进制文件、so,替换到容器里

由于LoongCollector容器挂载了主机目录,因此将需要替换掉文件放到主机目录上容器内就能访问。

Terminal window
# 将开发机上编译的so scp到container所在node上
scp libGoPluginBase.so <user>@<node>:/home/<user>

主机的根路径在LoongCollector容器中位于/logtail_host,找到对应目录进行copy即可。

Terminal window
cp /logtail_host/home/<user>/libGoPluginBase.so /usr/local/loongcollector

常见问题

1. 更新代码后编译错误

如果发生编译错误,如

Terminal window
/src/core/common/CompressTools.cpp:18:23: fatal error: zstd/zstd.h: No such file or directory
#include <zstd/zstd.h>
^
compilation terminated.

请确保本地编译镜像为最新版本。可使用以下命令更新:

Terminal window
docker pull sls-opensource-registry.cn-shanghai.cr.aliyuncs.com/loongcollector-community-edition/loongcollector-build-linux

若使用VS Code进行开发,请重新编译开发容器镜像。使用Shift + Command + P(Mac)或Ctrl + Shift + P(Win)打开命令面板,输入rebuild,选择Dev-Containers: Rebuild Without Cache and Reopen in Container


observability.cn Authors 2024 | Documentation Distributed under CC-BY-4.0
Copyright © 2017-2024, Alibaba. All rights reserved. Alibaba has registered trademarks and uses trademarks.
浙ICP备2021005855号-32