大家好,我是小斐呀。
前面分享了些夜莺开源产品categraf
在网络设备领域监控的最佳实践,夜莺算是补全国内在网络设备采集器上的一些空白,当然这里讲的都是基于Prometheus
体系开展的指标监控。
但是我知道categraf
是借鉴了telegraf
这位前辈的相关经验,一定程度上复刻了telegraf
的SNMP
插件,由于有一部分群友的公司很早就开始使用了telegraf
这款优秀的采集器,全方面的深度融入这款采集器,毕竟telegraf
适配性太强,实现了对很多开源产品、相关协议组件的指标采集插件,已经达成一个比较变态的程度,几乎你能想到的采集插件它都实现了。
下面我将基于telegraf
下SNMP
插件来实现采集网络设备,同时对比下categraf
下SNMP
插件和它的相似之处以及不同点。
Telegraf 简单架构
Telegraf
是典型的Pipeline
架构,这种架构在采集器领域很常见,比如Vector
等都是这种架构风格,目前Telegraf
根据这种架构把采集过程分为几个阶段,不同阶段由不同的模块插件组成,主要有以下几个模块:
Input Plugins :输入插件 Processor Plugins :处理插件 Aggregator Plugins :聚合插件 Output Plugins :输出插件
以上列出是Telegraf
执行采集流程的主要四大模块插件,另外还有:parsers
、serializers
、secretstores
三个辅助模块插件。
下面是四大模块插件的组合处理过程图:
基本情况介绍到这里,更多原理性内容不过多展开,有兴趣的可移步个人星球深入了解。
配置文件
Telegraf
安装这里省略,具体安装可查看官网说明,我推荐通过apt-get
或yum
配置官方存储库进行安装。
这里展开说明下配置文件,当使用包管理工具安装后,默认的配置文件放在目录/etc/telegraf
下,该目录下有一个默认的全局配置文件telegraf.conf
以及一个子目录telegraf.d
,这个telegraf.conf
配置文件是Telegraf
的主配置文件,这个telegraf.d
通常用于存放Telegraf
配置文件的子文件。这个目录的主要目的是帮助组织和分离配置,使其更具模块化和可维护性。你可以将不同插件或特定功能的配置单独放入该目录中的不同文件,Telegraf
会自动加载并应用这些文件中的配置。
/etc/telegraf/telegraf.conf : 主配置文件 /etc/telegraf/telegraf.d/ : 子配置文件存放目录
这两个配置文件在通用的 Linux 发行版,大多数默认指定构建,通过下面两个选项参数指定:
--config : 加载主配置文件的路径或URL。 --config-dir : 加载子配置文件目录路径。
如果想在启动的时候自行指定,可以在启动的以后加上这两个参数,否则默认是加载上面默认指定的主配置文件和子配置文件目录路径。
建议telegraf.conf
主配置文件只配置一些全局配置,如下所示:
# 全局标签
[global_tags]
## 添加默认的全局标签
# dc = "ch-east-1"
# rack = "A1"
## 环境变量可以用作标签,并且可以在整个配置文件中使用。
# user = "$USER"
# agent 配置
# 可配置参数:https://docs.influxdata.com/telegraf/v1/configuration/#agent-configuration
[agent]
interval="10s"
round_interval=true
metric_batch_size=1000
metric_buffer_limit=10000
collection_jitter="0s"
flush_interval="10s"
flush_jitter="0s"
precision="0s"
hostname=""
omit_hostname=false
剩下所有的输入输出插件配置和辅助插件配置都单独写入子配置文件,放入子配置文件目录,在最佳实践中建议一个任务一个子配置文件,更好的模块化以及后续管理运维。
采集配置
我现在手上有一台华三交换机,我需要通过这个插件去采集华三交换机的指标数据,以实现对设备的监控告警,我应该如何做呢?
首先我们需要根据上面的架构图分析我们在每个阶段需要的插件分别是什么,列出我们在整个采集过程中需要用到的插件,然后生成一个基础的插件组成的基础配置文件:
交换机数据采集无非SNMP
和Telemetry
最多在结合一下自己写的脚本处理,这里我们用到插件有SNMP
。
Inputs 阶段: snmp
和ping
Processors 阶段: 暂时不需要 Aggregators 阶段: 暂时不需要 Outputs 阶段: http
或influxdb_v2
为什么Outputs 阶段为啥需要http
插件呢?因为我需要把采集的指标数据写入到VictoriaMetrics
时序库中,并且需要把数据格式转为Prometheus
数据写入进去。
我们执行下基础的命令生成基础组成插件的配置文件:
# 多个插件用冒号分隔
telegraf
--section-filter "inputs:outputs:processors:aggregators"
--input-filter "snmp:ping"
--output-filter "http:influxdb_v2"
config > snmp_h3c_switch.conf
# 删除注释和空行
sed '/^s*#/d;/^s*$/d' snmp_h3c_switch.conf > snmp_h3c_switch_format.conf
执行上面的配置文件生成命令就生成了个基础模块配置,如下所示:
[[outputs.influxdb_v2]]
...
[[outputs.http]]
...
[[inputs.ping]]
...
[[inputs.snmp]]
agents=["udp://127.0.0.1:161"]
[[inputs.snmp.field]]
...
[[inputs.snmp.field]]
...
[[inputs.snmp.table]]
...
[[inputs.snmp.table.field]]
...
接下来就是继续填充我们需要采集的配置文件,如下所示:
[agent]
snmp_translator="gosmi"
# 输出插件 influxdb_v2
[[outputs.influxdb_v2]]
urls=["http://172.17.40.5:8428"]
token=""
organization=""
bucket=""
# # 输出插件 http
# [[outputs.http]]
# url = "http://172.17.40.5:8428/influx/api/v2/write"
# data_format = "influx"
# # 输出插件 http
# [[outputs.http]]
# url = "http://172.17.40.5:8428/api/v1/write"
# data_format = "prometheusremotewrite"
# 输入插件 ping
[[inputs.ping]]
urls=["192.168.100.200"]
# 输入插件 snmp
[[inputs.snmp]]
agents=[
"udp://192.168.100.200"
]
# snmp 插件提供的参数
timeout="5s"
version=2
path=["/opt/categraf/mibs/h3c/private","/opt/categraf/mibs/h3c/public"]
community="public"
agent_host_tag="source"
retries=3
max_repetitions=15
unconnected_udp_socket=false
# 输入插件框架参数
# interval = "15s"
tags={region="beijing",role="switch",brand="h3c"}
# name_override = "network"
# name_prefix = "snmp_"
# 系统名称
[[inputs.snmp.field]]
oid="RFC1213-MIB::sysName.0"
name="device_name"
is_tag=true
# 接口虚拟表信息
[[inputs.snmp.table]]
# oid = "IF-MIB::ifTable"
name="snmp_interface"
# index_as_tag = true
inherit_tags=["device_name"]
[[inputs.snmp.table.field]]
oid="IF-MIB::ifIndex"
name="ifIndex"
is_tag=true
# 接口管理状态 INTEGER {up(1), down(2)}
[[inputs.snmp.table.field]]
oid="IF-MIB::ifAdminStatus"
name="ifAdminStatus"
is_tag=true
# 接口工作状态 INTEGER {up(1),down(2),testing(3)}
[[inputs.snmp.table.field]]
oid="IF-MIB::ifOperStatus"
name="ifOperStatus"
......
# 标签筛选
[inputs.snmp.tagpass]
ifAdminStatus=["1"]
...
上述配置文件只列出部分,因为实在太多,我将以视频的方式去具体讲解一下加深理解。
讲下指标采集后最终数据写入时序库可以用什么方式?也就是Outputs
阶段如何配置,这里因为要使用Prometheus
格式数据,故有三种写入方式,如下所示:
# 输出插件 influxdb_v2
[[outputs.influxdb_v2]]
urls=["http://172.17.40.5:8428"]
token=""
organization=""
bucket=""
如果使用时序库VictoriaMetrics
可以直接使用influxdb_v2
插件写入VictoriaMetrics
因为VictoriaMetrics
支持直接对接influxdb_v2
接口。
当然这里要提一句,如果国内公司因信创要求,没办法使用国外时序库,推荐使用国内公司开发维护的时序库,比如GreptimeDB
等等。
GreptimeDB
的时序库,支持InfluxDB 行协议
,这里以InfluxDB line v2
版本协议为案例:
[[outputs.influxdb_v2]]
urls=["http://172.17.40.5:4000/v1/influxdb"]
token="<greptime_user>:<greptimedb_password>"
bucket="<db-name>"
## Leave empty
organization=""
如果时序库不支持InfluxDB line
协议,我们也可以使用http
模块,这里还是以VictoriaMetrics
或GreptimeDB
时序库为案例,如下所示:
# VictoriaMetrics 时序库
[[outputs.http]]
url="http://172.17.40.5:8428/api/v1/write"
data_format="prometheusremotewrite"
# GreptimeDB 时序库
[[outputs.http]]
url="http://172.17.40.5:4000/v1/prometheus/write"
data_format="prometheusremotewrite"
或者还可以使用influx
格式数据,但是输出模块还是http
即可,如下所示:
# VictoriaMetrics 时序库
[[outputs.http]]
url="http://172.17.40.5:8428/influx/api/v2/write"
data_format="influx"
# GreptimeDB 时序库
[[outputs.http]]
url="http://172.17.40.5:4000/v1/influxdb/api/v2/write"
data_format="influx"
简单对上面关于Telegraf
把数据输出到VictoriaMetrics
或GreptimeDB
以及Prometheus
等时序库做一个总结,如下图所示:
接下来对写好的配置文件进行采集测试,确保你写的配置文件无语法和配置错误问题,实现采集的指标可以正常输出:
# 切换到配置文件存放的目录
cd /etc/telegraf/telegraf.d
# 执行采集测试模式
telegraf --config snmp_h3c_switch.conf --test --debug
如下图所示,就代表配置文件和语法是正常的:
最后启动telegraf
采集所有配置文件定义的指标数据,最后实现了Telegraf
的SNMP
采集华三交换机的指标,下图是面板案例:
通过Telegraf
也比较完美实现了和Categraf
的完美需求。
Telegraf vs Categraf
Telegraf
和Categraf
插件都比较丰富,但是由于Telegraf
起步比较早,很多领域的插件都适配,丰富到几乎只有你想不到的,没有你找不到的。
但Categraf
本土化了,而且原生就是Promethues
体系,数据库、中间件、主机、其他辅助等主流插件都适配了,而且在某些领域我个人觉得是比Telegraf
更好用,更容易理解。
就比如SNMP
插件吧,我处理一个表节点的筛选,我只需要在表这一层级加个筛选表达式即可,而Telegraf
需要引入tagrpass
和processors
下的filter
和regex
才能实现我的需求,如下对比所示:
# Categraf 这个是细化到表级别
filters = ["exprA:name:^2$"]
filters_expression = "exprA"
# Telegraf 这个是针对 snmp 插件级别 如果不同的表中有多个name很难去匹配 相比较而言 Categraf 更符合日常写配置采集的逻辑
[inputs.snmp.tagpass]
name = ["2"]
# Categraf 修改标签值
[[instances.relabel_configs]]
source_labels = ["index"]
target_label = "index"
# separator = "/"
action = "replace"
regex = "^[^.]+\.([^\.]+)\..*"
replacement = "$1"
# Telegraf 修改标签值
[[processors.regex]]
namepass = ["snmp_lldp"]
[[processors.regex.tags]]
key = "index"
pattern = "^[^.]+\.([^\.]+)\..*"
replacement = "${1}"
总结下来就是Categraf
下的SNMP
很简洁并容易使用,功能也满足需求,**Telegraf
** 下的SNMP
在插件层面基础功能比Categraf
弱一些,强大的地方在processors
插件的引入可以对采集的数据做二次解析加工清洗,相应的使用和理解难度指数上升,真的是个细致活。
综述所述:
Telegraf
比Categraf
插件丰富Telegraf
功能强大,相应使用上的难度增大,相比而言Categraf
更加轻便快捷
适应场景:
技术栈最开始就选择 Telegraf
的,可以继续深入使用刚开始构建可观测下,在指标抓取上选择采集器首推 Categraf
在特殊领域不满足需求可以通过开源方案做采集器的组合采集,满足自己的需求。
如果需要采集器的组合,比如Categraf + Telegraf + Exporter
组合,如下图所示:
我建议生产环境首先定义好规范,制定统一标准,统一标签,统一时序库。
好了,简单聊到这里了,需要Telegraf
的采集交换机的面板可直接私信获取。
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...