
Telegraf 的 Netfilter Conntrack 输入插件Linux 连接跟踪统计采集实战指南【免费下载链接】telegrafAgent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data.项目地址: https://gitcode.com/GitHub_Trending/te/telegraf本指南基于 Telegraf 仓库中的plugins/inputs/conntrack输入插件及其配套文档完整讲解如何采集 Linux 内核 Netfilter conntrack连接跟踪模块的统计信息包括表项计数、哈希表容量以及按 CPU 细分的查找、命中、丢弃等计数器。读完本文你将掌握该插件的两种采集机制/proc/net/stat/nf_conntrack统计与/proc/sys/net下的目录/文件扫描、全部配置项与默认值、每个指标的语义以及其底层源码实现与测试验证方式可直接照搬到自己的生产配置中。插件定位与适用平台conntrack 输入插件用于采集 Netfilter 的 conntrack 工具所暴露的连接跟踪统计信息。连接跟踪是 Linux 内核网络栈的核心能力NAT、状态防火墙如 iptables/nftables 的-m state都依赖它因此跟踪表的使用率、溢出与丢弃情况是排查网络问题的重要信号。该插件仅支持 Linux在 conntrack.go 的构建标签为//go:build linux真实实现只在 Linux 上编译在非 Linux 平台由 conntrack_notlinux.go 提供空实现Init()仅记录一条Current platform is not supported警告日志Gather()直接返回不产生任何指标。插件自 Telegraf v1.0.0 起可用分类标签为 system、linux。在混合环境中可以通过同时指定多套目录与文件名超集来兼容不同内核版本不存在的路径会被静默忽略这正是异构环境下的简化之道。两种采集机制插件存在两套并行的数据来源理解它们的区别是正确配置的前提/proc/net/stat/nf_conntrack统计信息当collect选项配置了all或percpu时插件通过 gopsutil 的net.ConntrackStats()读取内核维护的连接跟踪累计计数器查找、命中、新增、删除、丢弃等。/proc/sys/net下的具体文件运行时 conntrack 会把连接跟踪表大小等参数暴露在/proc/sys/net中。依据内核版本不同这些文件可能位于/proc/sys/net/ipv4/netfilter或/proc/sys/net/netfilter文件名前缀分别是ip_或nf_。插件通过dirsfiles两个配置项的组合扫描这些文件。从源码看这两类数据在Gather()中分别处理文件数据写入不带cpu标签的字段conntrack.go统计信息则作为带cpu标签的计数器写入conntrack.go。配置详解插件的完整配置示例如下与 sample.conf 一致由//go:embed直接嵌入源码# Collects conntrack stats from the configured directories and files. # This plugin ONLY supports Linux [[inputs.conntrack]] ## The following defaults would work with multiple versions of conntrack. ## Note the nf_ and ip_ filename prefixes are mutually exclusive across ## kernel versions, as are the directory locations. ## Look through /proc/net/stat/nf_conntrack for these metrics ## all - aggregated statistics ## percpu - include detailed statistics with cpu tag collect [all, percpu] ## User-specified directories and files to look through ## Directories to search within for the conntrack files above. ## Missing directories will be ignored. dirs [/proc/sys/net/ipv4/netfilter,/proc/sys/net/netfilter] ## Superset of filenames to look for within the conntrack dirs. ## Missing files will be ignored. files [ip_conntrack_count,ip_conntrack_max, nf_conntrack_count,nf_conntrack_max]配置项总览配置项类型默认值说明collectstring 数组[all, percpu]决定从/proc/net/stat/nf_conntrack采集哪种粒度的统计。all为聚合统计percpu为按 CPU 的细分统计带cpu标签。只允许这两个取值dirsstring 数组[/proc/sys/net/ipv4/netfilter, /proc/sys/net/netfilter]扫描 conntrack 文件的目录列表不存在的目录会被忽略filesstring 数组[ip_conntrack_count, ip_conntrack_max, nf_conntrack_count, nf_conntrack_max]在上述目录中查找的文件名超集不存在的文件会被忽略关键设计细节默认值由源码维护默认目录与默认文件名定义在 conntrack.go 的dfltDirs与dfltFiles中。setDefaults()conntrack.go仅在用户未配置dirs/files时填充默认值一旦用户显式指定即采用用户的配置。collect取值校验Init()阶段通过internal/choice包的choice.CheckSlice校验collect的取值只接受all与percpuconntrack.go非法值会在启动时直接报错避免带病运行。ip_/nf_前缀互斥同一内核版本只使用一种前缀。源码利用这一点在扫描文件时通过strings.SplitN(file, _, 2)把前缀去掉统一以ip_前缀生成指标名conntrack.go保证不同内核版本输出的字段名一致便于下游统一查询。缺失即忽略os.Stat失败的文件直接跳过conntrack.go因此可以在配置里放心写多套路径作为超集。全局配置该插件与其他插件一样支持 Telegraf 的全局与插件级通用配置例如通过name_prefix、name_override重命名指标通过tags追加自定义标签以及interval、fieldpass/fielddrop、tagpass/tagdrop等过滤与调度设置。完整说明见 docs/CONFIGURATION.md。指标说明文件指标无 cpu 标签扫描dirsfiles得到的字段写入conntrack测量measurement字段类型含义ip_conntrack_countint, countconntrack 表中的条目数ip_conntrack_maxint, sizeconntrack 表的最大容量ip_conntrack_bucketsint, size哈希表大小其中ip_conntrack_buckets需要把nf_conntrack_buckets加入files配置才会被采集若你的内核路径前缀为nf_输出时统一以ip_命名。各字段的详细内核文档说明可参考内核源码树的Documentation/networking/nf_conntrack-sysctl.txt。统计指标带 cpu 标签collect [all]从/proc/net/stat/nf_conntrack聚合而来的计数器字段含义entriesconntrack 表中的条目数searchedconntrack 表查找次数found查找中命中的条目数new新加入且此前未被预期的条目数invalid无法被跟踪的数据包数ignore已经关联到条目的数据包数delete被移除的条目数delete_list被放入 dying 列表的条目数insert插入到列表的条目数insert_failed插入尝试但失败的数量重复条目drop因 conntrack 失败而被丢弃的数据包数early_drop达到maxsize后为腾出空间而丢弃的条目数icmp_errorinvalid的子集因错误而无法跟踪的数据包数expect_new在 expectation 已存在后添加的条目数expect_create新增的 expectation 数expect_delete删除的 expectation 数search_restart因哈希表扩容而重启的 conntrack 表查找次数Tags当collect包含percpu时每个 CPU 输出一组带cpucpu0、cpucpu1……标签的细分统计当不含percpu即只有all时聚合统计的cpu标签取值为all。在源码中这一逻辑非常直观perCPU由metric percpu决定conntrack.go非 perCPU 时cpuTag固定为allperCPU 时则生成cpu%d格式conntrack.go。源码实现剖析整个采集流程集中在Conntrack.Gather()conntrack.go核心逻辑分三段第一段——扫描文件双层循环遍历dirs与files对每个存在的文件读取内容、去除空白、用strconv.ParseFloat解析为浮点值写入ip_前缀的字段。读取失败或解析失败时通过acc.AddError上报但不会中断整体采集。第二段——拉取统计按collect中配置的每个取值all、percpu调用c.ps.NetConntrack(perCPU)。这里的ps字段是psutil.PS接口ps.go默认实现SystemPS直接委托给 gopsutil v4 的net.ConntrackStats(perCPU)ps.go。若返回的统计为空会追加错误conntrack input failed to collect stats。每一组统计通过acc.AddCounter以计数器类型写入携带cpu标签。第三段——兜底判定如果第一段扫描到的文件字段数为 0Gather()直接返回错误conntrack input failed to collect metrics, make sure that the kernel module is loadedconntrack.go提示内核模块未加载是文件扫描无结果的常见原因。注册与生命周期插件在init()中通过inputs.Add(conntrack, ...)注册且作为内部构造参数传入psutil.NewSystemPS()conntrack.go。若使用自定义构建custom builder在 plugins/inputs/all/conntrack.go 中通过空导入完成注册并可用!custom与inputs.conntrack两个构建标签控制是否编译进二进制。测试验证与行为保障conntrack_test.go中的测试用例与上述行为一一对应可作为排查配置问题的参照TestNoFilesFound设置不存在的目录与文件名后断言Gather()返回“kernel module is loaded”错误验证了“全部文件缺失即报错”的兜底逻辑TestDefaultsUsed / TestConfigsUsed在临时目录写入假数据文件验证默认值与显式配置两种路径下都能正确解析数值字段TestConfigsUsed还验证了nf_前缀文件会被重命名为ip_前缀字段输出TestCollectStats / TestCollectStatsPerCpu通过 mock 的psutil.PS接口注入构造的net.ConntrackStat分别验证allcpuall19 个字段与allpercpucpu0/cpu1/all共 53 个字段两种模式下的全部字段与标签输出TestCollectPsSystemInit使用真实的psutil.NewSystemPS()在没有 conntrack 内核模块的环境中会以“Is the conntrack kernel module loaded?”为条件跳过测试验证了插件对内核依赖的容错处理。示例输出基础文件指标不含cpu标签conntrack,hostmyhost ip_conntrack_count2,ip_conntrack_max262144 1461620427667995735启用统计后的完整输出聚合统计带cpuall标签文件指标不带conntrack,cpuall,hostlocalhost delete0i,delete_list0i,drop2i,early_drop0i,entries5568i,expect_create0i,expect_delete0i,expect_new0i,found7i,icmp_error1962i,ignore2586413402i,insert0i,insert_failed2i,invalid46853i,new0i,search_restart453336i,searched0i 1615233542000000000 conntrack,hostlocalhost ip_conntrack_count464,ip_conntrack_max262144 1615233542000000000若配置collect [percpu]则每组统计会按cpucpu0、cpucpu1……拆分输出便于观察多核环境下连接跟踪热点分布。常见问题与排查思路输出为空或报错 “make sure that the kernel module is loaded”通常是 conntrack 内核模块未加载。可先执行ls /proc/net/stat/nf_conntrack与ls /proc/sys/net/netfilter确认对应路径是否存在然后通过modprobe nf_conntrack加载具体模块名因发行版而异。ip_conntrack_*与nf_conntrack_*哪个生效取决于内核版本二者互斥。插件默认已把两套文件名都列入files缺失文件自动忽略无需用户手工判断。想采集nf_conntrack_buckets把nf_conntrack_buckets追加进files或对应ip_前缀版本插件会自动以ip_conntrack_buckets字段输出。统计一直为 0 或数值异常先用conntrack -S命令与/proc/net/stat/nf_conntrack原始内容交叉比对统计字段均为计数器建议在下游如 InfluxDB按non_negative_difference等函数观察增量。参考资源插件文档与配置plugins/inputs/conntrack/README.md、plugins/inputs/conntrack/sample.conf核心实现plugins/inputs/conntrack/conntrack.go、非 Linux 桩实现 plugins/inputs/conntrack/conntrack_notlinux.go单元测试plugins/inputs/conntrack/conntrack_test.go底层依赖psutil 抽象接口 plugins/common/psutil/ps.go 及其 mock plugins/common/psutil/psutiltest/mock_ps.go插件注册入口plugins/inputs/all/conntrack.goTelegraf 通用插件配置过滤、重命名、调度等docs/CONFIGURATION.md【免费下载链接】telegrafAgent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data.项目地址: https://gitcode.com/GitHub_Trending/te/telegraf创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考