iLogtail社区版开发者指南 - 快速搭建编译和开发环境

本文涉及的产品
对象存储 OSS,OSS 加速器 50 GB 1个月
简介: 想尝鲜最新版iLogtail代码提供的功能?想测试刚给iLogtail添加的代码?如何将iLogtail的开源代码转变为可执行程序是很多小伙伴关心的问题。本文将详细描述iLogtail的编译方法,并利用提供的开发镜像,详细描述如何构建一个高效开发iLogtail的环境。

iLogtail是阿里云日志服务(SLS)团队自研的可观测数据采集Agent,拥有的轻量级、高性能、自动化配置等诸多生产级别特性,可以署于物理机、虚拟机、Kubernetes等多种环境中来采集遥测数据。iLogtail在阿里云上服务了数万家客户主机和容器的可观测性采集工作,在阿里巴巴集团的核心产品线,如淘宝、天猫、支付宝、菜鸟、高德地图等也是默认的日志、监控、Trace等多种可观测数据的采集工具。目前iLogtail已有千万级的安装量,每天采集数十PB的可观测数据,广泛应用于线上监控、问题分析/定位、运营分析、安全分析等多种场景,在实战中验证了其强大的性能和稳定性。

在当今云原生的时代,我们坚信开源才是iLogtail最优的发展策略,也是释放其最大价值的方法。因此,我们决定将iLogtail开源,期望同众多开发者一起将iLogtail打造成世界一流的可观测数据采集器。

背景

想尝鲜最新版iLogtail代码提供的功能?想测试刚给iLogtail添加的代码?如何将iLogtail的开源代码转变为可执行程序是很多小伙伴关心的问题。本文将详细描述iLogtail的编译方法,并利用提供的开发镜像,详细描述如何构建一个高效开发iLogtail的环境。

编译

进程结构

iLogtail为了支持插件系统,引入了 libPluginAdaptor 和 libPluginBase(以下简称 adaptor 和 base)这两个动态库,它们与 iLogtail 之间的关系如下:

iLogtail 动态依赖于这两个动态库(即 binary 中不依赖),在初始化时,iLogtail 会尝试使用动态库接口(如 dlopen)动态加载它们,获取所需的符号。

Adaptor 充当一个中间层,iLogtail 和 base 均依赖它,iLogtail 向 adaptor 注册回调,adpator 将这些回调记录下来以接口的形式暴露给 base 使用。

Base 是插件系统的主体,它包含插件系统所必须的采集、处理、聚合以及输出(向 iLogtail 递交可以视为其中一种)等功能。

因此,完整的iLogtail包含ilogtail、libPluginAdaptor.so 和 libPluginBase.so 3个二进制文件。

目录结构

iLogtail的大致目录结构如下:

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

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

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

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

编译目标

Makefile中描述了整个项目的所有编译目标,主要的包括:

目标

描述

core

仅编译C++核心

plugin

仅编译Go插件

all

编译完整iLogtail

dist

打包发行

docker

制作iLogtail镜像

vendor

更新插件依赖

plugin_local

本地编译Go插件

这些目标的编译都依赖Docker,因此编译前请确保Docker已经安装,并且具备访问权限。

使用make <target>命令编译所选目标,如果需要指定生成的版本号则在编译命令前加上VERSION环境变量,如:

VERSION=1.1.1 make dist

编译完整iLogtail

编译完整iLogtail的命令是make all,由于all是默认的编译目标,因此也可以直接make。该命令首先清理output目录,然后调用./scripts/gen_build_scripts.sh脚本生成编译用的脚本和镜像描述保存到./gen目录,调用 docker 制作镜像,制作的过程即镜像内的编译过程,最后将镜像内的编译结果复制到output目录。

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

编译iLogtail镜像

制作镜像的命令是make docker。制作的过程是将iLogtail发行版的tar包安装到base镜像中,因此依赖本地的ilogtail-<VERSION>.tar.gz文件,已发行的版本可以从iLogtail发布记录下载,本地最新代码则可以通过make dist生成。

制作的镜像默认名称为aliyun/ilogtail,可以DOCKER_REPOSITORY环境变量覆盖,Tag则必须与iLogtail包的版本相同,可以通过环境变量VERSION指定,例如:

$ VERSION=1.1.1 make dist
$ VERSION=1.1.1 make docker
docker image list
REPOSITORY        TAG     IMAGE ID       CREATED         SIZE
aliyun/ilogtail   1.1.1   c7977eb7dcc1   2 minutes ago   764MB

开发环境

使用上述make命令编译虽然简单,但不适合开发环境使用,因为开发过程中需要不断进行编译调试,重复全量编译的速度太慢。由于iLogtail的C++核心对编译环境有特定要求,并且依赖了诸多第三方库(详见编译依赖),为了简化编译流程iLogtail提供了包含预编译依赖库的开开发镜像辅助编译。

开发镜像概览

开发镜像的地址在sls-registry.cn-beijing.cr.aliyuncs.com/sls-microservices/ilogtail-build-linux-amd64,可通过下面命令获取。

docker pull sls-registry.cn-beijing.cr.aliyuncs.com/sls-microservices/ilogtail-build-linux-amd64

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

$ gcc--versiongcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44)
$ go version
go version go1.16.15 linux/amd64
$ git--versiongit version 2.29.3

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

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

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

from sls-registry.cn-beijing.cr.aliyuncs.com/sls-microservices/ilogtail-build-linux-amd64
RUN yum -y install ...
RUN go install ...

使用VS Code构建开发环境

VS Code通过Remote Development插件可以实现远程开发、在镜像中开发,甚至远程+镜像中开发,在镜像中开发的功能为iLogtail创建一致的,可移植的开发环境创造了可能。

1. 安装插件

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

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

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

{
"image": "sls-registry.cn-beijing.cr.aliyuncs.com/sls-microservices/ilogtail-build-linux-amd64:latest",
"customizations": {
"vscode": {
"extensions": [
"golang.Go",
"ms-vscode.cpptools-extension-pack",
"DavidAnson.vscode-markdownlint",
"redhat.vscode-yaml"      ]
    }
  }
}

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

插件名

用途

golang.Go

Go开发必备插件

ms-vscode.cpptools-extension-pack

C++开发必备插件

DavidAnson.vscode-markdownlint

Markdown代码风格检查

redhat.vscode-yaml

YAML语言支持

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插件
make vendor       # 若需要更新插件依赖库make plugin_local # 每次更新插件代码后从这里开始

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

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

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

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

cmake -DCMAKE_BUILD_TYPE=Debug ..

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

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

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

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

5. 获取编译产出

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

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

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

cp -a ./core/build/ilogtail ./output

cp -a ./core/build/plugin/libPluginAdapter.so ./output

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

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

直接使用镜像编译

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

1. 启动容器

在代码库根目录执行

docker run --name ilogtail-build -d \
-v`pwd`:/src -w /src \
  sls-registry.cn-beijing.cr.aliyuncs.com/sls-microservices/ilogtail-build-linux-amd64:latest \
bash-c"sleep infinity"

2. 进入容器

docker exec -it ilogtail-build bash

3. 在容器中编译

与VS Code的“4. 在镜像中进行编译”操作步骤相同。

使用编译产出

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

1. 修改官方镜像entrypoint

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

  • docker:指定CMD
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,替换到容器里

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

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

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

cp /logtail_host/home/<user>/libPluginBase.so /usr/local/ilogtail

总结

至此,我们已经介绍了iLogtail的编译方法,并通过iLogtail的编译镜像 + VS Code搭建了一套统一的开发环境,在这个环境中我们可以实现增量编译提高开发效率。如果对目前的构建方式感到不满意,欢迎到iLogtail的GitHub论坛(https://github.com/alibaba/ilogtail/discussions)发帖提问,或者直接给我们提PR,让我们一起将iLogtail建设得更美好。

关于iLogtail

iLogtail作为阿里云SLS提供的可观测数据采集器,可以运行在服务器、容器、K8s、嵌入式等多种环境,支持采集数百种可观测数据(日志、监控、Trace、事件等),已经有千万级的安装量。目前,iLogtail已正式开源,欢迎使用及参与共建。

GitHub:https://github.com/alibaba/ilogtail

社区版文档:https://ilogtail.gitbook.io/ilogtail-docs/about/readme

企业版官网:https://help.aliyun.com/document_detail/65018.html

相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
相关文章
|
消息中间件 数据采集 JSON
iLogtail社区版使用入门 - iLogtail日志处理实战
本文将会详细介绍使用iLogtail社区版进行日志采集时,对于常见日志格式的处理实战。为了便于调测,以下样例默认将采集到的日志,经过处理后,输出到标准输出,开发者可以根据实际需求进行适当的调整。
3802 0
|
Java
filebeat占用文件句柄磁盘满
filebeat作为日志采集客户端,相比较于java编写的fluent,有着低功耗的特性。但在一些极端情况下,忽视filebeat的一些特性配置,可能会带来灾难。之前发过一篇关于filebeat内存占用的案例和分析,今天再说下filebeat占用文件句柄、耗费主机磁盘甚至导致磁盘满的案例。
9644 0
|
数据采集 人工智能 Cloud Native
LoongCollector:构建智能时代的数据采集新范式
本文聚焦 LoongSuite 生态核心组件 LoongCollector,深度解析 LoongCollector 在智算服务中的技术突破,涵盖多租户观测隔离、GPU 集群性能追踪及事件驱动型数据管道设计,通过零侵入采集、智能预处理与自适应扩缩容机制,构建面向云原生 AI 场景的全栈可观测性基础设施,重新定义高并发、强异构环境下的可观测性能力边界。
|
9月前
|
消息中间件 存储 JSON
日志采集 Agent 性能大比拼——LoongCollector 性能深度测评
为了展现 LoongCollector 的卓越性能,本文通过纵向(LoongCollector 与 iLogtail 产品升级对比)和横向(LoongCollector 与其他开源日志采集 Agent 对比)两方面对比,深度测评不同采集 Agent 在常见的日志采集场景下的性能。
886 35
|
安全 数据安全/隐私保护 Android开发
HarmonyOS 5.0 Next实战应用开发—‘我的家乡’【HarmonyOS Next华为公司完全自研的操作系统】
HarmonyOS NEXT是华为自研的鸿蒙操作系统的重要版本更新,标志着鸿蒙系统首次完全脱离Linux内核及安卓开放源代码项目(AOSP),仅支持鸿蒙内核和鸿蒙系统的应用。该版本引入了“和谐美学”设计理念,通过先进的物理渲染引擎还原真实世界的光影色彩,为用户带来沉浸式体验。应用图标设计融合国画理念,采用留白和实时模糊技术展现中式美学。 HarmonyOS NEXT强化了设备间的协同能力,支持无缝切换任务,如在手机、平板或电脑间继续阅读文章或编辑文件。系统注重数据安全和隐私保护,提供数据加密和隐私权限管理功能。此外,它利用分布式技术实现跨设备资源共
899 15
HarmonyOS 5.0 Next实战应用开发—‘我的家乡’【HarmonyOS Next华为公司完全自研的操作系统】
|
Kubernetes API Docker
跟着iLogtail学习容器运行时与K8s下日志采集方案
iLogtail 作为开源可观测数据采集器,对 Kubernetes 环境下日志采集有着非常好的支持,本文跟随 iLogtail 的脚步,了解容器运行时与 K8s 下日志数据采集原理。
1057 8
|
SQL 安全 关系型数据库
SQLynx 发布 3.0.0 版本
SQLynx 发布 3.0.0 版本
609 1
|
消息中间件 Kubernetes Kafka
日志采集/分析
日志采集/分析
434 7
|
消息中间件 RocketMQ
Centos7.6安装RocketMQ4.9.2并配置开机自启
Centos7.6安装RocketMQ4.9.2并配置开机自启
881 0
深入解析 JMeter TPS 测试:从理论到实践
本文档介绍了如何使用Apache JMeter进行TPS测试。TPS(Transactions Per Second)是衡量系统性能的关键指标,表示每秒处理的事务数。在JMeter中,创建测试计划包括配置线程组、HTTP请求、定时器和监听器。运行测试后,通过聚合报告分析吞吐量、平均响应时间和错误率来计算TPS。当TPS不足时,可优化服务器资源、应用程序代码、数据库查询或引入缓存来提升性能。掌握TPS测试有助于系统性能优化。