十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Telegraf Converter 处理器插件:标签与字段的类型转换、测量名与时间戳重塑实战指南

Telegraf Converter 处理器插件:标签与字段的类型转换、测量名与时间戳重塑实战指南 Telegraf Converter 处理器插件标签与字段的类型转换、测量名与时间戳重塑实战指南【免费下载链接】telegrafAgent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data.项目地址: https://gitcode.com/GitHub_Trending/te/telegraf导读Telegraf 的 Converter 处理器插件processors.converter自 v1.7.0 起提供是一个专注于重塑指标结构的转换工具它可以把标签tags转换为字段fields或测量名measurement name、把字段转换为标签或测量名、把标签/字段提升为指标时间戳并在任意方向之间切换字段的数据类型。本文以 converter 插件官方文档 为骨架结合 converter.go 的实现与 converter_test.go 的测试用例系统讲解全部配置参数、转换规则、边界行为与实战示例帮助你在数据管线中准确运用这一转换利器。插件定位与适用场景Converter 属于 Telegraf 的transformation类别处理器可以在所有平台all上运行。它在数据采集inputs与数据输出outputs之间对指标做结构性整形常见场景包括把 tag 变为 field例如将 HTTP 端口等低基数标识从标签降级为字段缩小序列基数让每个序列更稳定把 field 变为 tag例如将业务字段提升为标签便于在时序数据库里按维度聚合查询改变字段类型例如把整数字段转成浮点、把字符串数字转成整数、把数值转成布尔等统一下游 schema用标签/字段值重命名 measurement例如把 MQTT topic 提升为测量名用标签/字段值设置指标时间戳例如数据源自带时间戳时用它覆盖采集时间。由于转换后系列series的标识会变化插件文档在开头特别强调了一个重要注意事项将标签转换为字段时请务必确保序列仍然可以唯一标识。具有相同 series keymeasurement tags的字段会相互覆盖。这一点在写入 InfluxDB 这类按measurement tags唯一标识序列的时序库时尤为关键详见后文高基数与系列唯一性风险一节。全局配置选项与其他插件一样Converter 支持 Telegraf 的通用全局配置例如namepass、namedrop、tagexclude、alias以及处理器执行顺序配置等详见 docs/CONFIGURATION.md。[[processors.converter]]作为处理器数组的一个元素与其它处理器如 processors.starlark按配置顺序依次作用于每一条指标。配置参数全解完整配置模板可直接参考 sample.conf。核心思路是两张表[processors.converter.tags]与[processors.converter.fields]。每张表的键key代表目标类型值value是需要转换的键名数组数组元素支持 glob 通配符语法形式为target-type [key...]。tags 表标签的目标去向[[processors.converter]] [processors.converter.tags] measurement [] string [] integer [] unsigned [] boolean [] float [] ## 可选用作指标时间戳的标签 # timestamp [] ## 上述时间戳标签的解析格式可取 unix、unix_ms、unix_us、unix_ns ## 或任意合法的 Golang 时间格式使用 timestamp 选项时必须配置 # timestamp_format 各目标类型的语义目标类型效果measurement用该标签的值重命名测量名原标签被移除string/integer/unsigned/boolean/float把标签转换为对应类型的字段原标签被移除timestamp用该标签值设置指标时间戳原标签被移除需配合timestamp_formatfields 表字段的目标去向[processors.converter.fields] measurement [] tag [] string [] integer [] unsigned [] boolean [] float [] ## 可选将 Base64 编码的 IEEE 754 Float32 值解码为 float32 字段 ## 例如 openconfig 遥测数据中形如 ## data_json_content_state_openconfig-platform-psu:output-power:RKeAAA 的数值 ## 解码后得到 float32 值 1340 # base64_ieee_float32 [] ## 可选用作指标时间戳的字段 # timestamp [] ## 同 tags 表timestamp_format 在使用 timestamp 时必须配置 # timestamp_format 目标类型效果measurement把字段值转为字符串后重命名测量名原字段被移除tag把字段值转为字符串后提升为标签原字段被移除string/integer/unsigned/boolean/float把字段转换为对应类型同类型转换视为规范化base64_ieee_float32将 Base64 字符串按 IEEE 754 位模式解码为float32字段timestamp用字段值设置指标时间戳成功后原字段被移除类型转换的通用约束文档明确了三条全局规则均可从源码与测试中得到印证转换失败的值会被丢弃。对于 tags 表转换失败只记录错误日志并跳过convertTags中continue对于 fields 表转换失败不仅记录日志还会主动移除该字段converter.go。测试用例from string field unconvertible、from tag unconvertible均验证了这一点。字符串转数字时可能损失精度。插件支持的最大数值类型是float64当字符串数字超出float64能精确表示的范围时精度会丢失。转换实现经由 internal/type_conversions.go 的ToFloat64等函数完成内部使用strconv.ParseFloat/ParseInt等标准库解析。数组顺序不保证。可以同时配置多个标签或字段作为测量名来源或时间戳来源但数组内匹配顺序不保证——当多个候选键同时存在时最终生效的是哪一个不做确定性承诺测试TestMultipleTimestamps也表明配置多个时间戳源是被允许的。从零配置实战示例以下四个示例完整来自插件官方文档均经过测试用例验证可以直接复制到 Telegraf 配置中。示例一把 port 标签转换为字符串字段[[processors.converter]] [processors.converter.tags] string [port]转换前后对比Influx 行协议- apache,port80,serverdebian-stretch-apache BusyWorkers1,BytesPerReq0 apache,serverdebian-stretch-apache port80,BusyWorkers1,BytesPerReq0可以看到port从标签series 的一部分变成了字段port80系列基数因此下降。注意这里port被转成字符串字段这是文档示例的行为如需数值字段应配置float [port]或integer [port]。示例二用 glob 批量转换字段类型[[processors.converter]] [processors.converter.fields] integer [scboard_*]转换前后对比- apache scboard_closing0,scboard_dnslookup0,scboard_finishing0,scboard_idle_cleanup0,scboard_keepalive0,scboard_logging0,scboard_open100,scboard_reading0,scboard_sending1,scboard_starting0,scboard_waiting49 apache scboard_closing0i,scboard_dnslookup0i,scboard_finishing0i,scboard_idle_cleanup0i,scboard_keepalive0i,scboard_logging0i,scboard_open100i,scboard_reading0i,scboard_sending1i,scboard_starting0i,scboard_waiting49iGlob 匹配由 filter/filter.go 的Compile实现底层使用github.com/gobwas/glob支持*、?、{}、[]、!等通配符。测试用例globbing用integer: [int_*]验证了int_a、int_b被批量转为int64而float_a保持不变。示例三用标签值重命名测量名[[processors.converter]] [processors.converter.tags] measurement [topic]转换前后对比- mqtt_consumer,topicsensor temp42 sensor temp42这是 MQTT 等多主题输入的经典用法将每个消息携带的 topic 标签提升为测量名让不同主题的数据进入不同的 measurement。源码中convertTags对命中的键执行metric.SetName(value)随后metric.RemoveTag(key)converter.go。测试用例measurement from tag验证了用filepath标签的值/var/log/syslog重命名测量名的行为。示例四用标签设置指标时间戳[[processors.converter]] [processors.converter.tags] timestamp [time] timestamp_format unix转换前后对比- metric,time1677610769 temp42 metric temp42 1677610769时间戳解析由internal.ParseTimestamp完成internal/internal.gounix系列格式支持整数、浮点数或字符串输入unix/unix_ms/unix_us/unix_ns分别对应秒、毫秒、微秒、纳秒精度其余情况视为 Go 标准时间格式字符串如rfc3339、2006-01-02 15:04:05 MST此时输入必须是字符串。测试覆盖了unix整型字段1111111111、rfc33392009-02-13T23:31:30Z→1234567890以及自定义 Go 时间格式等多种情况也验证了时间戳格式非法时转换被跳过、原数据保持不动invalid timestamp format用例。同样的功能也完全可以通过 fields 表实现把time字段提升为时间戳用法一致[[processors.converter]] [processors.converter.fields] timestamp [time] timestamp_format unix字段转标签提升维度与示例一相反把字段提升为标签是提升可查询性的常用手段。配置[[processors.converter]] [processors.converter.fields] tag [f]测试用例from string field中字段f: foo被转换为标签ffoo并从字段中移除。convertFields的实现使用internal.ToString把字段值转成字符串再metric.AddTag(key, v)最后metric.RemoveField(key)converter.go。注意ToString对nil会返回空字符串对不支持的类型返回错误转换失败时该字段同样被丢弃。转换规则深入数值、布尔、十六进制与浮点边界从源码的辅助函数converter.go和internal包的类型转换函数internal/type_conversions.go可以总结出精确的转换语义整数 / 无符号整数toInteger / toUnsigned字符串解析优先走internal.ToInt64/ToUint64支持十进制、0x十六进制前缀测试用例from string field hexadecimal验证0x11826c→1147500若字符串解析失败回退到浮点解析再取整浮点转整数采用四舍五入math.Round42.2→4242.5→43见测试from string field的b1/b2越界被钳制而非报错超过int64范围取math.MaxInt64/math.MinInt64超过uint64范围取math.MaxUint64负数转 unsigned 取0测试out of range for unsigned、from float field、from unsigned field均有对应断言布尔转整数时true→1、false→0。布尔internal.ToBool支持标准strconv.ParseBool的字符串形式1/t/T/TRUE/true/True/0/f/F/FALSE/false/False数字0→false、非零 →true。测试用例from integer field验证int64(42)→true、int64(0)→false。浮点toFloat字符串以0x开头时先解析为任意精度整数math/big再转为float64——因此可以处理超过float64整数表示范围的十六进制大数测试from string field hexadecimal中0x2139d19bb1c580ebe0→612908836750534700000其余情况走internal.ToFloat64。Base64 编码的 IEEE 754 Float32base64ToFloat32这是一个面向特定数据源的专有能力某些遥测协议如 openconfig 的 gNMI 数据会把 float32 的位模式编码为 Base64 字符串文档示例RKeAAA解码为1340。base64ToFloat32的实现流程是Base64 解码 → 校验字节长度必须为 4 → 拼出 32 位二进制串 →strconv.ParseUint→math.Float32frombitsconverter.go。测试用例float32 from ieee754 float32 encoded as base64验证QlAAAA→float32(52)、QlgAAA→float32(54)。解码失败非法 Base64 或长度不是 4 字节时字段被移除。内部工作原理过滤器编译与处理流程从源码结构看插件的运行可分为两个阶段初始化阶段Init/compilecompile()分别把tags、fields两张配置表编译成conversionFilter结构体——每个目标类型对应一个filter.Filterconverter.go。filter.Compile对空数组返回nil过滤器若两张表最终都没有任何有效过滤器Init会直接报错no filters found测试TestEmptyConfigInitError验证了空配置启动失败。处理阶段Apply对每条指标依次执行convertTags(metric)与convertFields(metric)converter.go。convertTags遍历metric.Tags()命中即转换并RemoveTagconvertFields遍历metric.Fields()命中即转换失败则移除字段。插件通过processors.Add(converter, ...)注册converter.go因此配置表中统一使用[[processors.converter]]小节。此外它实现了 Telegraf 的跟踪指标tracking metric接口测试TestTracking验证了转换后指标在输出确认Accept时投递通知能正确送达。高基数与系列唯一性风险回到文档开头的关键警告标签属于 series keymeasurement tags字段不属于。当你把标签转成字段、或把不同标签值映射到同一测量名时多个输入系列可能坍缩成同一个系列键后续写入时字段会相互覆盖。典型风险场景把唯一性强的标签如host、instance转成字段若两个来源的 host 值相同数据会被覆盖用measurement [topic]时若不同消息的 topic 相同但期望保留其他标签需确认剩余标签组合仍然唯一。设计转换规则时应先用telegraf --test或telegraf --config file --test观察转换后的行协议输出确认系列键符合预期后再部署到生产环境。常见配置问题与排错问题现象排查方向转换后字段消失值无法解析为目标类型字段被丢弃——检查源值格式与目标类型是否匹配配置了timestamp但时间戳没生效timestamp_format缺失或非法对 Go 格式字符串输入必须是字符串类型浮点转整数结果多了 1转换采用四舍五入math.Round42.5会变成43大整数精度异常字符串数字超出float64精确表示范围精度丢失是预期行为启动报no filters foundtags和fields都没有配置任何目标类型至少需要一个非空数组多个候选键不确定谁生效数组匹配顺序不保证避免同时配置多个测量名/时间戳来源结语Converter 是 Telegraf 数据整形工具箱中的基础件一张tags表、一张fields表配上measurement、tag、string、integer、unsigned、boolean、float、timestamp以及base64_ieee_float32等目标类型即可完成标签/字段/测量名/时间戳之间的任意重塑。理解其失败即丢弃字段、四舍五入取整、越界钳制、顺序不保证等边界行为配合测试用例验证过的示例配置可以让你的数据管线在采集与输出之间拥有一道可靠的结构转换闸门。如需进一步了解处理器在管线中的位置与全局选项可参阅 docs/CONFIGURATION.md 与 docs/PROCESSORS.md。【免费下载链接】telegrafAgent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data.项目地址: https://gitcode.com/GitHub_Trending/te/telegraf创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表