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

资讯详情

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

Telegraf 集成 OpenTSDB Telnet Put 格式解析器:配置、行协议规则与源码实现解析

Telegraf 集成 OpenTSDB Telnet Put 格式解析器:配置、行协议规则与源码实现解析 Telegraf 集成 OpenTSDB Telnet Put 格式解析器配置、行协议规则与源码实现解析【免费下载链接】telegrafAgent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data.项目地址: https://gitcode.com/GitHub_Trending/te/telegrafOpenTSDB 是业界常用的时序数据库其 Telnet 风格的putAPI 是写入指标数据最简洁的文本协议之一。本文基于 Telegraf 仓库中的 OpenTSDB 解析器插件完整讲解如何在任意支持data_format的输入插件中启用opentsdb格式、OpenTSDBput行协议的字段构成与时间戳精度规则并结合 parser.go 源码与 parser_test.go 测试用例揭示其逐行解析、标签合并、容错机制等底层实现细节。读完本文你将能够把 OpenTSDB Telnet 协议风格的文本数据无缝接入 Telegraf 的采集、处理与输出管线。OpenTSDB Telnet Put 格式是什么OpenTSDB 通过 Telnet 风格 API 接收写入请求一条写入请求即一行文本以put关键字开头。Telegraf 的opentsdb数据格式解析器正是按该协议解析文本并直接将其转换为 Telegraf 的 Metric 对象没有任何额外的解析器专属配置选项——这正是该解析器零配置的核心特点。一条完整的put行由四类元素组成以空格分隔put metric_name timestamp value tagk1tagv1 tagk2tagv2 ...以原文档给出的官方示例为例put sys.cpu.user 1356998400 42.5 hostwebserver01 cpu0该行表示指标名sys.cpu.user时间戳1356998400秒级 Unix 时间戳数值42.5附带两个标签hostwebserver01与cpu0。从 parser.go 源码 可以看到解析器对行内字段的切分与校验逻辑// Break into fields (put, name, timestamp, value, tag1, tag2, ..., tagN). fields : strings.Fields(line) if len(fields) 4 || fields[0] ! put { return nil, errors.New(doesnt have required fields) }即一行至少需要 4 个字段put、指标名、时间戳、数值且首字段必须是put否则整行会被判定为非法。这也意味着 OpenTSDB Telnet 协议中的其他命令如version不会被本解析器支持。在 Telegraf 中启用 opentsdb 数据格式任何带有data_format配置项的输入插件如 inputs.file、socket 监听类、exec 类等都可以通过设置data_format opentsdb来消费该格式的数据。完整的数据格式清单与通用说明见 docs/DATA_FORMATS_INPUT.md。以下配置取自原文档将opentsdb格式应用到文件输入插件[[inputs.file]] files [example] ## Data format to consume. ## Each data format has its own unique set of configuration options, read ## more about them here: ## https://github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_INPUT.md data_format opentsdb由于该解析器没有独立配置项data_format opentsdb即为全部所需配置。解析器通过 parser.go 中的注册逻辑 以opentsdb为名称登记到全局解析器注册表中func init() { parsers.Add(opentsdb, func(string) telegraf.Parser { return Parser{} }) }同时plugins/parsers/all/opentsdb.go 以空导入方式完成插件注册构建标签!custom || parsers || parsers.opentsdb表明它支持通过自定义构建custom builder按需裁剪。若你的场景只需解析 OpenTSDB 文本可在构建时仅保留该解析器以缩小二进制体积。解析器结构Parser结构体非常简单仅包含两个运行时注入的字段parser.go 源码// Parser encapsulates a OpenTSDB Parser. type Parser struct { DefaultTags map[string]string toml:- Log telegraf.Logger toml:- }其中DefaultTags用于为每条解析出的指标注入默认标签由SetDefaultTags方法设置见 parser.goLog用于输出错误日志二者均为非 TOML 配置项。行协议字段解析规则指标名与数值指标名取自行内第 2 个字段fields[1]直接作为 Telegraf 指标的 measurement 名称。数值取自第 4 个字段fields[3]通过strconv.ParseFloat(valueStr, 64)解析为 float64parser.go 源码并统一存放为名为value的字段// Parse value. v, err : strconv.ParseFloat(valueStr, 64) if err ! nil { return nil, fmt.Errorf(parsing field %q value failed: %w, measurement, err) } fieldValues : map[string]interface{}{value: v}这意味着无论原始文本写的是整数还是小数最终 Telegraf 指标中都会以浮点数形式呈现。这一点在 parser_test.go 的测试用例 中得到印证输入50后期望指标字段值为float64(50)。时间戳秒级与毫秒级自动识别OpenTSDB 的put协议允许时间戳为秒级或毫秒级的 Unix 时间戳。解析器通过数值量级自动判断精度parser.go 源码var timestamp time.Time if ts 1e12 { // second resolution timestamp time.Unix(ts, 0) } else { // millisecond resolution timestamp time.UnixMilli(ts) }规则非常直观时间戳数值小于1e121,000,000,000,000时按秒级处理调用time.Unix(ts, 0)时间戳数值大于等于1e12时按毫秒级处理调用time.UnixMilli(ts)。对应的测试用例见 parser_test.go 的 millisecond timestamp 用例。这一自动判断逻辑让同一条数据流中可以混用两种精度的时间戳无需额外配置。标签解析与合法性过滤行内第 5 个字段及之后的所有字段均被视作标签格式为tagktagv。解析器对每个标签执行严格校验parser.go 源码for _, tag : range tagStrs { tagValue : strings.Split(tag, ) if len(tagValue) ! 2 { continue } name : tagValue[0] value : tagValue[1] if name || value { continue } tags[name] value }三条过滤规则值得注意标签中必须恰好包含一个分隔符否则整条标签被丢弃键名为空的标签被丢弃值为空的标签被丢弃。也就是说格式不规范的标签不会导致整行解析失败而是被静默忽略——这种宽松丢弃策略保证了容错性。最终标签 map 的容量预分配为默认标签数与行内标签数之和避免动态扩容tags : make(map[string]string, len(p.DefaultTags)len(tagStrs)) for k, v : range p.DefaultTags { tags[k] v }默认标签DefaultTags先于行内标签写入因此行内同名标签会覆盖默认标签值。多标签解析的正确性由 parser_test.go 的 single tag 与 double tags 用例 验证。批量解析与容错机制Parse方法是面向批量文本的入口parser.go 源码其工作流如下使用bufio.Scanner将输入按行切分对每行去除末尾的\r\n兼容 Windows CRLF 与 Unix LF 行尾逐行调用ParseLine单行解析失败不中断整体错误通过p.Log.Errorf记录后continue继续处理后续行。源码中的注释明确解释了这一设计意图// Dont let one bad line spoil a whole batch. In particular, it may // be a valid opentsdb telnet protocol command, like version, that // we dont support.也就是说即使数据流中混入了version等其他 Telnet 协议命令也不会拖垮整批数据只会跳过并记录日志。该行为由 parser_test.go 的 mixed valid/invalid input 用例 验证在version\r\n之后的两条合法put行均被正确解析输出。此外TestParse 用例 还覆盖了无换行结尾、LF 结尾、CRLF 结尾以及多行混合等边界情形确认该解析器对常见文本换行风格均有良好兼容性。将 OpenTSDB 解析接入数据管线opentsdb解析器的输出遵循 Telegraf 统一的 Metric 模型解析结果可直接流入 processor处理器与 aggregator聚合器进行加工再交给 output输出插件写入 InfluxDB、Prometheus 等下游系统。其核心映射关系可总结为OpenTSDB put 行元素Telegraf Metric 映射put关键字协议标识解析时校验不参与映射指标名第 2 字段measurement 名称时间戳第 3 字段指标时间戳秒/毫秒自动识别数值第 4 字段字段valuefloat64标签第 5 字段起kv指标标签解析器默认标签额外注入的标签行内同名标签可覆盖从源码结构看该解析器实现的是 Telegraf 标准的telegraf.Parser接口提供Parse与ParseLine方法因此它可以被所有支持data_format的输入插件以完全一致的方式复用——无论是读取文件、监听 socket 还是消费消息队列只要文本符合put行协议即可无缝接入。这类适合消费 OpenTSDB Telnet 文本流数据的输入插件还包括 inputs.socket_listener、inputs.tcp_listener 等网络类插件你可以根据实际数据来源灵活组合。使用建议与限制无附加配置项opentsdb格式不需要也不支持解析器专属配置出现格式问题时应从数据本身入手排查。时间戳精度虽然支持秒/毫秒自动识别但同一指标的数据源应尽量保持精度一致避免因 13 位与 10 位时间戳混合导致的时间轴错乱。容错边界非put命令与非法标签会被跳过或忽略但数值与时间戳解析失败的整行会被丢弃并记录错误日志需要关注日志中的Error parsing ...记录。性能解析器基于bufio.Scanner逐行处理适用于高吞吐场景仓库中提供了 BenchmarkParsing 基准测试 与示例基准数据便于在本地评估吞吐表现。如需验证解析行为可直接运行仓库内该模块的测试go test ./plugins/parsers/opentsdb/...参考与延伸阅读插件官方说明文档plugins/parsers/opentsdb/README.md解析器实现源码plugins/parsers/opentsdb/parser.go解析器测试用例plugins/parsers/opentsdb/parser_test.go插件注册入口plugins/parsers/all/opentsdb.goTelegraf 输入数据格式总览docs/DATA_FORMATS_INPUT.md【免费下载链接】telegrafAgent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data.项目地址: https://gitcode.com/GitHub_Trending/te/telegraf创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表