基于telegraf进行插件的自定义(一)
- 前言
- 正文
- 环境准备
- 目录结构
- 插件结构
- 示例代码
- 注册插件
- 结语
前言
以长期使用Prometheus和各种exporter的经验来说,大量的exporter会占用物理机的端口资源,虽说这不是特别严重的问题,但是从安全和优雅程度来说,这不太好,经过多方的考察,感觉使用telegraf的插件进行指标采集是当前解决这个问题的一个比较好的办法,不过之前没进行过telegraf插件的开发,只能参考以下官方的文档整一下,本篇先记录一下telegraf插件开发的一些知识要点;
正文
因为是基于telegraf的源码进行二次开发并构建,所以环境准备这部分也记录一下,go语言安装这些自行准备。
环境准备
从github拉取源码,如果网络上没条件(原因你懂得)可以在gitee上找到别人同步的仓库进行拉取:gitee上的telegraf仓库
本着用新不用旧的原则,拉取1.25.0最新版的源码:
git clone -b v1.25.0 https://github.com/influxdata/telegraf.git
这里拉取源码后,基于1.25.0这个tag新建一个分支dev,新的代码就往dev推:
git branch dev v1.25.0
git checkout dev
现在就切换到dev分支了,然后进行代码的编写就可以了
目录结构
进行插件开发主要操作的目录只有plugins这个目录:
我们要编写的是采集插件,所以进入inputs目录下:
可以看到这里已经有很多插件了,这里每个目录就是一个插件,需要注意的是all
这个目录,这个目录下有很多go文件,是用于注册插件的:
插件结构
接下来是说明插件的编写结构,首先看一下插件开发的要求:
总结下来是这几点:
- 插件必须实现
telegraf.Input
接口; - 插件必须在
init
函数中调用inputs.Add
方法; - 一个已实现的插件必须在
plugins/inputs/all
下进行注册,一般是同名的go文件中引用; - 每个插件需要定义一个符合
toml
格式的sample.conf
文件以及一个README.md
文档;
示例代码
示例代码我们可以看一眼官方的示例simple插件:
//go:generate ../../../tools/readme_config_includer/generator
package simple
import (
_ "embed"
"github.com/influxdata/telegraf"
"github.com/influxdata/telegraf/plugins/inputs"
)
//go:embed sample.conf
var sampleConfig string
type Simple struct {
Ok bool `toml:"ok"`
Log telegraf.Logger `toml:"-"`
}
func (*Simple) SampleConfig() string {
return sampleConfig
}
// Init is for setup, and validating config.
func (s *Simple) Init() error {
return nil
}
func (s *Simple) Gather(acc telegraf.Accumulator) error {
if s.Ok {
acc.AddFields("state", map[string]interface{}{"value": "pretty good"}, nil)
} else {
acc.AddFields("state", map[string]interface{}{"value": "not great"}, nil)
}
return nil
}
func init() {
inputs.Add("simple", func() telegraf.Input { return &Simple{} })
}
首行备注不要去除,go:generate
是会去执行之后的命令,具体用法可以百度,你可以理解为是一个初始化的行为;
之后的go:embed sample.conf
等内容也要保留:
这里的结构体Simple其实就是定义配置文件的结构体,假设我们的sample.conf配置文件是这样的:
# Read metrics of hdfs
[[inputs.simple]]
## 是否为http模式,默认为http
key1 = 1
key2 = true
key3 = "test"
则我们可以定义结构体为:
type Simple struct {
key1 int `toml:"key1"`
key2 bool `toml:"key2"`
key3 string `toml:"key3"`
}
只要按照这个规范进行编写,配置文件的读取,解析这些工作telegraf就能帮你都做好了,然后就是按照插件的编写规范,实现Input
接口:
这里其实就是实现Gather方法就可以了,最后就是init函数中要调用Add方法,也就是业务逻辑上的注册
注册插件
业务逻辑完成后,telegraf还是不能识别插件,因为并没有任何地方调用了插件包,这个时候就要到我们上面说到的all
目录下,新建一个go文件,这里是simple.go,写入以下代码:
//go:build !custom || inputs || inputs.simple
package all
import _ "github.com/influxdata/telegraf/plugins/inputs/simple" // register plugin
import _
会自动调用init
函数,并且只会调用一次,这个可以去看下go语言的几个特殊函数的讲解,同样的首行不省略,这个是build的参数,至此一个插件的编写和注册就完成了,只需要再进行打包即可。
结语
本文仅对telegraf的插件开发做了一个简单介绍,下次会基于自己的插件从开发到部署做一个记录