【Go】基于telegraf进行自定义插件开发(一)
基于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 simpleimport (_ "embed""github.com/influxdata/telegraf""github.com/influxdata/telegraf/plugins/inputs"
)//go:embed sample.conf
var sampleConfig stringtype 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.simplepackage allimport _ "github.com/influxdata/telegraf/plugins/inputs/simple" // register plugin
import _
会自动调用init
函数,并且只会调用一次,这个可以去看下go语言的几个特殊函数的讲解,同样的首行不省略,这个是build的参数,至此一个插件的编写和注册就完成了,只需要再进行打包即可。
结语
本文仅对telegraf的插件开发做了一个简单介绍,下次会基于自己的插件从开发到部署做一个记录
【Go】基于telegraf进行自定义插件开发(一)相关推荐
- eclipse编辑html5插件,【Eclipse插件开发】基于WTP开发自定义的JSP编辑器(二):基于WTP StructuredTextEditor创建自己的JSPEditor...
[角色之间的关系] 1.org.eclipse.ui.editors扩展和IEditorPart之间的关系 一个org.eclipse.ui.editors扩展会指定一个对应的IEditorPart实 ...
- cufflinks基于dataframe数据自定义绘图基于df.iplot功能
cufflinks基于dataframe数据自定义绘图基于df.iplot功能 # cufflinks绘制自定义图像 # 基于df.iplot参数控制: from chart_studio impor ...
- TF之LSTM:基于tensorflow框架自定义LSTM算法实现股票历史(1990~2015数据集,6112预测后100+单变量最高)行情回归预测
TF之LSTM:基于tensorflow框架自定义LSTM算法实现股票历史(1990~2015数据集,6112预测后100+单变量最高)行情回归预测 目录 输出结果 LSTM代码 输出结果 数据集 L ...
- php中引入shiro,基于shiro的自定义注解的扩展-图文详解
基于shiro的自定义注解的扩展 这里我们主要采取了shiro的自定义注解的方案.本篇文章主要解决以下的问题.如何通过逻辑进行页面与api接口的关联. shiro的自身注解的用法. 如何编写自定义注解 ...
- JAVA发布栅格图层_基于 WebGL实现自定义栅格图层踩坑实录
以下内容转载自totoro的文章<WebGL-Y轴翻转踩坑实录> 作者:totoro 链接:blog.totoroxiao.com/webgl-flipY- 来源:blog.totorox ...
- java 基于类路径搜索_一种基于ClassLoader的自定义类查找方法与流程
本发明涉及IT技术领域,特别是指一种基于ClassLoader的自定义类查找方法. 背景技术: 随着信息系统的复杂性日益增大,使用反射机制设计的系统越来越多.根据不同的业务需要通过反射去获得相应的处理 ...
- 下载基于LigerUI+JBPM5自定义表单+Node.js的J2EE大型金融项目《财务预算系统》
基于LigerUI+JBPM5自定义表单+Node.js的J2EE大型金融项目<财务预算系统>开发全程实录 地址:http://pan.baidu.com/s/1c3zLGZ2 密码:e7 ...
- 基于Cesium使用自定义着色器的资源总结
基于Cesium使用自定义着色器的资源总结 二维几何着色器 Cesium.js着色器的简单实现 B站:cesium着色器的介绍及使用 cesium添加自己的着色器(我没复现出来) 基于3DTile着色 ...
- python 文件格式转换_数据分析:基于Python的自定义文件格式转换系统
( 白宁超 2018年7月16日14:47:41 ) 导读:随着大数据的快速发展,自然语言处理.数据挖掘.机器学习技术应用愈加广泛.针对大数据的预处理工作是一项庞杂.棘手的工作.首先数据采集和存储,尤 ...
最新文章
- Painting A Board --POJ 1691
- CVPR单目深度估计竞赛结果出炉,腾讯光影研究室优势夺冠,成果落地应用
- php数组中插入数值,php中如何在数组指定位置插入数据单元
- MSHFlexGrid控件
- vSphere 6.7的新增功能?我应该升级吗?
- Visual Studio Team Architect团队的敏捷开发 (第三部分)
- 从小白到区块链工程师:第一阶段:Go语言的HelloWorld初始(2)
- 登录,注册,个人信息,退出的隐藏和出现
- 几何画板椭圆九种画法_几何画板怎么画椭圆 几何画板椭圆绘制教程
- 微分方程的数值解法与程序实现 pdf_数值计算方法·第三部分
- Linux常用编程工具
- CAS (5) —— Nginx代理模式下浏览器访问CAS服务器配置详解
- java-php-python-ssm医院诊疗信息管理计算机毕业设计
- LSD_SLAM编译之一气呵成法
- 联想thinkpad待机怎么唤醒_笔记本睡眠怎么唤醒【步骤介绍】
- 用于Brain Runners电子游戏的改进SmallNet脑电解码分类
- 终于当选微软2012年4月最有价值专家(MVP)了,不容易啊。都来恭喜一哈
- python的爱心曲线公式_六行python代码的爱心曲线详解
- 10月英语,美好的开始
- 以太坊联盟链-多节点私链搭建手册
热门文章
- hive从入门到实战No.4
- 1905. 统计子岛屿
- 【VBS】vbs鼠标方法——模拟鼠标按键
- 用蒲公英进行内测更新
- qt撤销与回退_Qt 的撤销回退事件 - osc_1i3ltp99的个人空间 - OSCHINA - 中文开源技术交流社区...
- java匿名内部类,什么是匿名内部类,如何定义匿名内部类,如何使用匿名内部类?
- 玩玩小程序:使用 WebApi 交互打造原生的微信小程序 - 图灵小书架
- linux编译文件 no such,Linux中编译或安装程序时提示No such file or directory
- ab测试工具 linux,超实用压力测试工具-ab工具
- 山区灭火机器人_帅气!池州市首台消防灭火机器人正式投入基层执勤