Telegraf监控客户端调研笔记(5)-本地端口监控&远程TCP探测

夜莺v4版本中有个端口监控功能,我们来看一下Telegraf如何实现这个功能。遍历了一下Telegraf的input plugin列表,看起来可以用net_response这个plugin来实现。该plugin配置如下:

# # Collect response time of a TCP or UDP connection# [[inputs.net_response]]### Protocol, must be "tcp" or "udp"### NOTE: because the "udp" protocol does not respond to requests, it requires### a send/expect string pair (see below).#protocol = "tcp"### Server address (default localhost)#address = "localhost:80"#### Set timeout## timeout = "1s"#### Set read timeout (only used if expecting a response)## read_timeout = "1s"#### The following options are required for UDP checks. For TCP, they are### optional. The plugin will send the given string to the server and then### expect to receive the given 'expect' string back.### string sent to the server## send = "ssh"### expected string in answer## expect = "ssh"#### Uncomment to remove deprecated fields## fielddrop = ["result_type", "string_found"]

这个注释写的很明白,可以进行tcp和udp探测,udp探测的话,需要配置发送字符串和期望返回的字符串,tcp的话比较简单,就配置一些连接地址和超时时间即可。ok,我们来配置一条tcp探测规则:
[[inputs.net_response]]protocol = "tcp"address = "116.85.46.86:10090"timeout = "5s"

返回的内容如下:???????
ulric@bogon:~/gopath/src/telegraf$ ./telegraf --config telegraf.conf --test --input-filter net_response2021-11-07T01:39:15Z I! Starting Telegraf> net_response,host=192.168.0.103,port=10090,protocol=tcp,result=success,server=116.85.46.86 response_time=0.043524127,result_code=0i,result_type="success" 1636249156000000000

咱们故意把这个10090端口宕掉,再次探测,看看返回内容有何变化:???????
ulric@bogon:~/gopath/src/telegraf$ ./telegraf --config telegraf.conf --test --input-filter net_response2021-11-07T01:45:39Z I! Starting Telegraf> net_response,host=192.168.0.103,port=10090,protocol=tcp,result=connection_failed,server=116.85.46.86 result_code=2i,result_type="connection_failed" 1636249540000000000

这就有点坑了(针对常见的时序库而言),这个result标签在成功和失败的时候值不同,也就是前文讲到的标签不是稳态的,从时序角度来看,会当做两条监控数据来对待,非常不友好。另外,field部分有个result_type,是字符串类型,很多时序库也不支持,这个field要被干掉,field这个,配置中有这么两行,大家应该看到了:???????
### Uncomment to remove deprecated fields## fielddrop = ["result_type", "string_found"]

看来是之前老版本有result_type和string_found这俩字符串,建议是drop掉,所以tag部分和field部分,都要做一下过滤,最终配置如下:???????
[[inputs.net_response]]protocol = "tcp"address = "116.85.46.86:10090"timeout = "5s"fielddrop = ["result_type", "string_found"]tagexclude = ["result"]

这样配置之后,我们重新测试一下,看看输出的监控数据长什么样????????
ulric@bogon:~/gopath/src/telegraf$ ./telegraf --config telegraf.conf --test --input-filter net_response2021-11-07T01:48:06Z I! Starting Telegraf> net_response,host=192.168.0.103,port=10090,protocol=tcp,server=116.85.46.86 result_code=2i 1636249686000000000

嗯,nice~现在来看标签是稳态的了,只有一个field是result_code,只要这个值是0就是正常的,非0就是异常的,搞定!


net_response这个plugin,既可以探测本地端口,也可以探测远程端口(作为一个探针使用),本地端口的话,大家可以把address设置为localhost:${port},或者127.0.0.1:${port},在云原生的场景下,比如我们使用公有云的虚机,一般都是用小规格的虚机,一台虚机只部署一个应用程序,这个虚机上面的监控客户端,比如Telegraf,就是专门给这个应用程序独享使用的,可以在部署升级应用程序的时候,顺便通过自动化手段来修改Telegraf的配置,把应用程序的端口监控配置加进去,比较方便。

也可以找一台专门的机器做为中心探针,去探测多个远端地址,类似Prom生态的Blackbox_exporter,那如果我这里要探测两个tcp地址,应该如何配置呢?简单,如下:
[[inputs.net_response]]protocol = "tcp"address = "116.85.46.86:10090"timeout = "5s"fielddrop = ["result_type", "string_found"]tagexclude = ["result"]tags = {bu="cloud", region="bj"} [[inputs.net_response]]protocol = "tcp"address = "localhost:18000"timeout = "1s"fielddrop = ["result_type", "string_found"]tagexclude = ["result"]tags = {bu="cloud", region="local"}

用两个section来描述即可,[[]]这种格式的部分,表示数组,都可以写多个,另外上例中也同时演示了如何附加额外的标签,标签一般要放在section的最后,受制于toml格式配置文件的解析规则,如果要附加额外的标签,一定要每个探测目标都有对应的标签,保持标签key的稳定性。如上配置,运行之后输出如下:???????
ulric@bogon:~/gopath/src/telegraf$ ./telegraf --config telegraf.conf --test --input-filter net_response2021-11-07T02:10:32Z I! Starting Telegraf> net_response,bu=cloud,host=192.168.0.103,port=18000,protocol=tcp,region=local,server=localhost result_code=2i 1636251032000000000> net_response,bu=cloud,host=192.168.0.103,port=10090,protocol=tcp,region=bj,server=116.85.46.86 result_code=2i 1636251032000000000

【Telegraf监控客户端调研笔记(5)-本地端口监控&远程TCP探测】附加的标签已经出现在输出的监控数据中,nice~ UDP的场景这里没有测试,大家如果有需求自行尝试一下,如遇到坑,欢迎到夜莺开源社区知识星球分享~

    推荐阅读