尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Telegraf Collectd 解析器实战指南:UDP 二进制网络协议、加密认证与多值拆分

Telegraf Collectd 解析器实战指南:UDP 二进制网络协议、加密认证与多值拆分 Telegraf Collectd 解析器实战指南UDP 二进制网络协议、加密认证与多值拆分【免费下载链接】telegrafAgent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data.项目地址: https://gitcode.com/GitHub_Trending/te/telegrafcollectd 是广泛使用的系统信息采集守护进程它通过自有的二进制网络协议把指标推送到远程服务器。本篇指南围绕 Telegraf 的 Collectd Parser 插件仓库路径 plugins/parsers/collectd/README.md展开讲解如何在 Telegraf 中直接消费该协议从零配置socket_listener接收 UDP 数据包再到签名/加密认证、TypesDB 数据类型加载以及多值插件的 split/join 两种解析语义。读完本文你将能够独立搭建一条「collectd → Telegraf → 时序数据库」的安全采集链路并理解其底层实现机制。Collectd 解析器是什么Telegraf 的 Collectd Parser 用于解析collectd 二进制网络协议binary network protocol的数据。该协议是 collectd 的network插件在主机之间传输指标时使用的紧凑二进制格式Telegraf 通过它可以直接接收来自其他 collectd 实例推送的指标而无须中间转换。根据 plugins/parsers/collectd/parser.go 的实现解析器完成两件事调用collectd.org/network包的network.Parse()把二进制报文还原为api.ValueList列表逐个把ValueList转换为 Telegraf 指标。解析时自动为指标创建host、instance、type、type_instance四个标签且所有 collectd 值Gauge、Derive、Counter都被统一转成float64 字段。这一点可以从 parser.go 的类型转换代码直接确认。collectd 解析器属于 Telegraf 通用输入数据格式之一在 docs/DATA_FORMATS_INPUT.md 的格式列表中有登记任何带有data_format选项的输入插件都可以选用它在 Telegraf 中它最常见的宿主是socket_listener输入插件。快速上手接收 collectd 推送数据collectd 网络协议默认通过 UDP 监听25826端口这也是 collectdnetwork插件的标准端口。下面是最小可用配置来自 collectd README[[inputs.socket_listener]] service_address udp://:25826 ## 要消费的数据格式每个数据格式有自己独立的配置项 ## 详见 docs/DATA_FORMATS_INPUT.md data_format collectd ## 加密安全级别使用的认证文件 collectd_auth_file /etc/collectd/auth_file ## none默认、sign 或 encrypt 三选一 collectd_security_level encrypt ## TypesDB 规范文件的路径 collectd_typesdb [/usr/share/collectd/types.db] ## 多值插件有两种处理方式 ## split 把多值插件数据拆分解析为多个独立的 measurement ## join 把多值插件数据作为一个含多字段的 measurement ## 为了兼容旧版 influxdb默认行为是 split collectd_parse_multivalue splitsocket_listener输入插件plugins/inputs/socket_listener/README.md负责监听 TCP/UDP/Unix 套接字并把收到的数据包按data_format交给解析器处理udp://:25826表示监听本机所有网卡的 25826 端口。当 collectd 发送端把指标推送到该端口后数据即被解析为 Telegraf 指标进入采集管道。配置参数详解Collectd 解析器全部配置项都定义在 parser.go 的Parser结构体中TOML 标签与配置文件名一一对应配置项TOML 键类型默认值说明数据格式data_formatstring无必须显式指定为collectd在宿主输入插件上选择 collectd 解析器认证文件collectd_auth_filestring/etc/collectd/auth_file用于签名/加密认证的用户-密码映射文件安全级别collectd_security_levelstringnonenone、sign、encrypt三选一类型数据库collectd_typesdb[]string无TypesDB 文件路径可指定多个多个数据库会被合并多值处理collectd_parse_multivaluestringsplitsplit默认或join需要特别说明的默认行为来自源码认证文件默认值常量定义在 parser.goDefaultAuthFile /etc/collectd/auth_file。如果collectd_auth_file未配置Init()会自动填入该默认路径parser.go。安全级别在Init()中做字符串到枚举的映射未匹配任何已知值时回落为noneparser.go。多值处理如果留空在解析时同样会回落到splitparser.go。安全级别与认证文件collectd 二进制协议支持三种网络安全级别解析器通过collectd_security_level控制对应network.None、network.Sign、network.Encrypt三种底层模式none默认不校验认证信息明文数据即可解析sign要求数据包附带签名校验通过才解析encrypt要求数据包使用加密密文通过共享密码解密后解析。认证文件的格式与仓库测试数据 plugins/parsers/collectd/testdata/authfile 一致为每行一条用户名: 密码的文本映射例如user0: barInit()中通过network.NewAuthFile(p.AuthFile)把该文件装载为密码查找器parser.go发送端使用同一用户与密码进行签名或加密接收端凭文件里的对应关系验证。测试文件 parser_test.go 用一组对照实验精确刻画了各安全级别的行为边界非常值得参考sign级别TestParse_SignSecurityLevel签名数据、加密数据均可正常解析明文数据被跳过解析结果为空指标列表使用错误密码签名则直接返回错误encrypt级别TestParse_EncryptSecurityLevel只有加密数据可解析签名数据与明文数据都会被跳过错误密码同样报错。也就是说安全级别越高解析器越严格——配置encrypt后即使攻击者伪造了带签名的数据也无法进入采集管道。TypesDB数据类型的加载与合并collectd 的类型系统依赖types.db文件其中定义了每个类型type所包含的数据源data sourceDS的名称、类型与取值范围。解析二进制报文时必须知道某个 type 对应几个数据源及其含义才能正确还原字段。解析器通过collectd_typesdb配置项指定数据库文件路径LoadTypesDB()打开文件并用api.NewTypesDB(reader)解析parser.goInit()遍历所有配置的路径逐个加载当存在多个数据库时使用Merge()进行合并parser.go因此你可以既包含发行版默认的/usr/share/collectd/types.db又追加自定义类型定义。如果该配置项留空popts.TypesDB保持 nil此时解析器只依赖报文自身携带的信息可能无法正确还原多数据源类型这与 parser_test.go 中TestNewCollectdParser对TypesDB为 nil 的断言一致。多值插件split 与 join 两种语义collectd 的一个数据包可以携带多个数据源值例如 CPU 插件一个值列表中包含 user、system、idle 等collectd_parse_multivalue决定如何处理这种情况核心逻辑在unmarshalValueList()parser.gosplit默认模式——每个数据源值生成一条独立指标指标名plugin_DSName例如cpu_value字段统一为valuefloat64效果一个含 2 个值的ValueList会被拆成 2 条 measurement。从 parser_test.go 的TestParseMultiValueSplit可以看到2 个值的报文在 split 模式下产出 2 条指标而singleMetric测试用例中未携带数据源名称的报文拆分后默认名称为plugin_valueparser_test.go对应 README 示例输出里的memory,typememory,type_instancebuffered value...。join 模式——整个ValueList合并为一条含多字段的 measurement指标名直接使用plugin字段每个数据源值以各自的DSName作为字段名效果一个含 2 个值的ValueList只产出 1 条指标2 个字段。对应 parser_test.go 的TestParseMultiValueJoinjoin 模式下同样报文只产出 1 条指标。README 中特别注明split 是默认行为目的是与旧版 influxdb 兼容如果你的下游存储更擅长处理多字段宽表可以显式改为join。如果配置了split/join以外的值解析器不会报错而是输出一条提示日志「parse-multi-value config can only be split or join」并丢弃该值列表parser.go。指标映射规则无论 split 还是 join指标的时间戳都取ValueList时间的 UTC 表示vl.Time.UTC()。标签映射规则完全一致只有当对应标识符非空时才添加标签collectd 标识符Telegraf 标签说明Hosthost来源主机名PluginInstanceinstance插件实例如 CPU 编号Typetype指标类型TypeInstancetype_instance类型实例字段值方面Gauge量规、Derive派生计数、Counter单调计数器三种 collectd 值类型都被转换为 float64 写入value字段split 模式或对应 DSName 字段join 模式相关代码见 parser.go。另外SetDefaultTags()与Parse()中实现了默认标签注入当解析器配置了默认标签且指标上不存在同名标签时才会补写parser.go。测试TestParse_DefaultTagsparser_test.go验证了这一点——默认标签foo: bar会被正确附加到解析后的指标上。示例输出解读README 给出了真实的解析结果示例[plugins/parsers/collectd/README.md#L48-L59]格式为 InfluxDB Line Protocolmeasurement 为memorymemory,typememory,type_instancebuffered value2520051712 1560455990829955922 memory,typememory,type_instanceused value3710791680 1560455990829955922 memory,typememory,type_instancebuffered value2520047616 1560455980830417318 memory,typememory,type_instancecached value9472626688 1560455980830417318 memory,typememory,type_instanceslab_recl value2088894464 1560455980830417318 memory,typememory,type_instanceslab_unrecl value146984960 1560455980830417318 memory,typememory,type_instancefree value2978258944 1560455980830417318 memory,typememory,type_instanceused value3707047936 1560455980830417318解读要点measurement 名memory来自 collectd 插件的名称标签typememory、type_instancebuffered/used/cached/...分别映射自协议中的类型与类型实例字段value即 collectd 的原始采样值以字节为单位的内存大小统一为 float64行尾为纳秒精度时间戳这是典型的 split 模式输出——同一时刻的多数据源值被拆成了多条独立 measurement因此相邻行共享同一时间戳、各对应一个type_instance。与 collectd 发送端对接要让 collectd 主机把数据推送到 Telegraf只需在 collectd 侧启用其network插件并把目标服务器指向运行 Telegraf 的主机与25826端口若在解析器侧配置了sign或encrypt安全级别则 collectd 侧还需配置相同的安全级别与认证文件用户/密码需与 Telegraf 的collectd_auth_file一致从而构成端到端的加密采集链路。小结Collectd 解析器让 Telegraf 能够以原生的方式接入 collectd 二进制网络协议通过socket_listenerdata_format collectd即可在 UDP 25826 端口接收并解析 collectd 数据用collectd_auth_file与collectd_security_level实现签名/加密认证encrypt级别只放行加密数据安全性最高用collectd_typesdb加载并合并多个类型数据库保证多数据源类型被正确还原用collectd_parse_multivalue在「多指标拆分」与「单指标多字段」两种建模方式之间切换默认split以兼容旧版 influxdb。如需深入阅读实现与验证细节推荐直接查看 parser.go 的解析与指标映射逻辑、parser_test.go 的安全级别与 split/join 行为测试以及宿主插件 socket_listener 的配置文档。【免费下载链接】telegrafAgent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data.项目地址: https://gitcode.com/GitHub_Trending/te/telegraf创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表