自带 Telegraf
作者:David Flanagan / 用例, 开发者, 产品
2019 年 6 月 6 日
导航至
我很荣幸地告诉人们我在一家真正的开源公司工作。这是什么意思呢?
InfluxData 代码的 90% 是开源的,另外 10% 是我们数据库 InfluxDB 的企业版附加功能。这 10% 为公司及其开源承诺提供动力。
我们对开源的承诺不止于此。我们还积极鼓励、维护和支持将我们的产品与其他产品(无论是 OSS 还是其他)集成的贡献;甚至包括一些人可能认为是我们的“竞争对手”的产品。唉,我们不这么认为。我们欢迎并鼓励围绕时间序列、监控和警报建立开放和支持性的生态系统。
当然,这是有代价的。虽然 Telegraf 支持读取和写入 200 多个软件组件;例如 DataDog、Elasticsearch、Kafka、MongoDB、OpenTSDB、Prometheus、Wavefront 等等……但这需要付出代价……字节的代价。
<figcaption> 插件无处不在</figcaption>
目前,Telegraf 二进制文件的大小为 60MiB
(amd64 二进制文件)、244MiB
(Docker 镜像) 和 80MiB
(Docker 镜像 Alpine)。
虽然不算巨大,但根据您对我们插件的使用情况,这可能对您来说太多了。随着越来越多的社区采用 Kubernetes,拥抱 sidecar 等模式,利用多个 Telegraf 实例的大小可能会成为问题。
介绍自带 Telegraf (BYOT)
BYOT 是一个基于 Docker 的框架,用于构建包含自定义精简 Telegraf 二进制文件的 Docker 镜像;仅包含您需要的插件。这不需要任何特殊配置。您只需像往常一样提供您的 Telegraf 配置即可。
这将导致图像尺寸大幅缩小。让我们看一下比较。下面是普通 Telegraf 镜像和 Alpine 变体的镜像尺寸。旁边是我构建的自定义 Kubernetes 镜像,仅包含以下插件
- 输入
- Prometheus
- 输出
- InfluxDB
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
telegraf 1.10 c14f9454c5aa 13 days ago 244MB
telegraf 1.10-alpine f6d6ea3f4972 4 days ago 80MB
rawkode/telegraf kubernetes 3437fe686f23 4 days ago 25.4MB
入门
我推荐的方法是为您的基础设施中的每个 Telegraf 配置提供一个 Git 仓库。假设我们要构建一个包含以下插件的 Telegraf
- 输入
- Docker
- 输出
- InfluxDB 2
配置 Telegraf
首先,我们将创建我们的 Telegraf 配置。构建过程期望在您的构建上下文的根目录中有一个 telegraf
目录。此目录与任何其他系统上的 /etc/telegraf
目录没有什么不同。您可以使用单个文件 telegraf.conf
,或基于目录的方法 telegraf.d
。为简单起见,此示例使用单个文件。
[agent]
interval = "5s"
omit_hostname = true
[[inputs.docker]]
endpoint = "unix:///var/run/docker.sock"
[[outputs.influxdb_v2]]
urls = ["http://influxdb2:9999"]
token = "$INFLUXDB_2_TOKEN"
organization = "InfluxData"
bucket = "default"
接下来,您需要在您的仓库中添加一个 Dockerfile
FROM rawkode/telegraf:byo AS build
FROM alpine:3.7 AS telegraf
COPY --from=build /etc/telegraf /etc/telegraf
COPY --from=build /go/src/github.com/influxdata/telegraf/telegraf /bin/telegraf
ENTRYPOINT [ "/bin/telegraf" ]
构建
就是这样!让您的 CI 系统在每次提交时自动构建此镜像并将其推送到您的注册表,您就可以开始了。您可以使用 build-arg
指定要构建的 Telegraf 版本。
docker image build --build-arg VERSION=1.10 -t my_telegraf
只需几分钟即可获得一个仅包含您需要的插件的自定义 Telegraf!
它是如何工作的?
BYOT 利用了 Dockerfile
中常用的 ONBUILD
指令。这允许我们定义指令,这些指令会延迟到后续调用(例如您的 docker image build
命令)时执行。欢迎随意查阅我的代码,或查看我的示例仓库,以更好地理解它。
还有其他改进吗?
在我的初始测试(不广泛)中,我注意到 Telegraf 的内存使用量约为启用仅 4 个插件(system、cpu、mem、disk)的普通 Telegraf 二进制文件的 1/3(6MiB
对 12MiB
)。这可能是偶然情况,我将在适当的时候发布更多关于此的结果。
下一步是什么
目前,BYOT 支持根据您的配置自定义构建输入和输出插件。我计划在不久的将来也添加对聚合器和处理器的支持,这将使我们的镜像尺寸进一步缩小。
感谢您的收听。我很想知道您的想法,所以请在评论区或通过 Twitter 与我联系。