前言
以长期使用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
![在这里插入图片描述](https://img-blog.csdnimg.cn/a483c26444fd4c6682b3a128d105d819.png)
现在就切换到dev分支了,然后进行代码的编写就可以了
目录结构
进行插件开发主要操作的目录只有plugins这个目录:
![在这里插入图片描述](https://img-blog.csdnimg.cn/e938dd85df9849399b5bd260a07ce028.png)
我们要编写的是采集插件,所以进入inputs目录下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/84ce6f08fee749929aa883c77e563b58.png)
可以看到这里已经有很多插件了,这里每个目录就是一个插件,需要注意的是all
这个目录,这个目录下有很多go文件,是用于注册插件的:
![在这里插入图片描述](https://img-blog.csdnimg.cn/6e8a92dfb7864e22887e59d3cc300a99.png)
插件结构
接下来是说明插件的编写结构,首先看一下插件开发的要求:
![在这里插入图片描述](https://img-blog.csdnimg.cn/2d2f3f85924b4da2b8008ceafd91f406.png)
总结下来是这几点:
- 插件必须实现
telegraf.Input
接口; - 插件必须在
init
函数中调用inputs.Add
方法; - 一个已实现的插件必须在
plugins/inputs/all
下进行注册,一般是同名的go文件中引用; - 每个插件需要定义一个符合
toml
格式的sample.conf
文件以及一个README.md
文档;
示例代码
示例代码我们可以看一眼官方的示例simple插件:
package simple
import (
_ "embed"
"github.com/influxdata/telegraf"
"github.com/influxdata/telegraf/plugins/inputs"
)
var sampleConfig string
type Simple struct {
Ok bool `toml:"ok"`
Log telegraf.Logger `toml:"-"`
}
func (*Simple) SampleConfig() string {
return sampleConfig
}
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
等内容也要保留:
![在这里插入图片描述](https://img-blog.csdnimg.cn/d473daa1a6b345579f7d8a44ad406984.png)
这里的结构体Simple其实就是定义配置文件的结构体,假设我们的sample.conf配置文件是这样的:
[[inputs.simple]]
key1 = 1
key2 = true
key3 = "test"
则我们可以定义结构体为:
type Simple struct {
key1 int `toml:"key1"`
key2 bool `toml:"key2"`
key3 string `toml:"key3"`
}
只要按照这个规范进行编写,配置文件的读取,解析这些工作telegraf就能帮你都做好了,然后就是按照插件的编写规范,实现Input
接口:
![在这里插入图片描述](https://img-blog.csdnimg.cn/475c6e63f6704c53bbf73dd99bf3c528.png)
这里其实就是实现Gather方法就可以了,最后就是init函数中要调用Add方法,也就是业务逻辑上的注册
注册插件
业务逻辑完成后,telegraf还是不能识别插件,因为并没有任何地方调用了插件包,这个时候就要到我们上面说到的all
目录下,新建一个go文件,这里是simple.go,写入以下代码:
package all
import _ "github.com/influxdata/telegraf/plugins/inputs/simple"
import _
会自动调用init
函数,并且只会调用一次,这个可以去看下go语言的几个特殊函数的讲解,同样的首行不省略,这个是build的参数,至此一个插件的编写和注册就完成了,只需要再进行打包即可。
结语
本文仅对telegraf的插件开发做了一个简单介绍,下次会基于自己的插件从开发到部署做一个记录
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)