【Go】基于telegraf进行自定义插件开发(一)

2023-05-16

基于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的插件开发做了一个简单介绍,下次会基于自己的插件从开发到部署做一个记录

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Go】基于telegraf进行自定义插件开发(一) 的相关文章

  • 《程序设计基础课程设计》实验报告

    程序设计基础课程设计 实验报告 班 级 xff1a 学 号 xff1a 姓 名 xff1a 完成题目 xff1a 1 2 3 4 5 6 概述 此次六道题目里面第四题是参考某博主的文章后实现的 xff0c 有一些地方仍然不是特别理解 xff
  • C语言实现关系的闭包运算

    问题描述 xff1a 利用矩阵求解有限集上给定关系的自反和对称闭包 输入格式 xff1a 首先输入关系矩阵R的维数 xff0c 回车之后输入矩阵每个元素 xff0c 以空格或回车分开 只能输入0或1 输出格式 xff1a 输出自反闭包关系矩
  • 简单易懂的C语言课程设计图书管理系统

    最近几天一直在做课程设计的作业 xff0c 图书管理系统是其中的第六题 xff0c 和同学交流的时候发现好多人都用了链表去写 xff0c 但是我感觉没必要 xff0c 所以使用的代码比较基础 xff0c 适合初学者借鉴 先看一下题目 xff
  • C语言程序设计——前两道题(判断有效三角形和高精度计算的加减法)

    第1题 1 原题 xff1a 假设平面上有1 N x y 个坐标点 xff0c 编程判断这N x y 个点能组成多少个有效三角形 问题分析 xff1a 本题为一道基本编程题 xff0c 要点就是判断三个点能构成三角形的条件 解决方案 xff
  • C语言程序设计之RLE压缩解压算法

    先介绍一下RLE压缩算法 xff1a 游程编码 xff08 Run Length Encoding RLE xff09 又称行程长度编码或者变动长度编码法 xff0c 在控制理论中对于二值图像而言是一种编码方法 xff0c 对连续的黑 xf
  • 浅析洛谷P4924(一道普及/提高-的题目)的解决方法

    题目描述 xff1a Scarlet最近学会了一个数组魔法 xff0c 她会在n n二维数组上将一个奇数阶方阵按照顺时针或者逆时针旋转90 首先 xff0c Scarlet会把1到n 2的正整数按照从左往右 xff0c 从上至下的顺序填入初
  • 判断图的连通性

    上机系统的判分功能目前还没开放 xff0c 所以以下所给代码仅供参考 xff0c 并不能保证完全正确 xff08 自己分别测试了强连通 xff0c 单向连通 xff0c 弱连通 xff0c 不连通的一个样例 xff0c 都过了 xff09
  • BMP格式详解

    BMP xff08 全称Bitmap xff09 是Windows操作系统中的标准图像文件格式 xff0c 可以分成两类 xff1a 设备相关位图 xff08 DDB xff09 和设备无关位图 xff08 DIB xff09 xff0c
  • 标准数独的求解

    上机题目中有一道题目的要求是通过编程实现数独的求解 xff0c 然后想起了初三去后来所在的高中面试提前录取的时候里面的压轴题便是数独 xff0c 当时做了好长时间也没搞出来 xff0c 我还记得监考老师当时和我说 xff1a 做不出来就别勉
  • 利用定义求解传递闭包的关系矩阵

    题目描述 给定有限集合上二元关系的关系矩阵 xff0c 利用传递闭包的定义式 xff08 不是warshall算法 xff09 求其传递闭包的关系矩阵 源代码 span class token macro property span cla
  • 【Android】解决Expecting member declaration

    问题截图 刚刚安装的android studio安装完成就出现异常错误 原因 新建project的时候 xff0c language项选错了 xff0c 应选java 解决错误的办法 新建一个Project的时候 xff0c Languag
  • 矩阵乘法的实现(一般形式及单个矩阵的n次幂)

    目录 一般矩阵乘法实现矩阵的n次幂的实现 一般矩阵乘法实现 题目描述1 给定m k的布尔矩阵A xff0c 和k n的布尔矩阵B xff0c 求布尔矩阵的乘积AB 源代码1 span class token macro property s
  • 根据给出的关系矩阵,判断该关系所具有的特性

    目录 自反性与反自反性的判断对称性与反对称性的判断传递性的判断 自反性与反自反性的判断 关系R是自反的 xff0c 当且仅当其关系矩阵的主对角线上元素都为1 xff1b 关系R是反自反的 xff0c 当且仅当其关系矩阵的主对角线上元素都为0
  • 输出所有满足条件的关系

    目录 for循环解决简单问题调用库函数解决全排列问题 for循环解决简单问题 题目描述 源代码 span class token macro property span class token directive keyword inclu
  • 按字典序输出给定序列

    上机题目里面有不少挨着的相似的题 xff0c 下面所给的这两道偏简单 xff0c 就介绍一下用python和c实现的代码 题目描述 python实现的代码用到了sorted函数 xff0c 该函数在python3里面有三个参数 xff0c

随机推荐