00:00
那么现在呢,正式开始编写我们这个插件的逻辑部分啊,首先呢,我们希望这个插件呢。可以实现这些基本需求,我们去在一个TST里面啊。给大家写一下。首先呢,我希望有一个配置项叫size。然后这个size呢,可以去指定,比如说我每隔三秒,但是这三秒这一次呢啊,我一批我一批次可以生成几条数据啊,如果我我这个写一个size等于五呢,那就是每隔三秒钟对吧?在我配置文件里面写interval等于三秒,那么每隔三秒钟呢,我就生成五条数据啊,那么这里给多少呢?我都可以去啊,相当于一个循环啊,直接是发送多条数据。呃,另外呢,就是我希望有一个上限和下限,呃,比如说我希望呢,在这个配置文件里面呢,你有一个啊,进行一个配置块的功能啊,这不是我的整个整个配置文件的一个,比如inputs吧。
01:02
然后这是艾特硅谷。Rundown,那么我希望呢,啊,在我这个配置块底下能够有一个配置的子块,然后这个子块里面呢,你能够配置,哎,这个要生成的随机数的上下边界,我管它叫min和max。呃,比如说me,我可以配置十,那么max呢,我配20,那么我的这个插件呢,就会生成十到20之间的随机整数啊,但是这里呢,你要注意,就是我的配置文件里面呢,我还希望做一层校验,也就是如果说你的这个M呢啊,给的是25,那么最小值比最大值还大呢,我就直接报异常退出啊,我还希望实现这个这样的功能。啊,那么接着呢,我们就冲着这个目标啊来去,我们的这个插件的逻辑里面呢,一步步的把它实现。好,那么接下来呢,我们去编写一下这个代码。呃,首先呢,这个simple com呢,是我们的模板配置啊,我们可以先把这个模板配置呢给完善起来啊,待会再解析,待待会再讲怎么样去解析这个配置的问题。
02:11
那么按照这个telegraph里面的规范呢,我外面这一层叫input,点艾硅谷叫run down,那么底下的这个子配置呢,必须得是一个单的这个中括号来开头。然后他一样还是需要去写一下我们这个配置的全名。点艾特硅谷。弯道。然后在这里呢,需要再点一下,点一下表示一个,诶,我的这个艾特硅谷run down的子块,然后在这里呢,我们再去给一个就是模板M等于十,然后max等于20,那么这是我想实现的一个效果,也是我们那么一个模板配置,呃,那么接下来呢,我们就需要让这个代码里面的东西和这个配置之间呢,啊,保持一个映射关系啊怎么办呢?我们可以看一下。
03:05
呃,首先呢,我们之前说,我们之前说,呃,这个里面的structure,呃,有一个叫做simple type simple simple这里其实是一个type呢,其实是一个类型,因为构语言呢,它不是一个面向对象的,呃,这个编程语言啊,那么这个结构体呢,其实里面可以放一些啊,你可以理解是那种像我们写Java的时候class,然后它的属性的一些东西,呃,那么这个时候呢,我们之前说啊,你这里写写一个size,然后再写一个int啊,你可以映射到最外面这一层的size等于五,那么这个子配置块的东西怎么办呢?啊,其实你可以这么写,就是你再弄一个类型出来,我们这里呢,这次要大写,因为这个小写的润呢,它是构语言里面的一个关键字,我们写大写的R。而且呢,而且注意啊,如果在勾语言里面,你这个东西想被外界访问到啊,那么你的首字母必须大写,它有点像这个Java里面的public,然后type range之后呢,再写一个结构体。
04:08
STRUCT。然后在这里面我们去指定一个幂,然后它也是整数类型的。To。那么我们现在在干什么呢?然后后面这个地方呢,我们先不继续写代码,我们在这里面写一个simple的成员,名字叫range。同样,Int。拖。对应的是什么呢?它对应的得是这个子块的名字,也就它要对应这个。要对应这个认。要对应到它,那么我们在这里面给定这个字符串叫R。这么一来呢,啊就是啊等等这个类型也要变一下啊,认好了。
05:02
那么这样一来呢,就是说我的这个simple的这个啊结构体里面,呃,带了一个另外一个润这个结构体类型,那么这个就相当于我们这个跟我们这个配置里面的嵌套关系是保持一致的,外面这一层对应着里面的这个simple结构体,然后里面这一层range呢,对应着外面的这个润结构体,然后同样呢,是对这个里面的。这个子子的配置去写一个to的映射,那么M的话对应这个配置文件里面的M这个字段。然后如果是max的话呢,也一样。是对应max的字段。好,那么这样的话呢,如果没问题的话,就是我们的这个呃,配置呢,已经已经能够被正常的解析了,那么接下来呢,我们给大家讲一下这几个比较关键的函数。
06:04
其实整个啊,现在大家可以看到啊,就是我们完成完成了这个呃配置的这个映射之后呢,啊,真正涉及到我们代码逻辑的部分就这两块,一个是初始化阶段,这个阶段呢,你可以看到这个函数呢,它是绑定在我们的simple泡类型上的啊,然后呃,也就是说通过这种方式我们可以得知我们的调用者他的一个呃属性里面的一些值,另外呢,就是它会返回一个error类型啊,它会返回一个error类型,那么你可以在这里面呢,就直接去。校验一些我们配置里面的值,它合不合规,不合规的话呢,你就返回一个异常啊,如果合规的话呢,你可以直接返回一个空啊,就是nail返回一个空值,这样的话呢,就是外面不会报错,如果呢,你返回的是一个真正的异常,那么这个时候呢,就telegraph整个程序呢会报错,然后。直接退出,不会再进行执行,Gather呢,这个是我们数据生成的,就是发送数据的一个一个函数,等到后面这个写这个啊,生成的时候会给大家仔细的讲解,那么这里呢,我们首先去测一下,去写一个啊逻辑校验的啊,去写一个配置校验的这个规则进来,好,那么呢,我们直接。
07:21
使用这个if语句。我们说S,然后访问它的下面的一个子配置R里面的这个最小值M。啊,他应该比我们的。S对吧,它不能比我们的S这个它不能比我的max还要大是吧,直接润,然后点max。然后呢,如果是这种情况的话,就直接报错return。艾若斯。第二。New啊,我们直接去报错,然后给他一个报错的消息,说最大值呢,应该比最小值要大。
08:08
那M好,呃,那么这样的话呢,相当于我们完成了一个呃规则的校验,现在呢,如果是最小值,如果是mean,它比max要大了啊,那么我们的这个插件在初始化的时候呢,就会直接抛出一个异常。待会儿呢,我们现在呢,一口气写完这个数据生成的逻辑,然后后面这些东西呢,我们一块儿编译验证,那么接下来呢,就是要写一个我们数据生成的逻辑,那咱就直接开写。那在这里面呢,我们写一个放循环,然后I呢,就从零开始吧,然后它小于S的size啊,也就是说我这个S给几,它有循环几次。这里呢,我们可以看到啊,它这个函数里面呢,会传来一个累加器叫ACC,那么ACC呢,你可以调用它的a file这个方法,那么这个方法呢,其实就是发送我们的呃,In Fla DB格式的数据。
09:06
第一个名字measurement,这个叫measurement,它第一个参数叫measurement,它其实就是我们这个指标的名称,这个呢,你就直接写死就好了,At run,硅谷,然后rundown。然后后面呢,你还可以去传一个什么呢,传递一个叫呃,Files,也就是说我们的字段的值,那么这个地方呢,因为我们是要生成随机数,我们可以直接去啊,弄一个随机数的。那给大家解释一下map string和interface这个地方啊,Interface。画括号其实是一个呃,我们叫在这个构源里面叫空接口,那么空接口呢,相当于Java的这个呃,你要用面向对象来理解它的话,你可以把它理解为一个object,它其实呃在勾语言里面呢,就是相当于所有的呃类型呢,它都实现了空接口啊,都都实现了空接口,所以说啊,这个实际上是一个要求你传递一个键啊,必须是string,然后呃value可以是任何数据类型的map。
10:11
啊,于是呢,在这个地方呢,我们可以通过这个语法来对它进行初始化,我们让这个键的名字呢,叫name number的意思啊,然后完了之后啊,接下来呢,就直接给他一个呃,随机数,我们使用啊run这个库点底下的啊int n。用这个方法,然后呢,啊,这个方法呢,你就他可以指定这个生成随机数的上限。在这里我们需要把这个包引一下。引这个mass底下的run档啊,然后呢,这个地方呢,我们就可以让这个。呃,比如说我们现在啊,现在这个max呢,它是20到十之间,那么我就就必须让它生成先生,先生成零到啊20减十,也就是这个范围呢,其实是十,那么先让它生成这个范围为十的随机数,然后呢,再给它加一个最小值的偏移量,所以说我这里是这么干。
11:10
S的range呢?它的最小值。加上rundown的特N,然后这里面呢,使用。这个最大值。减去最小值。减去最小值,哎,这样之后呢,我们还需要去传递一个什么呢。这里面还需要一个参数,就是我们的tags,我们的标签集,那么标签集呢,这里在写的话,代码有点长了,我们就直接给他一个空值,相当于呢,我们这个数据扔出去,发出去的时候呢,不需要任何的这个标签。那这个地方的语法有点问题,是因为。我这个逗号呢,应该换成冒号。
12:03
好了,那么这样的话呢,我们的这个代码呢,就没问题了。那么接下来呢,我们就可以尝试的去,呃编译一下跑牙这个代码,呃还有一个地方就是你可以看到这个函数呢,它其实还会返回一个error类型的这个数据啊,那么它如果说你这个生成数据的时候呢,啊,有些时候呢,可能会产生你比如说这个我的你的这个插件是连接什数据库的是吧,那么数据库这时候失联了,连接断开了,那你这时候可以人为的返回一个error出来啊,如果没有的话,像我们这种很简单的逻辑,那你直接返回一个控制就行了,一般来说是不会报什么错的。好,那么接下来呢,就是在我们的这个。终端里面输入make or来编译我们的插件。好,那么编译完之后呢,我们去在这个目录底下呢,写一个配置文件,那么我这里呢,已经提前写好了啊给大家解释一下,就是agent呢,我设了一个啊输入插件的每三秒钟产生一次数据,然后flash特呢,就是每五秒钟的输出一次数据。
13:09
这里呢,只有一个输入组件,就是我们的艾特硅谷rundown,然后呢,我希望每一次只产生一条数据啊,不过呢,在这个位置我想测一下我们的这个啊配置校验是否有效,所以说呢,我把这个M啊设成50,让它比max要大,是呃,所以说这个地方呢,它应该呃运行的时候会给我报一个错,然后呢,在输出的时候,我们还是把它输出到标准输出,打印到控制台上保存退出,然后呢,因为我们刚才编译完的泰利graph。来执行我们刚才的这个配置文件。必须比这个最小值要大的这个异常提示,他说的是我们的配置文件第五行的配置呢,出现了问题,我们给的这些这个呃,字段就是size me和max啊,他们不会被用到,那么是什么情况呢?呃,其实这个就必须要提醒一下大家,我们在解析在映射这个配置的时候呢?啊,如果说是这个配置项要交给我们的框架去完成解析,我们之前说过啊,你希望这里面的一个成员能够被外部访问,那么在go语言里面,它的首字母呢,必须大写,也就是说这里面的me max,还有size你都必须大写,它才能够被访问到,它才能够被配置文件的这个内容解析映射上来啊,那么这里的你都需要做一下更改,然后重新进行编译。
14:37
还是马克斯,还有萨斯。好,那么现在呢,我们都把这个地方给它改掉。再一个需要注意的地方就是之前呢,这个润这这里没有加星啊,你现在把这个星加上啊,这个意思呢,也就是指针,于是呢,我们这个structure里面的simple里面的这个,它是通过指针引用我们这些外面的这个润质的啊,不要直接写润质好。
15:09
好的,那么手动的把我们这个目录底下的啊telegraph给删一下啊,重新进行编译。好,那么重新编译完之后呢,我们再重新这个跑一下刚才的啊配置文件,诶现在可以看到啊,就是我们的配置文件呢,被正常的解析了啊,这里说我们加载了一个at硅谷rundown插件,然后在这个呃,Atput呢,也是一个file,也就是说我们的这个输出插件呢,也被正常的加载了,但是你看也可以看到呢,就这里面报了一个错啊,说这个跑这个程序的时候呢,没法初始化我们的输入组件艾rundown max输的比LA是吧,我们这里还写还拼错了是吧?Than me就是我们的最大值呢,应该比最小值要大,但是我们现在呢,啊给的是什么呢?我们现在这个配置文件里面啊,设的最大值呢。
16:04
是最大值设的是30,最小值呢设的是50,那么我们把它颠倒过来,我们看一下能不能正常运行。啊,现在呢,我们把这个最小值呢设成30,然后把最大值呢设成50,然后保存退出,重新运行我们刚才的程序,可以看到呢,现在啊没有这个error正在等待这个对,正在等待输出,现在我们可以看到啊,我们的这个程序正常的啊输出了我们的数据,而且呢,这个随机数呢,它是在31。他是在31到这个,呃50之间进行分布的,可以看到我们现在现在这个数据已经生成了。好,那么这也就是我们通过构语言呢,在啊整个。呃,Telegraph的框架基础之上呢,来实现一个自己的插件啊,总的来说呢,就是你去getth HUB上把那个模板找过来,然后按照里面的这个啊,注释它的要求啊,要求你改哪几个函数啊,你去做一下就可以了。
17:07
好,那我们的插件开发就讲解到这。
我来说两句