基于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进行自定义插件开发(一)相关推荐

  1. eclipse编辑html5插件,【Eclipse插件开发】基于WTP开发自定义的JSP编辑器(二):基于WTP StructuredTextEditor创建自己的JSPEditor...

    [角色之间的关系] 1.org.eclipse.ui.editors扩展和IEditorPart之间的关系 一个org.eclipse.ui.editors扩展会指定一个对应的IEditorPart实 ...

  2. cufflinks基于dataframe数据自定义绘图基于df.iplot功能

    cufflinks基于dataframe数据自定义绘图基于df.iplot功能 # cufflinks绘制自定义图像 # 基于df.iplot参数控制: from chart_studio impor ...

  3. TF之LSTM:基于tensorflow框架自定义LSTM算法实现股票历史(1990~2015数据集,6112预测后100+单变量最高)行情回归预测

    TF之LSTM:基于tensorflow框架自定义LSTM算法实现股票历史(1990~2015数据集,6112预测后100+单变量最高)行情回归预测 目录 输出结果 LSTM代码 输出结果 数据集 L ...

  4. php中引入shiro,基于shiro的自定义注解的扩展-图文详解

    基于shiro的自定义注解的扩展 这里我们主要采取了shiro的自定义注解的方案.本篇文章主要解决以下的问题.如何通过逻辑进行页面与api接口的关联. shiro的自身注解的用法. 如何编写自定义注解 ...

  5. JAVA发布栅格图层_基于 WebGL实现自定义栅格图层踩坑实录

    以下内容转载自totoro的文章<WebGL-Y轴翻转踩坑实录> 作者:totoro 链接:blog.totoroxiao.com/webgl-flipY- 来源:blog.totorox ...

  6. java 基于类路径搜索_一种基于ClassLoader的自定义类查找方法与流程

    本发明涉及IT技术领域,特别是指一种基于ClassLoader的自定义类查找方法. 背景技术: 随着信息系统的复杂性日益增大,使用反射机制设计的系统越来越多.根据不同的业务需要通过反射去获得相应的处理 ...

  7. 下载基于LigerUI+JBPM5自定义表单+Node.js的J2EE大型金融项目《财务预算系统》

    基于LigerUI+JBPM5自定义表单+Node.js的J2EE大型金融项目<财务预算系统>开发全程实录 地址:http://pan.baidu.com/s/1c3zLGZ2 密码:e7 ...

  8. 基于Cesium使用自定义着色器的资源总结

    基于Cesium使用自定义着色器的资源总结 二维几何着色器 Cesium.js着色器的简单实现 B站:cesium着色器的介绍及使用 cesium添加自己的着色器(我没复现出来) 基于3DTile着色 ...

  9. python 文件格式转换_数据分析:基于Python的自定义文件格式转换系统

    ( 白宁超 2018年7月16日14:47:41 ) 导读:随着大数据的快速发展,自然语言处理.数据挖掘.机器学习技术应用愈加广泛.针对大数据的预处理工作是一项庞杂.棘手的工作.首先数据采集和存储,尤 ...

最新文章

  1. Painting A Board --POJ 1691
  2. CVPR单目深度估计竞赛结果出炉,腾讯光影研究室优势夺冠,成果落地应用
  3. php数组中插入数值,php中如何在数组指定位置插入数据单元
  4. MSHFlexGrid控件
  5. vSphere 6.7的新增功能?我应该升级吗?
  6. Visual Studio Team Architect团队的敏捷开发 (第三部分)
  7. 从小白到区块链工程师:第一阶段:Go语言的HelloWorld初始(2)
  8. 登录,注册,个人信息,退出的隐藏和出现
  9. 几何画板椭圆九种画法_几何画板怎么画椭圆 几何画板椭圆绘制教程
  10. 微分方程的数值解法与程序实现 pdf_数值计算方法·第三部分
  11. Linux常用编程工具
  12. CAS (5) —— Nginx代理模式下浏览器访问CAS服务器配置详解
  13. java-php-python-ssm医院诊疗信息管理计算机毕业设计
  14. LSD_SLAM编译之一气呵成法
  15. 联想thinkpad待机怎么唤醒_笔记本睡眠怎么唤醒【步骤介绍】
  16. 用于Brain Runners电子游戏的改进SmallNet脑电解码分类
  17. 终于当选微软2012年4月最有价值专家(MVP)了,不容易啊。都来恭喜一哈
  18. python的爱心曲线公式_六行python代码的爱心曲线详解
  19. 10月英语,美好的开始
  20. 以太坊联盟链-多节点私链搭建手册

热门文章

  1. hive从入门到实战No.4
  2. 1905. 统计子岛屿
  3. 【VBS】vbs鼠标方法——模拟鼠标按键
  4. 用蒲公英进行内测更新
  5. qt撤销与回退_Qt 的撤销回退事件 - osc_1i3ltp99的个人空间 - OSCHINA - 中文开源技术交流社区...
  6. java匿名内部类,什么是匿名内部类,如何定义匿名内部类,如何使用匿名内部类?
  7. 玩玩小程序:使用 WebApi 交互打造原生的微信小程序 - 图灵小书架
  8. linux编译文件 no such,Linux中编译或安装程序时提示No such file or directory
  9. ab测试工具 linux,超实用压力测试工具-ab工具
  10. 山区灭火机器人_帅气!池州市首台消防灭火机器人正式投入基层执勤