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

35 篇文章 0 订阅
13 篇文章 1 订阅

前言

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Meepoljd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值